· kaynak Hacker News – Front Page (native)
OpenBSD root açığı, orijinal BSD'den kalma 37 yıllık paylaşımlı bellek hatasına bağlandı
Calif güvenlik araştırmacıları, orijinal BSD kaynaklarına kadar yaklaşık 37 yıl geriye uzanan paylaşımlı bellek sayacı hatasını, errata 026 ve 018 ile düzeltilen bir sınır dışı kernel yazımıyla birleştirerek OpenBSD üzerinde yerel bir root açığına dönüştürdü.

Calif'teki güvenlik araştırmacıları, şu anda Hacker News ana sayfasında yer alan bir yazıda, orijinal BSD kaynak ağacına kadar yaklaşık 37 yıl geriye izlenebilen bir kernel hatasına dayanan, OpenBSD üzerinde root'a yerel yetki yükseltme yöntemi gösterdi. Calif'e göre exploit, OpenBSD'nin KARL kernel yeniden bağlama mekanizması, SMAP ve SMEP etkin olsa bile ve ayrı bir bilgi sızdırma açığına dayanmadan bir root shell'e ulaşıyor.
Uzun bellekli 16 bitlik sayaç
Calif'e göre sorunun kökeni, orijinal BSD'den devralınan kodda işaretli 16 bitlik short olarak tanımlanmış paylaşımlı bellek ekleme sayacı. Paylaşımlı bellek ekleme kayıtlarını canlı tutarken sürekli process fork ederek saldırgan, bu sayacı 32.767 olan maksimum değerinin ötesine itip negatife sarmasını sağlayabiliyor. Araştırmacılar, 127 SysV paylaşımlı bellek segmentini eşleyerek, munmap() ile serbest bırakarak ve 259 process fork ederek -32.643 değerine ulaştıklarını bildiriyor.
Bu tamsayı taşması daha sonra bir race condition üzerinden use-after-free'a dönüştürülebiliyor: bir process IPC_RMID çağırırken bir yardımcı process boyut karışıklığına düşmüş paylaşımlı bellek segmentini bağlıyor. Calif, sorunu önerilen yamalarla birlikte OpenBSD'ye bildirdi; taşma errata 026 ile giderildi, zincirde kullanılan ayrı sınır dışı kernel yazımı ise errata 018 ile düzeltildi.
Sayaç sarmasından kernel kod çalıştırmaya
Yazı tüm süreci adım adım anlatıyor. Araştırmacılar, yeni sayfaların ne zaman ayrıldığını izlemek için sysctl(KERN_MALLOCSTATS) metriklerini (kb_total ve kb_totalfree gibi) izlerken kernel heap'ini düzenlediler. Ardından IP socket tahsislerini hizaladılar ve IP_MULTICAST_TTL değerini varsayılan dışı 2'ye ayarlayarak, son kelimesinde iki 16 bitlik sayacı barındıran kalıcı 16 baytlık struct ip_moptions yapısının tahsis edilmesini zorladılar. Koşullu -1 sınır dışı yazımı bu yapıya yönlendirildi ve hem mevcut hem de maksimum üyelik alanlarının üzerine yazıldı. Socket kapatıldığında grup üyeleri geziliyor ve kendi kendine referans veren page table eşlemesini iki kez değiştiren atomik azaltmalar tetikleniyor; bu da eşlemeyi kullanıcı erişilebilir durumdan supervisor erişilebilir duruma geçirerek SMAP ve SMEP'i etkisiz kılıyor. Oradan, öngörülebilir bir kernel işaretçisinin üzerine yazmak kernel kod çalıştırma sağladı; ardından araştırmacılar paylaşımlı bellek muhasebesini temizlediler ve işaretçiyi geri yükleyerek bir root shell elde ettiler.
Calif nihai sonucu bir write-what-where primitive'i olarak tanımlıyor: yazma bir TAILQ_REMOVE'dan geliyordu, "what" supervisor erişilebilir yapılan bir userland eşlemesiydi ve "where" öngörülebilir bir kernel işaretçi konumuydu.
KARL tahsis edicileri kapsamıyor
Araştırma ayrıca OpenBSD'nin yeniden bağlama mekanizmasının neden saldırıyı durdurmadığını açıklıyor. KARL, kernel binary'sindeki fonksiyon ve veri adreslerini rastgeleleştiriyor; ancak Calif'e göre kernel'ın bellek tahsis edicileri deterministik kalıyor: ne boot sırasındaki tahsis edici ne de best-fit tahsis edici taban adresini rastgeleleştirdiğinden, erken boot tahsisleri aynı donanımda yeniden başlatmalarda öngörülebilir konumlara düşüyor. Bu adreslerde tahsis edilen ve fonksiyon işaretçileri içeren yapılar cazip hedefler haline geliyor. Örneğin exploit, lo0 ve enc0 ioctl işleyicilerini güvenilir biçimde hedef aldı; birini kontrol akışı için üzerine yazarken diğerini özgün değeri geri yüklemek için kullandı.
Önerilen sağlamlaştırma
Errata düzeltmelerinin ötesinde Calif birkaç savunma hattı çiziyor. Safe-unlinking, unlink yazımlarını gerçekleştirmeden önce çift bağlantılı liste değişmezlerini doğrulayıp ihlal durumunda abort veya panic yapardı; FreeBSD ve NetBSD bunu sys/queue.h içinde zaten uyguluyor. Kendi kendine referans veren PTE eşleme yuvası boot sırasında rastgeleleştirilebilir ya da PTE salt okunur işaretlenip yalnızca değiştirilirken yazılabilir yapılabilir. Kernel tahsis edicisi, taban adresi ve runtime tahsis sırası rastgeleleştirilerek deterministik olmaktan çıkarılabilir. Compiler savunmaları da işin içinde: Calif, array bounds sanitizer'ı FreeBSD'ye bir release derlemesi azaltımı olarak önerdi ve bunun yakalayacağı 21 sorunu özel olarak bildirdi; bazıları yerel yetki yükseltme etkisine sahip. Yaklaşan Alloc Tokens özelliği ise işaretçi içeren tahsisleri izole ederek heap taşmalarının ve use-after-free istismarının etkisini körükleyebilir.
Neden önemli
OpenBSD, itibarını onlarca yıldır kaynak kod denetimi, güvensiz API değişimi, yetki ayrımı ve bellek güvenliği azaltımları üzerine kurdu; ne var ki bu hata, atal BSD kodundan devralınarak 37 yıl boyunca hepsinden sağlam çıktı. Bu, en çok denetlenen kod tabanlarının bile uzun ömürlü hatalar taşıyabileceğinin ve miras kodun sessiz bir yük olmaya devam ettiğinin ciddi bir hatırlatması. Çalışma ayrıca tek bir katmanı, örneğin kernel binary'sinin kendisini sağlamlaştırmanın, başka yerlerdeki deterministik alt sistemler tarafından etkisiz bırakılabileceğini gösteriyor; dolayısıyla savunmaların tahsis edicileri ve veri yapılarını da kapsaması gerekiyor. Calif, yapay zeka destekli açık keşfinin hata bulma maliyetini düşürdüğüne dikkat çekerken, hataları tek tek yamalamak yerine tüm istismar primitive sınıflarını etkisizleştirmek daha kalıcı bir strateji gibi görünüyor. OpenBSD operatörleri için acil eylem nettir: errata 026 ve 018'i uygulayın.
- #openbsd
- #kernel-security
- #privilege-escalation
- #integer-overflow
- #exploit