Dirty COW-haavoittuvuus (CVE-2016-5195, englanniksi dirty + copy-on-write - copy -on-write ) on vakava ohjelmistohaavoittuvuus Linux -ytimessä , joka on ollut olemassa vuodesta 2007 ja joka korjattiin lokakuussa 2016. Sen avulla paikallinen käyttäjä voi nostaa oikeuksiaan kilpailutilanteen vuoksi kopiointi -kirjoitus- mekanismin (COW) toteutuksessa likabittilipulla merkittyjen muistisivujen osalta (muuttunut muisti). [1] [2] [3] Lokakuusta 2016 lähtien haavoittuvuuden aktiivisesta hyväksikäytöstä raportoitiin, kun palvelimia hakkeroitiin[3] .
Ongelma syntyy, kun järjestelmätoimintoon kutsutaan useita samanaikaisia kutsuja madvise(MADV_DONTNEED)ja kirjoitetaan muistisivulle, jota käyttäjällä ei ole muuttaa [4] . Nämä puhelut soitetaan eri säikeistä samaan aikaan.
Kun yritetään kirjoittaa vain luku -muotoiselle COW-sivulle, ydin luo siitä automaattisesti kopion ja kirjoittaa sitten tiedot uuteen kopioon. Alkuperäinen muistisivu säilyy ennallaan. Vaikuttava Linux-ytimen koodi ei tarkistanut, oliko kopio valmis ja onko se edelleen olemassa, ennen kuin aloitettiin kirjoittaminen pyydettyyn muistiosoitteeseen. Koska nämä ovat kaksi peräkkäistä ohjetta, pidettiin epätodennäköisenä, että mikään voisi "vihtyä" niiden välillä.
Kaksi säiettä A ja B luodaan hyödyntämään hyväksikäyttöä . Järjestelmäkutsu madvise(MADV_DONTNEED)säikeessä A kertoo ytimelle, että ohjelma ei koskaan enää käytä määritettyä muistisivua, joten ydin poistaa välittömästi kaikki tämän sivun kopiot (mutta ei estä pääsyä siihen edellisessä osoitteessa!). Kirjoittaminen samalle sivulle säikeestä B johtaa tarpeeseen luoda sen kopio uudelleen. Jos yllä olevat ohjeet suoritetaan samanaikaisesti, on erittäin epätodennäköistä, että sivun kopio poistetaan heti sen luomisen jälkeen, mutta ennen kirjoitustoimintoa. Tällä epäsuotuisalla hetkellä ydin kirjoittaa tiedot alkuperäiselle vain luku -muistisivulle, ei sen kopiolle. Kun pyyntöjä toistetaan useaan otteeseen eri säikeistä, syntyy kilpailu ja epätodennäköinen tapahtuma, jonka seurauksena hyväksikäyttö saa oikeuden muuttaa alkuperäistä vain luku -sivua. Yleensä prosessi kestää enintään muutaman sekunnin [5] .
Edellytyksenä haavoittuvuuden hyödyntämiselle on tiedoston tai muistipaikan lukuoikeus. Tämä tarkoittaa, että paikallinen käyttäjä ei voi suoraan korvata järjestelmätiedostoja, jotka eivät ole luettavissa, kuten /etc/shadow , mikä mahdollistaisi pääkäyttäjän salasanan muuttamisen . Haavoittuvuus sallii kuitenkin mielivaltaisen koodin kirjoittamisen mihin tahansa suoritettavaan tiedostoon, mukaan lukien kaikki suid - tiedostot. Siten käyttäjä saa mahdollisuuden "korvaaa" järjestelmätiedostot, joita hän ajaa pääkäyttäjänä. On esimerkiksi mahdollista korvata "vaaraton" suid ping -tiedosto järjestelmäpäätteellä, joka toimii pääkäyttäjänä.
Vaikka oikeuksien eskalointivirhe on toteutettu paikallisille käyttäjille, etähyökkääjät voivat käyttää sitä yhdessä muiden hyväksikäyttötoimintojen kanssa , jotka mahdollistavat oikeudettoman koodin etäsuorittamisen. Tämä yhdistelmä johtaa etäjärjestelmän täydelliseen hakkerointiin. [2] DirtyCOW-haavoittuvuuden hyväksikäyttö itsessään ei jätä jälkeä järjestelmälokiin. [3] [1]
Haavoittuvuus sai merkinnän CVE CVE-2016-5195, se on alustavasti arvioitu CVSS-asteikolla 6,9-7,8 pistettä 10:stä [6] . Virhe on ollut ytimessä vuodesta 2007 (versio 2.6.22) [1] ja sitä voidaan käyttää useissa jakeluissa, mukaan lukien Android [7] . Tästä haavoittuvuudesta on tullut Linux-ytimen pisin olemassa oleva kriittinen virhe [8] . Vain yksittäisissä jakeluissa (RHEL5/6) yhden vakiohyödyntämisen toiminta on mahdotonta, koska "proc mem" -rajapinta on poistettu käytöstä [9] . Linus Torvalds myönsi yrittäneensä korjata tätä kilpailua jo elokuussa 2005, mutta tämä korjaustiedosto oli huonolaatuinen ja peruutettiin lähes välittömästi S390 -arkkitehtuurin ongelmien vuoksi [10] .
Tietoturvatutkija Phil Oester havaitsi haavoittuvuuden hyväksikäytön analysoidessaan hakkerointia yhdellä palvelimellaan. Tallentamalla kaiken HTTP-liikenteen useiden vuosien ajan hän pystyi hankkimaan hyväksikäytön ja analysoimaan sen toimintaa. Hyökkäys on käännetty GCC-kääntäjän versiolla 4.8 (julkaistu vuonna 2013), mikä saattaa viitata siihen, että haavoittuvuutta on hyödynnetty menestyksekkäästi useiden vuosien ajan. Suljettu keskustelu ja korjauksen valmistelu käytiin 13. lokakuuta 2016 [11] [12] . 18. lokakuuta julkaistiin korjaustiedosto vian korjaamiseksi; Linus ei kuitenkaan ilmoittanut, että tämä korjaus on tärkeä ja korjaa haavoittuvuuden. Tämä arkaluonteisten tietojen piilottaminen ja haavoittuvuuksien paljastamiseen liittyvät ongelmat vain vaikeuttavat käyttäjien ja jakelijoiden elämää, tätä käytäntöä kritisoitiin LWN:ssä [13] . 19.-20. lokakuuta RedHat julkaisi tiedot haavoittuvuudesta; lanseerattiin myös erityinen verkkosivusto [11] , joka kertoo haavoittuvuudesta ja tarjoaa erilaisia hyväksikäyttöjä, twitter-tilin ja verkkokaupan, jossa myydään haavoittuvuuden logolla varustettuja t-paitoja ja matkamuistoja.
Haavoittuvuuden korjaaminen vaatii ytimen päivityksen. Haavoittuvuus korjattiin ytimen versioissa 4.8, 4.7, 4.4 ja muissa [14] , korjaus on uuden FOLL_COW- lipun lisääminen (7 koodiriviä vaihdettu) [10] . Useat GNU/Linux-jakelut, kuten Debian , Ubuntu, RedHat ja muut, ovat jo ilmoittaneet korjatuista ydinpaketteista [15] . Samanaikaisesti on olemassa lukuisia haavoittuvia laitteita ja järjestelmiä sirulla, joiden päivitykset valmistaja on lopettanut, eivätkä ne välttämättä ole kolmansien osapuolten saatavilla omistettujen lisäosien ja GPL -rikkomusten vuoksi . Haavoittuvuutta voidaan käyttää esimerkiksi pääkäyttäjän oikeuksien hankkimiseen lähes kaikissa Android-laitteissa [16] [17] , käyttöjärjestelmäversioissa Android 6 :een [18] asti ja Android 7:n aiemmissa versioissa.
Joulukuussa 2017 esiteltiin "Huge Dirty COW" -versio (CVE-2017-1000405), joka liittyi samanlaiseen virheeseen suurten sivujen (2 Mt) käsittelyssä [19] .