← voltar
CVE-2010-3904highsob ataque

CVE-2010-3904

91Vexday Risk Score

Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.

ssvc Actcvss 7.8epss 12%
da publicação à arma0 dias
Publicada no NVD6 de dez.
1ª PoC19 de out.
metasploit20 de out.
CISA KEV+4540d
probabilidade de exploração
12%top 4% das CVEs
exploração observada
simCISA + VulnCheck
6 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2023-06-02

The impacted product is end-of-life and should be disconnected if still in use.

Resumo

Falha de validação de ponteiros no subsistema RDS (Reliable Datagram Sockets) do kernel Linux permite que um usuário local sem privilégios escale para root através de chamadas sendmsg/recvmsg manipuladas. O CVSS de 7.8 é justificado, mas a exploração prática depende de o atacante conseguir vazar um endereço de memória do kernel (kallsyms/System.map) e de o sistema não ter confinamento SELinux ativo — condições que reduzem bastante o alcance real da falha em produção hoje, mesmo estando ela no catálogo KEV da CISA por exploração histórica confirmada.

Detalhamento técnico

A função rds_page_copy_user, em net/rds/page.c, foi introduzida no commit 7875e18e (v2.6.30-rc1) para copiar dados de/para buffers de usuário durante operações de socket RDS. O problema é que ela chama diretamente __copy_to_user_inatomic() e __copy_from_user_inatomic() sem antes validar, via access_ok() ou verificação de faixa de endereço, que o ponteiro fornecido pelo usuário (o endereço base de um iovec passado em sendmsg/recvmsg) realmente pertence ao espaço de endereçamento de usuário. Isso é uma falha clássica de validação de entrada (a Red Hat descreve como ausência de checagem de acesso; o NVD/CISA classificam como CWE-20, Improper Input Validation).

Como o kernel confia no endereço fornecido, um atacante local pode montar um struct iovec cujo campo base apunte para um endereço de memória do kernel, em vez de um buffer de usuário legítimo. Dependendo da direção da operação (sendmsg copia dados do usuário para o kernel; recvmsg copia do kernel para o usuário), isso se traduz em leitura ou escrita arbitrária de memória do kernel a partir de um processo sem privilégios.

O vetor de escalonamento típico é sobrescrever uma estrutura de credenciais do processo (struct cred) ou um ponteiro de função no espaço do kernel, elevando o UID do processo atacante para 0. Para isso o atacante precisa conhecer o endereço-alvo, o que normalmente exige leitura de /proc/kallsyms ou /boot/System.map — arquivos que, em configurações restritivas, não são acessíveis a usuários comuns.

Como é explorada

O pré-requisito mínimo é acesso local a um shell sem privilégios elevados e a capacidade de abrir um socket AF_RDS (família de protocolo 21) via socket(2) — isso não exige capacidade especial além da criação normal de sockets. O atacante então monta chamadas sendmsg/recvmsg com um iovec cujo endereço base é um ponteiro de kernel previamente descoberto, geralmente lendo símbolos do kernel expostos por /proc/kallsyms ou por um mapa de símbolos (System.map) legível.

Red Hat documentou que a exploração é bloqueada na prática pela maioria dos domínios confinados por SELinux (incluindo staff_t e user_t), porque esses perfis normalmente não concedem acesso de leitura ao mapa de símbolos nem permissão "create" em sockets AF_RDS. Isso significa que sistemas com SELinux enforcing e políticas padrão de distribuição têm risco efetivo bem menor do que a nota indica isoladamente.

A falha foi divulgada publicamente por Dan Rosenberg (Virtual Security Research) em 19/10/2010, com PoC e módulo Metasploit disponíveis desde então, o que a tornou trivial de operacionalizar assim que as condições (RDS carregado, kallsyms legível, sem confinamento efetivo) estivessem presentes. A CISA incluiu a CVE no catálogo KEV em maio de 2023 confirmando exploração no mundo real, mas como o kernel afetado é de 2010-2011 e está fora de suporte há anos, a orientação da própria CISA é desconectar/substituir qualquer sistema que ainda rode essas versões, não apenas aplicar patch.

Versões

Afetadas
Linux kernel antes da versão 2.6.36 (segundo a descrição oficial da CVE). A nota VU#362983 do CERT/CC descreve o intervalo como kernels 2.6.30 até 2.6.38-rc8 — divergência que sugere que o fix nem sempre havia sido integrado em todas as branches de desenvolvimento no momento da publicação; a referência mais confiável para o corte é o próprio commit de correção aplicado a partir de 2.6.36.
Corrigidas em
Mainline: kernel 2.6.36 (commit 799c10559d60f159ab2232203f222f18fa3c4a5f). Backports distribuídos: Red Hat Enterprise Linux 5 via RHSA-2010:0792; Red Hat Enterprise Linux 6 via RHSA-2010:0842; openSUSE conforme avisos de outubro/2010, novembro/2010 e fevereiro/2011. Red Hat Enterprise Linux 3, 4 e Red Hat Enterprise MRG não são afetados por não incluírem suporte a RDS.

Como se proteger

A correção definitiva é atualizar para kernel 2.6.36 ou posterior, onde o commit upstream 799c10559d60f159ab2232203f222f18fa3c4a5f adiciona a validação de endereço ausente. Distribuições empacotaram backports específicos: Red Hat Enterprise Linux 5 via RHSA-2010:0792 e RHEL 6 via RHSA-2010:0842; openSUSE publicou avisos equivalentes em outubro/2010, novembro/2010 e fevereiro/2011 para seus respectivos kernels.

Se a atualização não for possível de imediato, o paliativo real e documentado pelo fornecedor é impedir o carregamento do módulo RDS: adicionar 'blacklist rds' em /etc/modprobe.d/blacklist (ou 'alias net-pf-21 off' em um arquivo de modprobe.d), garantindo depois que o módulo não esteja já carregado (lsmod | grep rds). Como reforço, remover CAP_SYS_MODULE do conjunto de capacidades global (via /proc/sys/kernel/cap-bound) impede que o módulo seja carregado sob demanda por um usuário local. Nenhuma dessas medidas corrige a falha de validação em si — apenas eliminam a superfície de ataque enquanto o RDS não for necessário.

Restringir a leitura de /proc/kallsyms (kptr_restrict=2) e manter SELinux/AppArmor enforcing com políticas que neguem criação de sockets AF_RDS a usuários não confiáveis reduz a probabilidade de exploração bem-sucedida, mas não é mitigação garantida — é redução de superfície, não correção de root cause. Como o CVE afeta apenas versões de kernel de 2010-2011, hoje o cenário mais provável não é patch pendente e sim sistema legado fora de suporte; nesse caso, a única ação recomendada pela CISA é desconectar ou substituir o sistema.

Como detectar

Não há assinatura de rede confiável, pois a exploração é inteiramente local — não trafega em interface de rede monitorável por IDS/NIDS convencional. Em nível de host, os sinais úteis são: criação de sockets da família AF_RDS (protocolo 21) por processos não privilegiados (rastreável via auditd com regra em socket(2) e filtro de família de protocolo), leitura de /proc/kallsyms ou /boot/System.map por usuários comuns, carregamento inesperado do módulo rds.ko (lsmod | grep rds) em hosts onde RDS não é usado por aplicações legítimas, e elevação súbita de UID/GID em processos que antes rodavam sem privilégios — sinal característico de exploração de escalonamento via corrupção de struct cred.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
The rds_page_copy_user function in net/rds/page.c in the Reliable Datagram Sockets (RDS) protocol implementation in the Linux kernel before 2.6.36 does not properly validate addresses obtained from user space, which allows local users to gain privileges via crafted use of the sendmsg and recvmsg system calls.
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Produtos afetados
n/a · n/a
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.