← voltar
CVE-2014-3153highsob ataque

CVE-2014-3153

100Vexday Risk Score

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

ssvc Actcvss 7.8epss 37%
da publicação à arma47 dias
Publicada no NVD7 de jun.
1ª PoC+47d
metasploit3 de mai.
CISA KEV+2909d
probabilidade de exploração
37%top 2% das CVEs
exploração observada
simCISA + VulnCheck
20 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2022-06-15

Apply updates per vendor instructions.

Resumo

Falha no subsistema futex do kernel Linux que permite a um usuário local sem privilégios escalar para execução de código em ring 0, geralmente terminando em root. Ficou famosa como base do Towelroot, ferramenta de root para dispositivos Android, e é citada por pesquisadores da época como uma das falhas de kernel Linux mais graves da década por funcionar mesmo dentro de sandboxes restritos, já que futex é primitiva usada pelo pthread da glibc e costuma estar acessível.

Detalhamento técnico

O bug está em kernel/futex.c, na função futex_requeue, usada pela operação FUTEX_REQUEUE_PI. A chamada recebe dois endereços de futex (uaddr1 e uaddr2) e deveria garantir que são distintos antes de mover ('requeue') um waiter da fila do primeiro para a fila do segundo com semântica PI (priority inheritance). O código não validava essa condição: um processo podia invocar FUTEX_REQUEUE_PI passando o mesmo endereço para uaddr1 e uaddr2 (ou endereços que mapeiam para a mesma chave interna, no caso de futexes compartilhados/shared).

Como é explorada

O vetor é 100% local: o atacante precisa apenas de capacidade de executar syscalls arbitrárias como usuário sem privilégios — não requer configuração especial, serviço de rede exposto ou CVE encadeada de acesso inicial. Isso inclui contextos de sandbox restritos (containers, sandboxes de browser/app), porque futex é usado internamente pela implementação de mutex da glibc e normalmente não é bloqueado por seccomp em configurações comuns da época.

A exploração pública demonstrada consiste em usar FUTEX_REQUEUE_PI com uaddr1 igual a uaddr2 (ou chaves colidentes) para deixar uma estrutura de waiter em estado inconsistente na pilha do kernel; syscalls subsequentes manipulam essa estrutura antes que ela seja processada na função de wake-up, corrompendo estado interno do kernel. Dependendo da técnica, o resultado varia de kernel panic (DoS) a corrupção controlada que leva à execução de código em modo kernel — é essa segunda via que foi usada no Towelroot e em PoCs públicas, incluindo módulo Metasploit.

Há exploração ativa confirmada (a falha está no catálogo KEV da CISA), e existe PoC pública amplamente disponível, o que torna a barreira de exploração baixa para quem tem acesso a shell não privilegiado em kernel vulnerável.

Versões

Afetadas
Kernel Linux até 3.14.5 (conforme a descrição oficial da CVE); a falha existe desde a introdução do requeue PI em versões anteriores do futex.c.
Corrigidas em
Corrigido no upstream pelo commit e9c243a5a6de0be8e584c604d353412584b592f8. Backports específicos foram publicados por distribuições via seus próprios canais de erratas (Oracle Linux: ELSA-2014-0771, ELSA-2014-3037, ELSA-2014-3038, ELSA-2014-3039; openSUSE: anúncios de segurança de junho de 2014) — a versão exata do pacote corrigido varia por distro/branch e deve ser confirmada no advisory correspondente listado nas referências.

Como se proteger

A correção oficial (commit e9c243a5a6de0be8e584c604d353412584b592f8, upstream) adiciona a checagem que faltava: recusa (retorna -EINVAL) quando uaddr1 == uaddr2, e complementa com uma segunda verificação baseada nas chaves internas do futex (match_futex) para cobrir o caso de futexes compartilhados onde endereços diferentes podem mapear para a mesma chave. O patch cobre tanto futex_requeue quanto futex_wait_requeue_pi.

A correção definitiva é atualizar o kernel para uma versão que inclua esse commit — distribuições enterprise (Oracle Linux, openSUSE, entre outras, conforme os errata ELSA-2014-0771/3037/3038/3039 e os anúncios de segurança do openSUSE) fizeram backport para seus kernels suportados na época; a versão exata de correção depende do branch/distro e deve ser conferida no advisory correspondente, já que não há aqui uma tabela consolidada de números de versão por distribuição.

Como paliativo quando atualização imediata não é viável: restringir acesso à syscall futex via seccomp-bpf (bloqueando ou filtrando FUTEX_REQUEUE_PI) reduz a superfície, mas quebra funcionalidade de qualquer processo que dependa de mutexes PI da glibc — custo alto e não é solução recomendada como substituto do patch. Não existe mitigação de configuração 'leve' (sysctl, montagem, etc.) documentada nas fontes consultadas; o requeue via futex é um mecanismo interno de sincronização, não algo desabilitável de forma granular sem tocar em seccomp.

Como detectar

Não há assinatura de rede, já que o vetor é inteiramente local via syscalls (futex com FUTEX_REQUEUE_PI). Em ambientes com auditoria de syscalls (auditd/eBPF), monitorar chamadas futex com a flag FUTEX_REQUEUE_PI onde uaddr1 e uaddr2 coincidem ou apontam para a mesma página pode indicar tentativa de exploração, mas isso exige instrumentação prévia — não é algo visível em logs padrão do sistema. Kernel panics inexplicados em hosts multiusuário ou em sandboxes que executam código não confiável são um sinal indireto a investigar retroativamente.

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 futex_requeue function in kernel/futex.c in the Linux kernel through 3.14.5 does not ensure that calls have two different futex addresses, which allows local users to gain privileges via a crafted FUTEX_REQUEUE command that facilitates unsafe waiter modification.
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.