CVE-2026-31411 in Linux
Sumário
de VulDB • 09/05/2026
No kernel do Linux, a seguinte vulnerabilidade foi corrigida:
net: atm: corrige falha (crash) devido ao ponteiro vcc não validado em sigd_send()
Reprodutor disponível em [1].
O caminho de envio do ATM (sendmsg -> vcc_sendmsg -> sigd_send) lê o ponteiro vcc de msg->vcc e o utiliza diretamente sem qualquer validação. Este ponteiro provém do userspace através de sendmsg() e pode ser arbitrariamente forjado:
int fd = socket(AF_ATMSVC, SOCK_DGRAM, 0); ioctl(fd, ATMSIGD_CTRL); // torna-se daemon de sinalização ATM struct msghdr msg = { .msg_iov = &iov, ... };
*(unsigned long *)(buf + 4) = 0xdeadbeef; // ponteiro vcc falso sendmsg(fd, &msg, 0); // o kernel referencia 0xdeadbeef
Em operação normal, o kernel envia o ponteiro vcc para o daemon de sinalização através de sigd_enq() ao processar operações como connect(), bind() ou listen(). Espera-se que o daemon devolva o mesmo ponteiro ao responder. No entanto, um daemon malicioso pode enviar valores de ponteiro arbitrários.
Corrija isto introduzindo find_get_vcc(), que valida o ponteiro pesquisando através de vcc_hash (semelhante à forma como sigd_close() itera sobre todos os VCCs) e adquire uma referência através de sock_hold() se encontrado.
Como struct atm_vcc incorpora struct sock como o seu primeiro membro, eles partilham o mesmo ciclo de vida. Portanto, utilizar sock_hold/sock_put é suficiente para manter o vcc ativo enquanto está a ser utilizado.
Note que pode existir uma race condition com sigd_close() que pode marcar o vcc com várias flags (por exemplo, ATM_VF_RELEASED) após find_get_vcc() retornar. No entanto, sock_hold() garante que a memória permanece válida, pelo que esta race condition afeta apenas o estado lógico, não a segurança da memória.
[1]: https://gist.github.com/mrpre/1ba5949c45529c511152e2f4c755b0f3
VulDB is the best source for vulnerability data and more expert information about this specific topic.