CVE-2024-21762, FortiOS'un SSL VPN bileşenindeki bir dışarıdan sınırlı yazma hatasıdır. Bishop Fox, yamayı analiz etti ve chunked transfer encoding kullanan HTTP isteklerinin işlenmesindeki çoklu değişiklikleri keşfetti. Zafiyet için çökme kanıtını geliştirmenin yanı sıra, yamalı firmware kullanan bir sistemin davranış değişikliklerini güvenli bir şekilde test etmek için bir yöntem belirledik.
Chunked Transfer Encoding Nedir?
HTTP/1.1, HTTP istekleri için taşıma seviyesi kodlama şemalarını belirlemeyi sağlayan Transfer-Encoding başlığını tanıttı. Chunked transferlar, bilinmeyen boyutlardaki HTTP yüklerini bilinen uzunluklara sahip bir dizi parça kullanarak göndermeyi veya iletmeyi sağlar. Parça boyutu onaltılık olarak kodlanır ve CRLF ile sınırlanır. Son parça, 0 bayt uzunluğunda belirtilir. Örneğin, "Merhaba, Dünya!" dizesini şu şekilde gönderebiliriz:
Kod:
5
Hello
5
, Wor
3
ld!
0
BinDiff kontrol akışı blok diyagramı, iki yeni temel bloğu göstermektedir. Bir kayıt 0x10'dan büyük olduğunda, "%%s: %%d geçersiz parça uzunluk dizesi" dizesi başka bir kayda yüklenir.
Tahmin edebileceğiniz gibi, daha fazla analiz bu kodun parça boyutu alanının uzunluğunun en fazla 16 karakter olup olmadığını doğruladı.
Kontrolü Tetikleme
Bu işlevi statik analiz yoluyla tetiklemenin beklenenden daha zor olduğu ortaya çıktı. Fortinet, monolitik init ikili dosyasının içine tam bir Apache2 sunucusu gömüyor, bu da bir isteğin nerede karşılanacağı ve belirli bir kod parçası tarafından nasıl işleneceği arasında karmaşık bir katman olduğu anlamına gelir. Sonuç olarak, hedef işlevin başlangıcına bir kesme noktası belirledik ve farkında olduğumuz tüm yollara parçalı POST istekleri gönderdik. Bu, /remote/ altında birçok sonuç elde etmemize hızla yol açtı. Aslında, /remote/ altında geçersiz bir sayfaya yapılan bir istek bile bu işlevi tetikleyecektir. Hedef işleve ap_die gibi belirli hata ile ilgili işlevler aracılığıyla en kolay erişilebildiğini belirledik.
Ne yazık ki, sunucunun zaten bir hatayı döndürmeye karar verdiği işlevi tetikliyor olmamız, uzun bir boyut alanı göndererek bir hatayı doğrudan gözlemleyemeyeceğimiz anlamına gelir. Bu, doğrulamanın mevcut olup olmadığını kontrol etmek için alternatif bir yol aramamıza neden olur.
Gözlemlenebilir Bir Etkinin Tanıtılması
Başlangıçta denediğimiz basit bir testi kullanamasak da, işlev erken başarısız olduğunda farklı davranışları gözlemlemek hala mümkündür. Sunucunun kaç bayt okuyacağını belirlemek için parça uzunluğuna güvenmek zorunda olduğundan, yeterli veri göndermeyerek sunucuyu sürekli olarak bloke edebiliriz. Örneğin, aşağıdaki istek gövdesini gönderebiliriz:
Kod:
FF
abcd
ve bağlantının zaman aşımına kadar asılı kalmasını gözlemleyebiliriz.
Aşırı uzun bir boyut alanı göndererek, zaman aşımının FortiOS'un boyut alanının çok uzun olduğunu algılayıp algılamadığına bağlı hale gelir. Bu bize son bir yük sağlar ki, bu yaklaşık olarak şöyle görünmektedir:
Aşırı uzun bir boyut alanı göndererek, zaman aşımının FortiOS'un boyut alanının çok uzun olduğunu algılayıp algılamadığına bağlı hale gelir. Bu bize son bir yük sağlar ki, bu yaklaşık olarak şöyle görünmektedir:
Kod:
0000000000000000FF
abcd
Bu güvenlik açığına sahip cihazlarda, bu boyut alanı 255 bayta çözümlenir ve bağlantı bir zaman aşımı olana kadar asılı kalır. Yamalı cihazlarda, istek ayrıştırması erken iptal edilir ve mesajın geri kalanını beklemeden bir HTTP yanıtı döndürülür.
Bu teknikleri otomatikleştirmek için bir betik ve kullanım talimatları GitHub'da bulunmaktadır.
GİTHUB LİNKİ
Bu teknikleri otomatikleştirmek için bir betik ve kullanım talimatları GitHub'da bulunmaktadır.
GİTHUB LİNKİ
İçeriği görüntülemek için Giriş yapın veya Kayıt olun.




