CVE-2024-0517 Hakkında
CVE-2024-0517, Google Chrome'un 120.0.6099.224 sürümünden önceki V8 JavaScript motorunda, uzaktan saldırganların hazırlanmış bir HTML sayfası aracılığıyla yığın bozulmasından yararlanmasına olanak tanıyan bir sınır dışı yazma güvenlik açığıdır. Güvenlik açığı ilk olarak Qrious Secure'dan Toan (Suto) Pham tarafından rapor edilmiştir.
Bu güvenlik açığı, bir uygulama işaretçi, nesne veya değişken gibi bir kaynağı bir tür kullanarak tahsis ettiğinde veya başlattığında, ancak daha sonra bu kaynağa orijinal türle uyumlu olmayan bir tür kullanarak eriştiğinde ortaya çıkan tür karmaşasından kaynaklanmaktadır (CWE-843). Bu CVE'de tür karmaşası, V8 JavaScript motoru için optimize edici bir derleyici olan Maglev tarafından bellek optimizasyonu için kullanılan katlanmış tahsis adı verilen bir bellek tahsis işlemi sırasında tetiklenir.
Bir saldırgan, tür karmaşasından yararlanarak ve WebAssembly ile rastgele kabuk kodları yazarak kurbanın makinesinde komutlar çalıştırabilir.
Saldırı Aşamaları
Saldırganlar, hazırlanmış bir HTML sayfası içeren bir web sitesi barındırabilir ve kullanıcıları kimlik avı e-postaları veya sosyal ağlar aracılığıyla bu sayfaya erişmeleri için kandırabilir. Kullanıcılar siteyi Google Chrome'un güvenlik açığı bulunan bir sürümünü kullanarak ziyaret ettiğinde, gömülü kötü amaçlı kod rastgele komutlar yürütecektir.
V8 JavaScript Motoru
Saldırganlar, hazırlanmış bir HTML sayfası içeren bir web sitesi barındırabilir ve kullanıcıları kimlik avı e-postaları veya sosyal ağlar aracılığıyla bu sayfaya erişmeleri için kandırabilir. Kullanıcılar siteyi Google Chrome'un güvenlik açığı bulunan bir sürümünü kullanarak ziyaret ettiğinde, gömülü kötü amaçlı kod rastgele komutlar yürütecektir.
Maglev ve Katlanmış Tahsis
V8'deki optimize edici bir derleyici olan Maglev, kod yürütme ve bellek tahsisini geliştirir. Maglev yalnızca kod sıkça yürütüldüğünde ve "sıcak" olarak işaretlendiğinde çalışır, bu da daha yavaş satır satır yorumlama yerine derleme yoluyla daha hızlı yürütme ihtiyacını gösterir.
Genellikle tahsisler bitişik olmayan bellek bölgelerinde gerçekleşir, bu da seyrek ve verimsiz bellek kullanımına yol açar. Bu sorunu çözmek için V8, birden fazla değişkeni sürekli ve aynı anda tahsis eden katlanmış tahsis adı verilen bir teknik kullanır. Maglev de ilerlemesinde katlanmış tahsis kullanarak tahsisleri optimize eder.
Nesilsel Çöp Toplama
Kullanılmayan bellek bölgelerini temizlemek için V8, belleği iki alana bölen bir nesilsel çöp toplama (GC) tekniği kullanır: genç nesil ve eski nesil. Ayrıca, iki çöp toplayıcı vardır: genç alanın temizlenmesinden sorumlu olan küçük çöp toplayıcı ve eski alanın temizlenmesini sağlayan büyük çöp toplayıcı. Genç nesil, yeni oluşturulan nesnelerin ilk olarak tahsis edildiği bellek alanıdır ve eski nesil, uzun ömürlü nesnelerin depolandığı bir bellek bölgesidir. Genç nesilde birden fazla küçük GC döngüsünden sağ çıkan nesneler sonunda eski nesle terfi eder.
Güvenlik Açığı Analizi
Genel Bakış
Güvenlik açığı, açıkça tanımlanmış bir kurucusu (temel varsayılan kurucu) olmayan bir temel sınıftan miras alınan bir sınıftan bir nesne oluşturulduğunda ve daha sonra başka bir nesne oluşturulduğunda ortaya çıkar. Katlanmış tahsisat nedeniyle, ilk nesnenin tahsisini ikinci nesnenin tahsisi takip edebilir. Bu iki tahsis arasında çöp toplama gibi bir olay meydana gelirse, bir tür karışıklığı güvenlik açığı ortaya çıkabilir.
Kök Neden Analizi
OPSWAT Yüksek Lisans Bursiyerleri, tahsis süreci sırasında V8 iş akışının ayrıntılı bir analizini yapmış ve bu süreçte aşağıdaki işlevlerin çağrıldığını belirlemiştir:
Bu süreçte TryBuildFindNonDefaultConstructorOrConstruct fonksiyonunda bir sorun tespit edilmiştir: BuildAllocateFastObject işlevi, alt sınıf örneğini oluşturmak için current_raw_allocation_ (aynı anda birden fazla değişken için ayrılan bellek bölgesine bir işaretçi) öğesini genişletir, ancak bunu null olarak ayarlayarak temizleyemez.
Sonuç olarak, oluşturulan bir sonraki nesne, ikinci tahsisattan önceki herhangi bir olaydan bağımsız olarak, her zaman current_raw_allocation_ tarafından işaret edilen belleğin hemen ardından tahsis edilir.
GC çağrılırsa, current_raw_allocation_ öğesine bitişik belleğin yanındaki bellek bölgesi başka nesnelere atanabilir. Bu, GC tetiklendikten ve başka bir nesne oluşturulduktan sonra, iki işaretçinin aynı bellek bölgesine başvurduğu ancak farklı veri türlerine sahip olduğu bir duruma yol açabilir ve bu da bir tür karışıklığı güvenlik açığına neden olur.
İstismar
Bu güvenlik açığından yararlanmak için, OPSWAT Yüksek Lisans Öğrencileri kabuk kodu içeren WebAssembly örnekleri oluşturmuş ve belleği kontrol etmek ve kabuk kodunu çalıştırmak için GC tarafından tür karışıklığını tetiklemeye çalışmıştır:
Tetikleyici Tipi Karışıklığı
Başlatma sırasında, ilk olarak boş nesneler içeren bir dizi (_arrayObject) tanımlarız. Ardından, alt sınıfın bir örneğini ve tetikleyici bir çöp toplayıcıyı oluşturuyoruz. Son olarak, _arrayDouble adında kayan noktalı bir sayı içeren başka bir dizi tanımlıyoruz.
Bu yapıların tekrarlanması gerekir, böylece kod birden çok kez çalıştırılarak V8'in kodu "sıcak" olarak işaretlemesine ve Maglev derleyicisini tetiklemesine neden olur. Bunu, alt sınıfın kurucusunu aşağıdaki gibi bir döngü içinde çağırarak başarıyoruz:
Bu nesneler bir döngü içinde tekrar tekrar başlatıldıktan sonra tür karmaşası tetiklenecektir.
Okuma ve Yazma İlkelleri Oluşturma
Tip karışıklığını başarıyla tetikledikten sonra, kabuk kodunun çalıştırılması için belleğin okunması ve kontrollü bir adreste belleğin üzerine yazılması gerekir. Bunu yapmak için okuma ve yazma ilkelleri oluşturduk. İstismar ilkelleri, nesnelerdeki meta verilerden yararlanarak bize keyfi okuma/yazma bellek bölgeleri verecek ve bunu keyfi kod çalıştırmak için kullanacaktır.
Bu adımdaki okuma ve yazma ilkelleri, bir sonraki adımda WebAssembly örneğinin Jump tablosu işaretçisini kontrol etmemizi sağlayacaktır.
WebAssembly Örnekleri Oluşturma
Ardından, iki WebAssembly örneği oluşturduk: biri kabuk kodunu depolamak için, diğeri de tetiklemek için. Kabuk kodunu okuma ve yazma ilkelleri aracılığıyla WebAssembly örneğinin belleğine doğrudan yazmaktan kaçınmak için WebAssembly örneği içinde bazı kayan noktalı sabit değerler tanımladık.
WebAssembly örneğinin kontrol atlama tablosu işaretçisi
Okuma ve yazma ilkellerini kullanarak; ilk WebAssembly örneğindeki sabitlerin derlenmiş kodunun bazı baytlarını atlamak için ikinci WebAssembly örneğinin atlama tablosu işaretçisini ayarlarız, böylece kayan noktalı sabitler amaçladığımız kabuk kodu olarak yorumlanır:
Kabuk Kodunu Çalıştırmak için WebAssembly Örneğini Çalıştırın
Son olarak, tür karışıklığını tetikledikten ve WebAssembly örneklerinin atlama tablosu işaretçilerini kontrol etmek için okuma/yazma ilkellerini kullandıktan sonra, ikinci WebAssembly örneğinin dışa aktarılan işlevini çağırdık ve bu da ilk WebAssembly örneğindeki kabuk kodunun yürütülmesine neden oldu.
Kullandığımız kabuk kodu, aşağıdaki komutta olduğu gibi, bir Linux makinesindeki tüm işlemleri sonlandırmak için tasarlanmıştır:
Bu komutu çalıştırmak için kayan noktalı sayılardan dönüştürülen assembly kodu aşağıdaki gibi olacaktır:
Güvenlik Zafiyetini Simüle Edin
Bu istismarı gerçek dünya senaryosunda simüle etmek için OPSWAT Graduate Fellows kötü niyetle hazırlanmış bir HTML sayfası oluşturdu.
Bu hazırlanmış HTML sayfasını barındıran alan adına bir bağlantı içeren bir kimlik avı e-postası kurbana gönderilir.
Kurban, Google Chrome'un güvenlik açığı bulunan sürümünü kullanarak bağlantıya erişirse, kabuk kodu çalıştırılır ve tüm işlemlerin sonlandırılmasına neden olur. Sonuç olarak, aşağıda gösterildiği gibi kullanıcının oturumu kapatılır:
İyileştirme
MetaDefender Endpoint™, "Savunmasız Uygulama" özelliğinden yararlanarak bu CVE'yi proaktif olarak azaltmak için kullanıldı. Çözüm, uç nokta ortamındaki Google Chrome uygulamaları için tüm ilişkili CVE'leri etkili bir şekilde tespit eder ve görüntüler. Tehdidi etkisiz hale getirmek için kullanıcılar Chrome'u derhal kaldırabilir veya en son güvenlik yamasını uygulayabilir. Her iki karşı önlemin uygulanmasıyla CVE tamamen kontrol altına alınır ve uç noktada başarılı bir siber saldırı riski önemli ölçüde azaltılır.
Sonraki Seviye Endpoint Güvenliği
Dünyanın dört bir yanındaki kurumların, kuruluşların ve tüzel kişilerin kritik uç noktaları korumak için neden MetaDefender Endpoint 'e güvendiğini keşfedin. Daha fazla bilgi edinmek ve ücretsiz bir demo ile kendi gözlerinizle görmek için bugün bir uzmanla konuşun.
Referanslar
https://nvd.nist.gov/vuln/detail/CVE-2024-0517
https://cwe.mitre.org/data/definitions/843.html
https://blog.exodusintel.com/2024/01/19/google-chrome-v8-cve-2024-0517-out-of-bounds-write-code-execution/
https://jhalon.github.io/chrome-browser-exploitation-1/
https://whenderson.dev/blog/webgl-garbage-collection/
https://v8.dev/
https://github.com/Uniguri/CVE-nday/tree/master/Chrome/V8/CVE-2024-0517