przystajnik

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.

Post navigation

20 comments for “Ta krowa jest nadal brudna, czyli Dirty Cow po latach

  1. Van
    25 października, 2016 at 9:23

    Fajna historia 🙂

    Tylko w 2005 Linus już od dawna mieszkał w USA 🙂

  2. christo
    25 października, 2016 at 10:10

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

  3. pavbaranov
    25 października, 2016 at 10:33

    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.

  4. 25 października, 2016 at 20:10

    Ciasteczka FF raczej nie, skrypt jak najbardziej.

  5. 25 października, 2016 at 20:13

    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.

  6. pavbaranov
    25 października, 2016 at 20:48

    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.

  7. Hepita
    26 października, 2016 at 16:21

    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.

  8. Aspa
    26 października, 2016 at 17:26

    ‚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ę 🙂

  9. pavbaranov
    26 października, 2016 at 17:50

    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… 😀

  10. Aspa
    26 października, 2016 at 18:07

    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…

  11. 26 października, 2016 at 18:17

    Ale przyjechał do rodziny na święta 😉

  12. 26 października, 2016 at 18:51

    Ha, no tak to na to nie spojrzałem – szklanka jest do połowy pełna! 🙂

  13. 27 października, 2016 at 18:57

    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. 😉

  14. pavbaranov
    27 października, 2016 at 20:01

    Tylko, że… wypuszczając Anrdroida (bo o nim mowa) nie działo się altruistycznie 🙂

  15. 27 października, 2016 at 20:15

    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.

  16. pavbaranov
    28 października, 2016 at 10:06

    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 🙂

  17. 28 października, 2016 at 16:16

    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. 😉

  18. pavbaranov
    28 października, 2016 at 18:35

    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.

  19. 28 października, 2016 at 19:47

    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 email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Translate »