CVE-2016-5195
Prioriza la corrección. Ella está bajo explotación confirmada por CISA y tiene prueba de concepto pública.
Apply updates per vendor instructions.
Resumen
Dirty COW é uma condição de corrida (race condition) no subsistema de memória do kernel Linux que permite a um usuário local sem privilégios escrever em mapeamentos de memória marcados como somente-leitura, incluindo binários com bit SUID e arquivos de sistema como /etc/passwd. O bug existe desde aproximadamente o kernel 2.6.22 (2007) e foi explorado ativamente antes da divulgação pública em outubro de 2016 — está confirmado no catálogo KEV da CISA. Não é uma falha remota: exige execução local prévia, mas o impacto é escalonamento completo de privilégios até root em praticamente qualquer distribuição Linux não corrigida.
Detalle técnico
A falha está na lógica de quebra de copy-on-write (COW) do kernel, no caminho de tratamento de falhas de página (page fault) — a descrição oficial aponta mm/gup.c, mas o mecanismo envolve a interação entre get_user_pages(), do_wp_page() e do_cow_fault() em mm/memory.c. Quando uma escrita ocorre em uma página privada somente-leitura, o kernel dispara uma falha de página tipo COW: aloca uma nova página, marca-a como 'dirty' mas mantém a PTE como read-only, e retorna sinalizando que a operação deve ser refeita (retry). Nesse intervalo entre a criação da cópia COW e a nova tentativa de escrita, existe uma janela onde outra thread pode desfazer o mapeamento com madvise(MADV_DONTNEED), forçando o kernel a tratar a próxima tentativa de acesso como uma leitura, e não como a escrita original — fazendo com que o get_user_pages() acabe escrevendo diretamente na página de cache de página compartilhada com o arquivo original em disco, em vez da cópia privada COW.
Cómo se explota
O exploit usado in the wild (e replicado em todas as PoCs públicas do repositório dirtycow) mapeia em memória (mmap) um arquivo somente-leitura ao qual o atacante tem permissão de leitura mas não de escrita — tipicamente um binário SUID root ou /etc/passwd — e dispara duas threads em loop: uma escrevendo repetidamente via /proc/self/mem (ou via ptrace(PTRACE_POKEDATA)) no offset mapeado, e outra chamando madvise(MADV_DONTNEED) sobre o mesmo mapeamento em ciclo contínuo. Vencendo a corrida, a escrita atinge a página de cache compartilhada em disco em vez de uma cópia privada, alterando permanentemente o conteúdo do arquivo apesar de ele ser read-only para o usuário.
Versiones
Cómo protegerse
A correção definitiva é atualizar o kernel para uma versão que inclua o commit 19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619, que introduz a flag FOLL_COW para validar corretamente se uma página já passou por COW usando o bit dirty da PTE, eliminando a janela de corrida. A correção foi incorporada ao kernel mainline 4.8.3 e backportada por todas as distribuições enterprise (RHEL via RHSA-2016:2098/2105/2106/2118/2120/2124/2126/2127/2128/2132/2133/2107, openSUSE via os três advisories de outubro/2016 listados, e outras). Reboot é necessário após a atualização — não existe hotpatch permanente sem reiniciar o kernel em produção normal.
Cómo detectar
Não há assinatura de rede, já que a exploração é inteiramente local — nenhum tráfego passa pela borda. Em sistemas com auditoria de syscalls habilitada (auditd/SystemTap), o padrão de sinal é a alta frequência de chamadas madvise(MADV_DONTNEED) intercaladas com escritas em /proc/self/mem ou chamadas ptrace(PTRACE_POKEDATA) sobre o mesmo processo, em loop apertado — mas isoladamente cada uma dessas syscalls é legítima e comum, então o sinal só é confiável observando o padrão de corrida (alta taxa, mesmo alvo, mesmo processo) e não a syscall isolada. A mitigação temporária via SystemTap divulgada pela Red Hat funciona interceptando ptrace com request 0xfff, o que também serve como ponto de instrumentação para detecção, mas não é um indicador forense retroativo — não deixa rastro em log padrão de sistemas sem auditoria explicitamente configurada antes do ataque.