CrowdStrike wysłał poprawnie dystrybuowaną aktualizację, która ujawniła błąd odczytu pamięci w kernelu Windows
19 lipca 2024 r. CrowdStrike opublikował aktualizację konfiguracji Rapid Response Content dla sensorów Falcon na Windows. Wadliwa kombinacja danych i kodu spowodowała próbę użycia 21. parametru wejściowego tam, gdzie dostarczono tylko 20, prowadząc do out-of-bounds memory read. Ponieważ sensor działał w jądrze systemu, błąd kończył się BSOD-em, a automatyczny globalny rollout sprawił, że problem dotknął ogromnej liczby komputerów jednocześnie. To jeden z najbardziej spektakularnych przykładów, jak mały błąd walidacji danych zyskuje ogromny skutek przez uprzywilejowany kontekst i skalę dystrybucji.
Aktualizacja nie była pełnym nowym sterownikiem
Problem pojawił się w dynamicznie dostarczanej konfiguracji contentu wykorzystywanej przez istniejący sensor. To ważne, bo organizacje mogą rygorystycznie testować binarną wersję programu, a jednocześnie traktować dane konfiguracyjne jako bezpieczniejsze. W systemach z interpreterami konfiguracja może jednak uruchamiać złożoną ścieżkę kodu.
Kod oczekiwał więcej danych, niż dostał
Finalna analiza CrowdStrike opisywała sytuację, w której kod inspekcji próbował skorzystać z 21. parametru, podczas gdy instancja contentu dostarczała 20. Brak odpowiedniego sprawdzenia zakresu prowadził do odczytu pamięci poza dozwolonym obszarem.
Kernel zmienił zwykły crash w awarię całego komputera
Gdy aplikacja użytkownika crashuje, system operacyjny często może ją po prostu zamknąć. Falcon Sensor działa na niskim poziomie, więc błąd pamięci występował w kontekście jądra Windows. Windows reagował bugcheckiem i restartem, aby nie kontynuować pracy z potencjalnie uszkodzonym stanem.
Automatyczna dystrybucja zsynchronizowała awarię
Security software musi szybko otrzymywać nowe sygnatury i reguły. Ta szybkość jest częścią wartości produktu. W tym przypadku sprawiła jednak, że wadliwy content został dostarczony ogromnej liczbie hostów w krótkim czasie. System aktualizacji stał się multiplierem blast radius.
Recovery był trudny, bo część hostów wpadała w pętlę bootowania
Komputer musiał usunąć problematyczny plik przed pełnym uruchomieniem sensora. W wielu środowiskach wymagało to wejścia do trybu recovery, a przy szyfrowaniu dysku również dostępu do kluczy BitLocker. Centralnie zarządzana flota nagle wymagała pracy na pojedynczych maszynach.
Testowanie contentu musi mieć taką samą rangę jak testowanie kodu
Po incydencie CrowdStrike zapowiedział m.in. dodatkowe testy, staged rollout i większą kontrolę nad publikacją contentu. Lekcja jest szeroka: wszystko, co może zmienić zachowanie uprzywilejowanego komponentu, powinno przechodzić bezpieczny pipeline niezależnie od tego, czy formalnie nazywa się „kodem”, czy „konfiguracją”. Staged deployment contentu ma tu szczególne znaczenie: niewielka grupa maszyn o zróżnicowanej konfiguracji może pełnić funkcję canary. Jeżeli wykryje kernel crash, dystrybucja powinna zatrzymać się automatycznie, zanim update dotrze do całej populacji.
Dlaczego kernelowy software bezpieczeństwa jest szczególnie ryzykowny
Program antywirusowy i EDR chce obserwować procesy, pliki i zachowanie systemu bardzo wcześnie, więc często działa z wysokimi uprawnieniami i blisko jądra. Taka pozycja daje widoczność potrzebną do wykrywania zagrożeń, ale usuwa izolację, która chroni system przed zwykłą aplikacją. Błąd w przeglądarce może zamknąć kartę; błąd sterownika może doprowadzić do bugchecku całego Windowsa. To dlatego kernel drivers przechodzą rygorystyczne testy, podpisywanie i polityki kompatybilności. Incydent CrowdStrike dodał jeszcze drugi wymiar: komponent o najwyższych uprawnieniach był sterowany dynamicznie dostarczanym contentem. Bezpieczna architektura musi więc traktować również parser tego contentu jak granicę zaufania: każdy parametr powinien być sprawdzony przed użyciem, niezależnie od tego, że pochodzi z własnej infrastruktury producenta. W tego typu produktach szczególnie przydatne są też invariant checks w runtime. Jeśli interpreter spodziewa się 21 parametrów, może przed wejściem do krytycznej ścieżki sprawdzić długość tablicy i odrzucić content zamiast ufać, że generator zawsze zachowa kontrakt.