← back
CVE-2016-5195highunder attackCWE-362

CVE-2016-5195

100Vexday Risk Score

Prioritize patching. It under exploitation confirmed by CISA and has a public proof of concept.

ssvc Actcvss 7epss 83%
from disclosure to weapon0 days
Published on NVDNov 10
1st PoCOct 19
CISA KEV+1939d
exploitation probability
83%top 1% of all CVEs
observed exploitation
yesCISA + VulnCheck
127 public exploit(s)
Action required by CISAfederal deadline: 2022-03-24

Apply updates per vendor instructions.

Summary

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.

Technical detail

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.

How it’s exploited

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.

Versions

Affected
Kernel Linux desde aproximadamente 2.6.22 (2007) até versões anteriores a 4.8.3, presente em praticamente todas as distribuições Linux e produtos baseados em kernel Linux vigentes em 2016 (RHEL 5/6/7, RHEL MRG 2, OpenShift Online v2, RHEV-H/RHV-H, openSUSE, dispositivos Juniper com JunOS baseado em Linux, entre outros).
Fixed in
Kernel mainline 4.8.3 e posteriores (commit 19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619). Backports específicos por distribuição: RHEL 7 via RHSA-2016:2098 (kernel) e RHSA-2016:2110 (kernel-rt); RHEL 7.1 EUS via RHSA-2016:2118; RHEL 6 via RHSA-2016:2105 e RHSA-2016:2106 (6.7 EUS), RHSA-2016:2120/2128/2132/2133 (AUS 6.5/6.6/6.2/6.4); RHEL 5 via RHSA-2016:2124, RHSA-2016:2126 (5.9 AUS), RHSA-2016:2127 (5.6 AUS); Red Hat Enterprise MRG 2 via RHSA-2016:2107; openSUSE via os advisories opensuse-security-announce de outubro/2016 (msg00034, msg00035, msg00036); Juniper via JSA10770, JSA10774 e JSA10807.

How to protect

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.

How to detect

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.

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.
Race condition in mm/gup.c in the Linux kernel 2.x through 4.x before 4.8.3 allows local users to gain privileges by leveraging incorrect handling of a copy-on-write (COW) feature to write to a read-only memory mapping, as exploited in the wild in October 2016, aka "Dirty COW."
CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
Affected products
n/a · n/a
public PoCs found127 VexDay Proof
exploitdbVexDay Proofwww.exploit-db.com/exploits/40616exploitdbVexDay Proofwww.exploit-db.com/exploits/40611exploitdbVexDay Proofwww.exploit-db.com/exploits/40839exploitdbVexDay Proofwww.exploit-db.com/exploits/40847exploitdbwww.exploit-db.com/exploits/40838unverifiedgithubgithub.com/timwr/CVE-2016-51951008githubgithub.com/firefart/dirtycow937githubgithub.com/scumjr/dirtycow-vdso512githubgithub.com/gbonacini/CVE-2016-5195341githubgithub.com/r1is/CVE-2022-0847282githubgithub.com/hyln9/VIKIROOT271githubgithub.com/Brucetg/DirtyCow-EXP141githubgithub.com/DavidBuchanan314/cowroot32githubgithub.com/aishee/scan-dirtycow16githubgithub.com/xlucas/dirtycow.cr13githubgithub.com/whu-enjoy/CVE-2016-519510githubgithub.com/pgporada/ansible-role-cve10githubgithub.com/imust6226/dirtcow9githubgithub.com/sideeffect42/DirtyCOWTester7githubgithub.com/jas502n/CVE-2016-51957githubgithub.com/oleg-fiksel/ansible_CVE-2016-5195_check6githubgithub.com/talsim/root-dirtyc0w5githubgithub.com/droidvoider/dirtycow-replacer4githubgithub.com/arttnba3/CVE-2016-51953githubgithub.com/LinuxKernelContent/DirtyCow3githubgithub.com/esc0rtd3w/org.cowpoop.moooooo3githubgithub.com/DanielEbert/CVE-2016-51952githubgithub.com/LiEnby/PSSRoot2githubgithub.com/FloridSleeves/os-experiment-42githubgithub.com/0x3n19m4/CVE-2016-51951githubgithub.com/ASRTeam/CVE-2016-51951githubgithub.com/arbll/dirtycow1githubgithub.com/titanhp/Dirty-COW-CVE-2016-5195-Testing1githubgithub.com/th3-5had0w/DirtyCOW-PoC1githubgithub.com/TotallyNotAHaxxer/CVE-2016-51951githubgithub.com/malinthag62/The-exploitation-of-Dirty-Cow-CVE-2016-51951githubgithub.com/ndobson/inspec_CVE-2016-51950githubgithub.com/KasunPriyashan/Y2S1-Project-Linux-Exploitaion-using-CVE-2016-5195-Vulnerability0githubgithub.com/sribaba/android-CVE-2016-51950githubgithub.com/acidburnmi/CVE-2016-5195-master0githubgithub.com/vinspiert/scumjrs0githubgithub.com/pardhu045/linux-privilege-escalation0githubgithub.com/passionchenjianyegmail8/scumjrs0githubgithub.com/h1n4mx0/Research-CVE-2016-51950githubgithub.com/1equeneRise/scumjr90githubgithub.com/fei9747/CVE-2016-51950githubgithub.com/xpcmdshell/derpyc0w0githubgithub.com/h1n4mx0z/Research-CVE-2016-51950githubgithub.com/EDLLT/CVE-2016-5195-master0githubgithub.com/ZhiQiAnSecFork/DirtyCOW_CVE-2016-51950githubgithub.com/sakilahamed/Linux-Kernel-Exploit-LAB0githubgithub.com/ASUKA39/CVE-2016-51950githubgithub.com/KosukeShimofuji/CVE-2016-51950githubgithub.com/ldenevi/CVE-2016-51950githubgithub.com/Samuel-G3/Escalamiento-de-Privilegios-usando-el-Kernel-Exploit-Dirty-Cow0githubgithub.com/mohammadamin382/dirtycow-lab0githubgithub.com/MarioAlejos-Cs/dirtycow-lab0githubgithub.com/ramahmdr/dirtycow0githubgithub.com/elhaddadalaa788-alt/kernel-exploit-dirtycow-project-subm0githubgithub.com/theo543/OSDS_Paper_CVE-2016-51950githubgithub.com/maur0amaya/Escalamiento-de-Privilegios-usando-el-Kernel-Exploit-Dirty-Cow0githubgithub.com/rauljvc8/Exploit-Dirty-Cow0githubgithub.com/GonzaBot/kernel-exploit-dirtycow0githubgithub.com/endgtryna/lenovo-a1000g-mt8317-A412_01_09_130907-kernel-3.4.0-root-cve-2016-51950githubgithub.com/zakariamaaraki/Dirty-COW-CVE-2016-5195-0githubgithub.com/shanuka-ashen/Dirty-Cow-Explanation-CVE-2016-5195-0githubgithub.com/dulanjaya23/Dirty-Cow-CVE-2016-5195-0githubgithub.com/KaviDk/dirtyCow0githubgithub.com/istenrot/centos-dirty-cow-ansible0vulncheckvulncheck.com/xdb/31a0aa69cf4cunverifiedvulncheckvulncheck.com/xdb/9125928f7603unverifiedvulncheckvulncheck.com/xdb/5c3c3322474dunverifiedvulncheckvulncheck.com/xdb/b81caecd21a0unverifiedvulncheckvulncheck.com/xdb/f2204b41dd21unverifiedvulncheckvulncheck.com/xdb/b05a18448174unverifiedvulncheckvulncheck.com/xdb/3c59fbbe4941unverifiedvulncheckvulncheck.com/xdb/277a1d4bf8a2unverifiedvulncheckvulncheck.com/xdb/10e422584e38unverifiedvulncheckvulncheck.com/xdb/2f99e74166aeunverifiedvulncheckvulncheck.com/xdb/cd262e482af1unverifiedvulncheckvulncheck.com/xdb/9ab30651140cunverifiedvulncheckvulncheck.com/xdb/c702394e39a9unverifiedvulncheckvulncheck.com/xdb/0f54259ef0a3unverifiedvulncheckvulncheck.com/xdb/26759f64e421unverifiedvulncheckvulncheck.com/xdb/5a4311b57888unverifiedvulncheckvulncheck.com/xdb/0eca479a0f12unverifiedvulncheckvulncheck.com/xdb/a84cc3ab3f48unverifiedvulncheckvulncheck.com/xdb/26aa72694109unverifiedvulncheckvulncheck.com/xdb/91934bafa64funverifiedvulncheckvulncheck.com/xdb/9fe4e31741bfunverifiedvulncheckvulncheck.com/xdb/6b7028face39unverifiedvulncheckvulncheck.com/xdb/bbc108f0e2d3unverifiedvulncheckvulncheck.com/xdb/a73a45d1e2d2unverifiedvulncheckvulncheck.com/xdb/a87c371b3f3funverifiedvulncheckvulncheck.com/xdb/01d749b64ad1unverifiedvulncheckvulncheck.com/xdb/72416db5c445unverifiedvulncheckvulncheck.com/xdb/25a7d419158eunverifiedvulncheckvulncheck.com/xdb/52f1724c803aunverifiedvulncheckvulncheck.com/xdb/56a0d9175e82unverifiedvulncheckvulncheck.com/xdb/770693b60910unverifiedvulncheckvulncheck.com/xdb/8caaebd2c120unverifiedvulncheckvulncheck.com/xdb/18b29d667585unverifiedvulncheckvulncheck.com/xdb/77f940bbe0a4unverifiedvulncheckvulncheck.com/xdb/421bc3afa1a0unverifiedvulncheckvulncheck.com/xdb/177f3ff1c724unverifiedvulncheckvulncheck.com/xdb/f9efe15626b2unverifiedvulncheckvulncheck.com/xdb/e26232ee0a29unverifiedvulncheckvulncheck.com/xdb/996eaef54533unverifiedvulncheckvulncheck.com/xdb/edf32f0cb046unverifiedcve_referencepacketstormsecurity.com/files/139277/Kernel-Live-Patch-Security-Notice-LSN-0012-1.htmlunverifiedcve_referencepacketstormsecurity.com/files/139286/DirtyCow-Linux-Kernel-Race-Condition.htmlunverifiedcve_referencepacketstormsecurity.com/files/139287/DirtyCow-Local-Root-Proof-Of-Concept.htmlunverifiedcve_referencepacketstormsecurity.com/files/139922/Linux-Kernel-Dirty-COW-PTRACE_POKEDATA-Privilege-Escalation.htmlunverifiedcve_referencepacketstormsecurity.com/files/139923/Linux-Kernel-Dirty-COW-PTRACE_POKEDATA-Privilege-Escalation.htmlunverifiedcve_referencepacketstormsecurity.com/files/142151/Kernel-Live-Patch-Security-Notice-LSN-0021-1.htmlunverifiedcve_referencewww.exploit-db.com/exploits/40611/unverifiedcve_referencewww.exploit-db.com/exploits/40616/unverifiedcve_referencewww.exploit-db.com/exploits/40839/unverifiedcve_referencewww.exploit-db.com/exploits/40847/unverifiedvulncheckvulncheck.com/xdb/4275f34a5224unverifiedvulncheckvulncheck.com/xdb/3259770b0ff4unverifiedvulncheckvulncheck.com/xdb/bbdb7a7979daunverifiedvulncheckvulncheck.com/xdb/4d43856ec877unverifiedvulncheckvulncheck.com/xdb/94c11c970613unverifiedvulncheckvulncheck.com/xdb/d1c17c081d03unverifiedvulncheckvulncheck.com/xdb/db0cfa39ee2eunverifiedvulncheckvulncheck.com/xdb/cecbca9ee49funverified
⚠ Public resources, to assess the exposure of systems you control or are authorized to test. Test only with authorization.