Zranitelnost Dirty COW (CVE-2016-5195, z angličtiny dirty + copy-on-write - copy -on-write ) je závažná softwarová zranitelnost v jádře Linuxu , která existuje od roku 2007 a byla opravena v říjnu 2016. Umožňuje místnímu uživateli zvýšit svá oprávnění kvůli sporu při implementaci mechanismu kopírování při zápisu (COW) pro stránky paměti označené příznakem Dirty bit (změněná paměť). [1] [2] [3] Od října 2016 bylo hlášeno aktivní zneužití zranitelnosti při napadení serverů [3] .
Problém nastává, když existuje mnoho současných volání systémové funkce madvise(MADV_DONTNEED)a zápisu na paměťovou stránku, ke které uživatel nemá přístup ke změně [4] . Tato volání jsou prováděna z různých vláken současně.
Při pokusu o zápis na stránku COW pouze pro čtení jádro automaticky vytvoří její kopii a poté zapíše data do nové kopie. Původní paměťová stránka zůstane nedotčena. Dotčený kód linuxového jádra nezkontroloval, zda byla kopie dokončena a zda stále existuje, před zahájením zápisu na požadovanou adresu paměti. Vzhledem k tomu, že se jedná o dvě po sobě jdoucí instrukce, bylo považováno za nepravděpodobné, že by se mezi nimi mohlo něco „spojit“.
Pro použití exploitu jsou vytvořena dvě vlákna A a B. Systémové volání madvise(MADV_DONTNEED)ve vlákně A říká jádru, že program již nikdy nepoužije zadanou paměťovou stránku, takže jádro okamžitě smaže všechny kopie této stránky (ale nezakáže k ní přístup na předchozí adrese!). Zápis na stejnou stránku z vlákna B vede k nutnosti znovu vytvořit jeho kopii. Pokud jsou výše uvedené instrukce provedeny současně, je velmi nepravděpodobné, že by byla kopie stránky odstraněna ihned po jejím vytvoření, ale před operací zápisu. V tomto nepříznivém okamžiku jádro zapíše data na původní stránku paměti pouze pro čtení, nikoli na její kopii. Při vícenásobném opakování požadavků z různých vláken dochází k závodu a jistě dojde k nepravděpodobné události, v důsledku čehož exploit získá právo změnit původní stránku pouze pro čtení. Obvykle proces netrvá déle než několik sekund [5] .
Předpokladem pro zneužití zranitelnosti je přístup pro čtení k souboru nebo paměťovému umístění. To znamená, že místní uživatel nemůže přímo přepsat systémové soubory, které nejsou čitelné, jako je /etc/shadow , což by umožnilo změnit heslo superuživatele . Tato chyba zabezpečení však umožňuje zapsat libovolný kód do libovolného spustitelného souboru, včetně jakéhokoli souboru suid . Uživatel tak získá možnost „nahradit“ systémové soubory, které spouští jako root. Například je možné nahradit „neškodný“ soubor suid ping systémovým terminálem, který poběží jako root.
Přestože je chyba eskalace oprávnění implementována pro místní uživatele, vzdálení útočníci ji mohou použít ve spojení s dalšími exploity , které umožňují vzdálené spuštění neprivilegovaného kódu. Tato kombinace povede k úplnému hacknutí vzdáleného systému. [2] Využití zranitelnosti DirtyCOW samo o sobě nezanechává žádnou stopu v systémových protokolech. [3] [1]
Zranitelnost získala označení CVE CVE-2016-5195, na škále CVSS je předběžně odhadována na 6,9-7,8 bodů z 10 [6] . Chyba se v jádře vyskytuje od roku 2007 (verze 2.6.22) [1] a lze ji použít na velkém množství distribucí včetně Androidu [7] . Tato chyba zabezpečení se stala nejdéle existující kritickou chybou v jádře Linuxu [8] . Pouze v jednotlivých distribucích (RHEL5/6) je provoz jednoho ze standardních exploitů nemožný z důvodu deaktivace rozhraní „proc mem“ [9] . Linus Torvalds přiznal, že se již pokusil opravit tento závod v srpnu 2005, ale tento patch byl nekvalitní a byl téměř okamžitě zrušen kvůli problémům na architektuře S390 [10] .
Zneužití této chyby zabezpečení objevil bezpečnostní výzkumník Phil Oester při analýze hacku na jednom ze svých serverů. Zaznamenáním veškerého HTTP provozu po několik let se mu podařilo získat exploit a analyzovat jeho fungování. Exploit byl zkompilován pomocí kompilátoru GCC verze 4.8 (vydáno v roce 2013), což může naznačovat, že zranitelnost byla úspěšně využívána již několik let. Uzavřená diskuse a příprava opravy proběhla 13. října 2016 [11] [12] . 18. října byla představena oprava, která chybu opravila; Linus však neuvedl, že tato oprava je důležitá a řeší tuto chybu zabezpečení. Toto zatajování citlivých informací a problémy s odhalováním zranitelností pouze komplikují život uživatelům a distributorům, tato praxe byla kritizována v LWN [13] . Ve dnech 19. až 20. října zveřejnil RedHat informace o zranitelnosti; byl spuštěn také speciální web [11] , který o zranitelnosti hovoří a nabízí různé exploity, twitterový účet a internetový obchod s tričky a suvenýry s logem zranitelnosti.
Oprava této chyby zabezpečení vyžaduje aktualizaci jádra. Chyba zabezpečení byla opravena ve verzích jádra 4.8, 4.7, 4.4 a dalších [14] , opravou je přidání nového příznaku FOLL_COW (změněno 7 řádků kódu) [10] . Řada distribucí GNU/Linuxu, jako je Debian , Ubuntu, RedHat a další, již oznámila záplatované balíčky jádra [15] . Zároveň existuje řada zranitelných zařízení a systémů na čipu, u nichž je vydávání aktualizací ukončeno výrobcem a nemusí být dostupné třetím stranám z důvodu proprietárních doplňků a porušení GPL . Zranitelnost lze například použít k získání přístupu root na téměř všech zařízeních Android [16] [17] , s verzemi OS až po Android 6 [18] včetně a se staršími verzemi Androidu 7.
V prosinci 2017 byla představena varianta „Huge Dirty COW“ (CVE-2017-1000405), spojená s podobnou chybou při manipulaci s velkými stránkami (2 MB) [19] .