Dirty COW-sårbarheden ( CVE-2016-5195, fra engelsk dirty + copy-on-write - copy -on-write ) er en alvorlig softwaresårbarhed i Linux-kernen , som har eksisteret siden 2007 og blev rettet i oktober 2016. Det giver en lokal bruger mulighed for at ophøje deres privilegier på grund af en race-tilstand i implementeringen af Copy-on-write (COW) mekanismen for hukommelsessider markeret med Dirty bit flag (ændret hukommelse). [1] [2] [3] Fra oktober 2016 blev der rapporteret om aktiv udnyttelse af sårbarheden, når servere blev hacket [3] .
Problemet opstår, når der er mange samtidige opkald til en systemfunktion madvise(MADV_DONTNEED)og skrivning til en hukommelsesside, som brugeren ikke har adgang til at ændre [4] . Disse opkald foretages fra forskellige tråde på samme tid.
Når du prøver at skrive til en skrivebeskyttet COW-side, opretter kernen automatisk en kopi af den og skriver derefter dataene til en ny kopi. Den originale hukommelsesside forbliver intakt. Den berørte Linux-kernekode kontrollerede ikke, om kopien var komplet og stadig eksisterer, før du begyndte at skrive til den anmodede hukommelsesadresse. Da disse er to på hinanden følgende instruktioner, blev det anset for usandsynligt, at noget kunne "viges" mellem dem.
To tråde A og B oprettes for at bruge udnyttelsen . Et systemkald madvise(MADV_DONTNEED)på tråd A fortæller kernen, at programmet aldrig kommer til at bruge den angivne hukommelsesside igen, så kernen sletter straks alle kopier af denne side (men nægter ikke adgang til den på den tidligere adresse!). At skrive til den samme side fra tråd B fører til behovet for at genskabe sin kopi. Hvis ovenstående instruktioner udføres på samme tid, er det meget usandsynligt, at en kopi af siden slettes umiddelbart efter den er oprettet, men før skriveoperationen. I dette uheldige øjeblik vil kernen skrive data til den originale skrivebeskyttede hukommelsesside og ikke til dens kopi. Med flere gentagelser af anmodninger fra forskellige tråde opstår der et kapløb, og en usandsynlig hændelse vil med sikkerhed indtræffe, som et resultat af hvilket udnytteren opnår retten til at ændre den originale skrivebeskyttede side. Normalt tager processen ikke mere end et par sekunder [5] .
En forudsætning for at udnytte sårbarheden er læseadgang til filen eller hukommelsesplaceringen. Dette betyder, at den lokale bruger ikke direkte kan overskrive systemfiler, der ikke er læsbare, såsom /etc/shadow , hvilket ville tillade, at superbruger- adgangskoden ændres . Men sårbarheden tillader, at vilkårlig kode kan skrives til enhver eksekverbar fil, inklusive enhver suid -fil. Dermed får brugeren mulighed for at "erstatte" de systemfiler, som han kører som root. For eksempel bliver det muligt at erstatte den "harmløse" suid ping -fil med en systemterminal, der kører som root.
Selvom privilegie-eskaleringsfejlen er implementeret for lokale brugere, kan fjernangribere bruge den i forbindelse med andre udnyttelser , der tillader fjernudførelse af uprivilegeret kode. Denne kombination vil føre til en komplet hacking af fjernsystemet. [2] Udnyttelse af DirtyCOW-sårbarheden i sig selv efterlader ingen spor i systemlogfiler. [3] [1]
Sårbarheden fik betegnelsen CVE CVE-2016-5195, den er foreløbig estimeret på CVSS-skalaen til 6,9-7,8 point ud af 10 [6] . Fejlen har været til stede i kernen siden 2007 (version 2.6.22) [1] og kan bruges på en lang række distributioner, inklusive Android [7] . Denne sårbarhed er blevet den længste eksisterende kritiske fejl i Linux-kernen [8] . Kun i enkelte distributioner (RHEL5/6) er driften af en af standardudnyttelsen umulig på grund af deaktivering af "proc mem"-grænsefladen [9] . Linus Torvalds indrømmede, at han allerede havde gjort forsøg på at rette dette løb i august 2005, men denne patch var af dårlig kvalitet og blev annulleret næsten øjeblikkeligt på grund af problemer med S390- arkitekturen [10] .
Udnyttelsen af sårbarheden blev opdaget af sikkerhedsforsker Phil Oester, mens han analyserede et hack på en af hans servere. Ved at registrere al HTTP-trafik i flere år var han i stand til at opnå en udnyttelse og analysere dens drift. Udnyttelsen blev kompileret med GCC-kompileren version 4.8 (frigivet i 2013), hvilket kan indikere, at sårbarheden er blevet udnyttet med succes i flere år. En lukket diskussion og udarbejdelse af en rettelse fandt sted den 13. oktober 2016 [11] [12] . Den 18. oktober blev en patch introduceret til at rette fejlen; Linus angav dog ikke, at denne rettelse er vigtig og adresserer sårbarheden. Denne fortielse af følsomme oplysninger og problemer med afsløring af sårbarheder komplicerer kun livet for brugere og distributører, denne praksis blev kritiseret i LWN [13] . Den 19.-20. oktober blev information om sårbarheden offentliggjort af RedHat; der blev også lanceret en særlig hjemmeside [11] , som fortæller om sårbarheden og tilbyder forskellige udnyttelser, en twitterkonto og en netbutik, der sælger t-shirts og souvenirs med sårbarhedens logo.
Løsning af sårbarheden kræver en kerneopdatering. Sårbarheden blev rettet i kerneversionerne 4.8, 4.7, 4.4 og andre [14] , rettelsen er tilføjelsen af et nyt FOLL_COW flag (7 linjer kode ændret) [10] . En række GNU/Linux-distributioner, såsom Debian , Ubuntu, RedHat og andre, har allerede annonceret patchede kernepakker [15] . Samtidig er der adskillige sårbare enheder og systemer-på-en-chip, hvor udgivelsen af opdateringer er færdiggjort af producenten og muligvis ikke er tilgængelige for tredjeparter på grund af proprietære tilføjelser og overtrædelser af GPL . For eksempel kan en sårbarhed bruges til at få root-adgang på næsten alle Android-enheder [16] [17] , med OS-versioner op til og med Android 6 [18] og med tidligere versioner af Android 7.
I december 2017 blev en "Huge Dirty COW"-variant (CVE-2017-1000405) introduceret, forbundet med en lignende fejl i håndteringen af store sider (2 MB) [19] .