← back
CVE-2014-3153highunder attack

CVE-2014-3153

100Vexday Risk Score

Patch now. It under exploitation confirmed by CISA and has a working public exploit.

ssvc Actcvss 7.8epss 37%
from disclosure to weapon47 days
Published on NVDJun 7
1st PoC+47d
metasploitMay 3
CISA KEV+2909d
exploitation probability
37%top 2% of all CVEs
observed exploitation
yesCISA + VulnCheck
20 public exploit(s)
Action required by CISAfederal deadline: 2022-06-15

Apply updates per vendor instructions.

Summary

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.

Technical detail

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).

How it’s exploited

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.

Versions

Affected
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.
Fixed in
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.

How to protect

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.

How to detect

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.

Researched and written with AI from the vendor advisory and public analysis, with the sources above. Always confirm the fixed version in the official advisory before acting.
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
Affected products
n/a · n/a
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.