Wpis z mikrobloga

Krótkie podsumowanie akcji z #crowdstrike z zeszłego tygodnia na podstawie wiarygodnych informacji znalezionych w internetach

1) Crowdstrike to firma amerykańska firma zajmująca się cyberbezpieczeństwem. Celują w rynek enterprise. Dostarczają własne sterowniki, które są wykonywane w Windows kernel mode.
2) Poza sterownikiem, częścią ich delivery są różne definicje wirusów, malware i cholera wie czego.
3) Problem spowodowała właśnie aktualizacja tych definicji, nie samego drivera. Otóż okazało się, że driver jest dość głupi i po prostu skanuje wybraną lokalizację w poszukiwaniu definicji. Jeśli znajdzie odpowiednie pliki, to próbuje je załadować. Nie jest jasne, jakie checki wykonuje przed załadowaniem, ale nie spodziewam się tutaj szału.
4) Plik z nowo dodaną definicją okazał się pusty, zawierał same zera. Nie zatrzymało to jednak drivera, który na jego podstawie najprawdopodobniej próbował wyliczyć jakiś adres. Oczywiście, nie miał szans zrobić tego poprawnie, dlatego ten adres był bezpośrednio z pupy - wartość, którą widziałem w jednym tłicie to 0xc9. A po wyliczeniu tego adresu, driver próbował się dobrać do pamięci pod nim. Nie mogło to się skończyć dobrze.
Side note - skoro adres nie był NULLem, czy innym None, Rustowe unwrap chyba raczej tutaj by nie pomogło (ale się nie znam, więc mogę się mylić).
5) Około 8500000 maszyn na całym świecie zostało dotkniętych tym problemem. Naprawa nie jest skomplikowana, ale wymaga *fizycznego* dostępu do każdej maszyny ( ͡º ͜ʖ͡º)

Moje komentarze
- Wczytywanie plików na YOLO, bez odpowiedniej weryfikacji w kernel mode to nie tylko potężna luka bezpieczeństwa, ale objaw nieskończonej głupoty. Sam driver podobno był certyfikowany przez Microsoft, ale nie wiem na czym dokładnie taka certyfikacja polega i czy sprawdzali kod.
- Crowdstrike najprawdopodobniej zdecydował się zaimplementować mechanizm wczytywania różnych definicji z zewnętrznych plików, żeby ominąć konieczność certyfikacji drivera po każdym update. Taka przyjemność pewnie zajmuje trochę czasu i do najtańszych nie należy.
- Windows teoretycznie posiada mechanizm wywalania spartaczonych driverów. No ale posiada też coś takiego jak "boot install drivers" - drivery, które koniecznie muszą być załadowane, żeby system wstał. Oczywiście, Crowdstrike w swej mądrości oznaczył swój driver jako "boot install" xDDD
- Jedynym sensownym mechanizmem obrony przed takimi akcjami jest podział na dwie partycję - instalujemy update na partycji A i próbujemy się z niej zbootwać. Jeśli to się nie uda, bootujemy się z partycji B, która nie zawiera update.
- Podobno Microsoft zamiast dawać możliwość uruchamiania kodu 3rdparties w kernel mode, chciał udostępnić API związane z cyberbezpieczeństwem. Ale UE się wtrąciła, twierdząć że byłaby to praktyka monopolistyczna. Także xD

Moje pytania
- Dlaczego Crowdstrike wypuścił pusty plik?
- Dlaczego nie dodali żadnych sanity checków podczas ładowania plików, a potem Microsoft to przyklepał?
- Czy ten driver został poprawiony? Czy wrzucenie pustego pliku w odpowiednie miejsce na dysku nadal wywali cały system?

#programowanie #programista15k #pracait
  • 14
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@groman43: Bardzo fajny opis przyczyny, skutków i wniosków ostatniej wtopy Crowdstrike'a pojawił się na blogu Pragmatic Engineer: https://newsletter.pragmaticengineer.com/p/the-biggest-ever-global-outage-lessons

Ciekawy jest fragment mówiący o tym, że Microsoft chciał ograniczyć dostęp 3rd party toolom do kernela już w 2006 roku, ale regulacja UE wymusiła udostępnienie dostępu na takim samym poziomie jak ma soft Microsoftu, żeby nie blokować konkurencji ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@groman43: Przeciez tam jest tak samo jak w każdej firmie, która pisze crudy. Trzeba zamknąć sprint i elo. Może na poziomie CI coś było zwalone, może na poziomie deploymentu. Nie wiadomo.
  • Odpowiedz
@groman43: masz trochę nieaktualne informacje. Po pierwsze kilka dni temu CrowdStrike zdementował informacje o tym że bezpośrednią przyczyną był plik pełny zer. Zawartość pliku nie miała znaczenia poza tym że była niepoprawna. Sterownik nie załadował tego pliku i tych zer do pamięci. Plik nie zawierał też kodu, więc nie są prawdziwe spekulacje co to niektórzy pisali że nastąpił skok do tych zer i próba ich wykonania.

Po drugie to był
  • Odpowiedz
  • 0
Po pierwsze kilka dni temu CrowdStrike zdementował informacje o tym że bezpośrednią przyczyną był plik pełny zer. Zawartość pliku nie miała znaczenia poza tym że była niepoprawna.


@Krolik: Link? Poza tym, w obecnej sytuacji nie wierzę w nic, co mówi CS. A po necie latają hexdumpy z tym plikiem pełne zer.

Jak najbardziej Rust by taki błąd wyłapał - nie skompilowałoby się wrzucenie nulla do tablicy gdzie nie powinno być
  • Odpowiedz
@groman43: tylko że w Rust jak zrobisz tablicę struktur to nie wrzucisz do niej nulla, podobnie nie odczytasz niezainicjowanej wartości. A jeżeli struktury będziesz wczytywał z pliku to na 100% dostaniesz coś w rodzaju Result lub Option i próba wrzucenia takiej wartości będzie niezgodnością typów. Więc będziesz musiał jawnie napisać obsługę tego przypadku i przekształcić najpierw Result w jakiś inny typ.
  • Odpowiedz
@groman43: Hinduizacja IT. Wszędzie jakieś Pradeepy, Kumary i Deepaki, wszystko outsorcowane offshore jak to się tam ładnie mówi po "korpomowsku". Nie powiem jaka firma i jaki klient ale znam jednych takich którzy mają ELEKTROWNIE ATOMOWE w USA i też ousourcują kuźwa wszystko. Fizyczne serwery on-prem zastąpili najtańszą wirtualizacją z hinduskim supportem.

Wyobrażacie sobie, że elektrownią atomową w Polsce zarządza jakaś guwnokorporacja która w ramach oszczędności całe IT łącznie z infrastrukturą
  • Odpowiedz
- Jedynym sensownym mechanizmem obrony przed takimi akcjami jest podział na dwie partycję - instalujemy update na partycji A i próbujemy się z niej zbootwać. Jeśli to się nie uda, bootujemy się z partycji B, która nie zawiera update.


@groman43: Przy istnieniu b-tree file systems jak np. btrfs to brzmi jak rozwiązanie z epoki kamienia łupanego. W takim btrfs po prostu robisz snapshot przed aktualizacją, do którego możesz wrócić w
  • Odpowiedz
@groman43:

Jedynym sensownym mechanizmem obrony przed takimi akcjami jest podział na dwie partycję - instalujemy update na partycji A i próbujemy się z niej zbootwać. Jeśli to się nie uda, bootujemy się z partycji B, która nie zawiera update.

Oprogramowanie antywirusowe nigdy nie powinno mieć uprawnień na poziomie kernela. Nieważne co firmy security gadają. Wystarczy że jakiś chinol czy rusek zatrudni się w takiej firmie i puści jakiegoś sprytnego backdoora.
  • Odpowiedz
- Dlaczego nie dodali żadnych sanity checków podczas ładowania plików, a potem Microsoft to przyklepał?


@groman43: Jak wygląda taka certyfikacja przez Microsoft? Mają dostęp do kodu i robią review?
Bo jeśli nie, to mogliby jedynie zweryfikować to jakimś zestawem testów - i tutaj już zależy czy faktycznie były tam same zera (dość oczywisty test) czy jakaś inna magiczna zawartość.
  • Odpowiedz
Podobno Microsoft zamiast dawać możliwość uruchamiania kodu 3rdparties w kernel mode, chciał udostępnić API związane z cyberbezpieczeństwem. Ale UE się wtrąciła, twierdząć że byłaby to praktyka monopolistyczna. Także xD


@groman43: no nie do końca tak. MS chciał dać takie API, ale Defender dalej miałby możliwość działania w kernel modę. EU powiedziała, że tak nie może być (bo to *jest* praktyka monopolistyczna). Więc mogą dać takie API, ale Defender też tego
  • Odpowiedz