CrowdStrike fiyaskosu: Suçlu Null Pointer

Adanali

Member


  1. CrowdStrike fiyaskosu: Suçlu Null Pointer

BT güvenlik sağlayıcısı CrowdStrike'ın hatalı bir güncellemesi, dünya çapındaki şirketlerin ve yetkililerin Windows bilgisayarlarının Cuma sabahı çökmesine neden oldu. Havalimanları, bankalar, mağazalar, hastaneler ve diğer birçok tesis etkilendi ve bazılarının işleyişi durdurulmak zorunda kaldı.


Duyuru




Şimdi, örneğin X'ten Zack Vorhies'in yaptığı gibi, Ölümün Mavi Ekranı (BSOD) bellek dökümüne ilişkin ilk adli tıp analizleri ortaya çıkıyor. Araştırması, sorunun CrowdStrike'ın CSAgent.sys dosyasındaki sözde bir boş işaretçi hatasına işaret ettiğini gösteriyor. Kodun geçersiz bir bellek adresine (0x9c veya 156) erişmeye çalıştığı anlaşılıyor.








19 Temmuz 2024'te CrowdStrike tarafından otomatik olarak yüklenen hatalı bir güncelleme, dünya çapında BT kesintilerine neden oldu. Burada konuyla ilgili önemli makaleler bulacaksınız:







Vorhies örnek olarak C++'ı gösterdi. 0x0 adresi genellikle geçerli bir nesnenin bulunmadığını belirtmek için boş işaretçi olarak kullanılır. Programcılar nesnelere veya onların özelliklerine erişmeden önce daima boş işaretçileri kontrol etmelidir. Bu tür kontrolün tipik bir örneği şudur:


string* p = get_name();
if (p == NULL) { print("Could not get name"); }


Bu durumda, p işaretçisine erişmeye çalışmadan önce işaretçinin boş olup olmadığını kontrol eder. CrowdStrike örneğinde böyle bir kontrolün eksik olduğu görülüyor. Sorunu daha iyi anlamak için basit yapıya sahip bir örnek ele alalım:


struct Obj {
int a;
int b;
};


Böyle bir nesneye yönelik bir işaretçi oluşturursanız şöyle görünebilir:

Obj* obj = new Obj();

Nesnenin bellek adresinde başladığını varsayalım 0x9030. Bu basit veri yapısında bir nesnenin adresi ve ilk üye değişkeni C++'dakiyle aynıdır. Bu nedenle üye adresleri (her biri C++ işlevi kullanılarak belirlenir) std::addressof()):


obj: 0x9030
obj->a: 0x9030 + 0x0
obj->b: 0x9030 + 0x4


Ancak işaretçi boşsa (Obj* obj = NULL), tüm üye değişkenlerin bellek adresleri belleğin başlatılmamış alanlarına işaret eder. Şimdi bu boş nesnenin bir üyesine erişmeye çalışırsanız (ör. std::cout << obj->a;), bu programın çökmesine yol açar. Nedeni: Üye değişkenlerin bellek adresleri başlatılmamış belleğe işaret ediyor. Örnek çağrıda şöyle görünür:


~ % ./null
obj: 0x9030
obj->a: 0x9030 + 0x0
obj->b: 0x9030 + 0x4
zsh: segmentation fault ./null


CrowdStrike örneğinde kod 0x9c adresine erişmeye çalıştı ve benzer bir hata olduğunu gösterdi. Bu ayrıcalıklı erişime sahip bir sistem sürücüsü olduğundan, bu hata sistemin tamamen çökmesine neden oldu. Sürücü, bilgisayar her başlatıldığında yüklendiğinden, etkilenen bilgisayarlar yeniden başlatma döngüsünde kalıyordu ve Güvenli Mod kullanılarak manuel olarak onarılmaları gerekiyordu.

Bu olay, özellikle güvenlik sürücüleri gibi sistem açısından kritik yazılımlar için dikkatli programlamanın ve kapsamlı testlerin büyük önemini vurgulamaktadır. Gelecekte benzer olayları önlemek için CrowdStrike'ın muhtemelen kalite güvence süreçlerini gözden geçirmesi ve iyileştirmesi gerekecektir. Ayrıca, bu kadar kritik bir yazılıma yönelik bir güncellemenin neden bu tür durumlarda normal olacağı gibi kademeli bir dağıtım yoluyla değil de dünya çapında milyonlarca bilgisayara paralel olarak dağıtıldığı da açık değil.

Fiyaskoya katkıda bulunan şey, CrowdStrike'ın, programcıların bir işaretçiyi kullanmadan önce geçerli olup olmadığını açıkça kontrol etmesini gerektiren C++ gibi bir programlama dili kullanmış olabileceği gerçeğiydi. Bu kontrolün unutulması durumunda, boş işaretçi referansları (geçersiz bir hafıza alanına erişim) meydana gelebilir. Rust gibi modern programlama dilleri, sıkı derleme zamanı kontrolleri yoluyla bu tür hataları önler.







“İşaretçilere Giriş” dersi için yeni materyal: Boş işaretçi sorununu analiz eden TikTok yorumu


(Resim: TikTok tartışması)



Kalite güvencesi eksikliği mi?


Eğer böylesine temel bir programlama hatası üretim güncellemesinde ortaya çıkarsa, bu durum CrowdStrike'ın kalite güvencesine pek iyi yansımayacaktır. Bu durumda, bu tür hataları erken bir aşamada tespit edebilecek test mekanizmalarının eksikliği söz konusu olacaktır. CrowdStrike'ın kendisi de davayla ilgili endişelerini sürdürüyor ve şu ana kadar bunu yalnızca “mantıksal yanılgı” olarak nitelendirdi.

CrowdStrike CEO'su George Kurtz daha önce McAfee'de CTO'ydu. Ayrıca 2010 yılında dünya çapındaki Windows XP bilgisayarlarını felce uğratan hatalı bir güncelleme de vardı. Her ne kadar etkileri o dönemde bu kadar dramatik olmasa da Kurtz'un o dönemdeki deneyiminden ders almış olması beklenebilir.



Etkilenenler tazminatı düşünmeli


Etkilenen müşteriler artık tazminat sorunuyla karşı karşıya. Havayolları, hastaneler ve perakendecilerin yalnızca Cuma günkü kesintilerden milyonlarca dolar zarar gördüğüne inanılıyor. Buna hasarın onarılmasının maliyeti de eklenir. Uçaklarını kaçıran ve otel rezervasyonlarını değiştirmek zorunda kalan tatilciler gibi dolaylı olarak etkilenenler, uğradıkları zararın bedelini artık kimin ödeyeceğini merak edecek. Yolcuların tazminat taleplerini kontrol etmek için olası bir iletişim noktası Kuzey Ren-Vestfalya Tüketici Merkezinin Flugärger uygulamasıdır.

CrowdStrike, hatanın nasıl oluştuğu ve şirketin bundan ne gibi sonuçlar çıkaracağı konusunda hoş olmayan sorularla karşı karşıya kalacak. C++'tan uzaklaşıp modern programlama dillerinin yanı sıra daha sıkı kalite güvence önlemleri kullanmak minimum düzeyde olacaktır.

Bu yalnızca Windows'un sorunu değil


Sorunun yalnızca Windows'u ilgilendirdiğini düşünenler yanılıyor. Benzer bir şey Nisan ayında Linux'ta da yaşandı: 19 Nisan'da CrowdStrike, Falcon-sensor yazılımı için Debian Stable Linux dağıtımıyla uyumlu olmayan bir güncelleme yayınladı. Hacker News'in bildirdiğine göre bu durum, birden fazla web sitesi ve bulut sunucusundaki bir şehir teknoloji laboratuvarındaki tüm sunucuların çökmesine neden oldu. Hata, disk günlükleri kontrol edilerek keşfedildi. Manuel olarak kaldırma, makinelerin yeniden başlatılmasına izin verdi, ancak yeniden yükleme, yeniden çökmelere neden oldu. CrowdStrike'ın hatayı doğrulaması birkaç gün sürdü ve belirli Debian sürümünün test matrisine dahil edilmediğini keşfetti.

Bu tür sorunları önlemek için Hacker News makalesinin yazarı, diğer şeylerin yanı sıra, çökmeleri en aza indirmek amacıyla CrowdStrike yazılımının Linux altında çekirdek modu yerine kullanıcı modunda (eBPF) çalıştırılmasını öneriyor.

Görünüşe göre etkilenen sadece Debian değil. Haziran ayının başında Falcon sensörü, Red Hat müşterileri için de Çekirdek Paniğine neden oldu çünkü süreç var olmayan bir hafıza alanına erişmek istiyordu.







Falcon sensörü yalnızca Windows altında sorunlara neden olmakla kalmıyor; Haziran ayında kullanıcılar Red Hat kapsamında hafıza erişim hataları bildirdiler.


(Resim: Red Hat Müşteri Portalı)





Güncelleme

20 Temmuz 2024,

22.20


Saat




Bazı forum kullanıcıları kod örneklerinin yanlış varsayımlara dayandığına dikkat çekti: bunları okunabilirlik açısından gerçekçi olmayan temel 0x9030 ile ilgili yayınlanan analizden almıştık. Bazı yerlerin dilini de revize ettik. Dikkatli okuyuculara çok teşekkürler!

Bu arada, makalenin başında bağlantısı verilen “CrowdStrike: Microsoft rakamları sağlıyor, nedene yönelik araştırmalar devam ediyor” makalesinin bellek hatasının nedeni hakkında daha iyi bir açıklama sağladığına dair kanıtlar birikti.






(vza)
 
Üst