Sentinel Value Kullanarak Chrome V8 Koruma Mekanizmasını Aşma Üzerine İnceleme
Sentinel değeri, algoritmalarda genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda çeşitli Sentinel değerleri bulunmaktadır. Daha önce yapılan araştırmalar, TheHole nesnesinin sızdırılması yoluyla bazı CVE'lerin sandbox içinde rastgele kod yürütülmesi sağlanabileceğini göstermiştir. Google ekibi, bu hafifletici aşmanın atlatıldığına dair yazımızı yayınlamamızdan yaklaşık bir hafta sonra, ilgili CVE'leri hızla GitHub'a güncelledi.
Chrome kaynak kodundan, TheHole nesnesine yönelik herhangi bir kodun çalıştırılmasını önleyen bir düzeltme görülebilir. Ancak, aslında, V8'de JS'ye sızmaması gereken birçok başka yerel nesne vardır. Bu yazıda, ilk olarak Issue1352549'da ortaya çıkan Uninitialized Oddball nesnesini tartışacağız. Dikkate değer bir nokta, bu yöntemin şu anda en son V8 sürümünde de kullanılabilir olmasıdır; Google henüz buna yönelik bir düzeltme yapmamıştır.
Bu yöntem güçlü bir genel geçerliliğe sahiptir:
Issue1216437(CVE-2021-30551)'de ilk kez verilen POC, internal uninitialized oddball'ın sızdırılmasıdır.
Issue1314616(CVE-2022-1486)'deki POC da doğrudan UninitializedOddball'ı ifşa etti.
Issue1352549(NoCVE)'in etkisi göz ardı edilemez.
Bunlar, PatchGap'dan etkilenebilecek yazılımların yeniden gözden geçirilmesi gerektiğini açıkça göstermektedir.
V8'deki Sentinel Değeri
V8'in çoğu yerel nesnesi v8/src/roots/roots.h dosyasında tanımlanmıştır ve bellekte bitişik bir şekilde düzenlenmiştir. Bu yerel nesneler, JavaScript'e sızdığında, sandbox içinde rastgele kod yürütülmesine neden olabilir.
Bu yöntemin en son V8 sürümündeki geçerliliğini doğrulamak için, V8'in yerel fonksiyonu %TheHole()'i değiştirerek Uninitialized Oddball döndürmesini sağlayabiliriz.
HardenType'ı Atlat
Issue1352549'da tam kod verildi. Biz bunu çıkartıp basitleştirdikten sonra, V8 11.0.0'da test ettik ve hâlâ görece rastgele okumayı gerçekleştirebiliyoruz.
Optimizasyon sonrası JavaScript read fonksiyonunun tersine çevrilmiş haline bakıldığında, obj.prop kontrol edilirken, obj.prop anahtarı olarak kullanılan değerin kontrol edilmediği, bunun yerine JavaScript semantiğine göre kaydırma hesaplayarak dizi değerini doğrudan aldığı görülmektedir. Bu durum, hesaplama sırasında tür karışıklığına neden olarak rastgele okuma gerçekleştirilmesine yol açmaktadır.
uninitialized_oddball geçirildiğinde, obj başlangıç noktası olarak alınarak, nihayet vmovsd xmm0,[r9+r11*8+0x7] komutunda rastgele okuma tamamlanır ve veriler xmm0 kayıtına kaydedilir.
uninitialized_oddball'ın V8 bellek sıralamasında daha önde ve daha ilkel olması nedeniyle, sahteciliğin daha kolay olduğu, atlatmanın tercih edilen yolu olarak değerlendirilmektedir. Keyfi yazma için Issue1352549'da yapı analizi referans alınabilir.
Düzeltme önerisi, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken dizi haritasını kontrol etmesini eklemektir, böylece doğrudan ofset hesaplamasıyla dizi değerini döndürmekten kaçınılır.
PatchGap Uyarısı
Issue1352549'u analiz ettikten sonra, muhtemel PatchGap yazılımlarını kontrol ettik ve Skype'ın bu açığı henüz düzeltmediğini gördük. x86 altındaki herhangi bir okuma yazma biraz farklılık göstermektedir, çünkü adres sıkıştırması yoktur, doğrudan tüm süreçle ilişkilidir.
Skype kullanımında, ASLR açılmış olmasına rağmen, dosya çok büyük olduğu için, bir hacker'ın belirli bir sabit adrese okuma/yazma yapması, Skype dosya içeriğine erişmesini sağlayabilir. PE analizi gibi geleneksel yöntemlerle birleştirildiğinde, tüm istismar zincirini tamamlamak da zor değildir.
Bu sefer PatchGap sadece Issue1352549'u kapsamıyor, yeni bir bypass yönteminin açıklanması, Issue1314616 ve Issue1216437 gibi sorunların istismarını büyük ölçüde kolaylaştırdı. Hackerlar, daha önceki uninitialized_oddball açığının tam istismarını gerçekleştirmek için neredeyse hiçbir araştırma maliyeti olmadan bunu yapabiliyor.
Özet
Bu makale, uninitialized_Oddball sızıntısı yoluyla rastgele okuma ilkesinin nasıl gerçekleştirileceğini kısaca tartışmaktadır. V8'de birçok başka Sentinel değeri bulunmaktadır ve test sırasında int3 olmayan çöküşlerle de kolayca karşılaşılabilir. Uninitialized_Oddball ve TheHole'un V8 korumasını aşabildiği göz önüne alındığında, diğer Sentinel değerlerinin de benzer sorunlar yaşayabileceği ihtimali vardır.
Bu bize bazı ipuçları veriyor:
Diğer uninitialized_Oddball sızıntıları da V8'in RCE'sini kolayca gerçekleştirebilir mi.
Google, TheHole bypass'ını hızla düzeltti, ancak çöp toplayıcı ile ASLR'yi atlama sorununu uzun süre erteledi. Bu, benzer bir sorunun resmi bir güvenlik sorunu olarak görülüp görülmediği konusunda belirsiz bir sınırın hala mevcut olduğunu gösteriyor.
Eğer bunu resmi bir güvenlik sorunu olarak görüyorsanız, fuzzer içinde %TheHole/uninitialized_Oddball gibi Sentinel değerlerini değişken olarak eklemenin gerekli olup olmadığını, diğer istismar ilkelere ulaşmak için düşünmek gerekir.
Bu tür sorunlar resmi olarak güvenlik sorunu olarak görülse de, kötü niyetli kişilerin tam bir istismar gerçekleştirme süresini büyük ölçüde kısaltacaktır.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
V8 motoru Sentinel Value açığı araştırması: korumayı aşarak rastgele kod çalıştırma
Sentinel Value Kullanarak Chrome V8 Koruma Mekanizmasını Aşma Üzerine İnceleme
Sentinel değeri, algoritmalarda genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda çeşitli Sentinel değerleri bulunmaktadır. Daha önce yapılan araştırmalar, TheHole nesnesinin sızdırılması yoluyla bazı CVE'lerin sandbox içinde rastgele kod yürütülmesi sağlanabileceğini göstermiştir. Google ekibi, bu hafifletici aşmanın atlatıldığına dair yazımızı yayınlamamızdan yaklaşık bir hafta sonra, ilgili CVE'leri hızla GitHub'a güncelledi.
Chrome kaynak kodundan, TheHole nesnesine yönelik herhangi bir kodun çalıştırılmasını önleyen bir düzeltme görülebilir. Ancak, aslında, V8'de JS'ye sızmaması gereken birçok başka yerel nesne vardır. Bu yazıda, ilk olarak Issue1352549'da ortaya çıkan Uninitialized Oddball nesnesini tartışacağız. Dikkate değer bir nokta, bu yöntemin şu anda en son V8 sürümünde de kullanılabilir olmasıdır; Google henüz buna yönelik bir düzeltme yapmamıştır.
Bu yöntem güçlü bir genel geçerliliğe sahiptir:
Issue1216437(CVE-2021-30551)'de ilk kez verilen POC, internal uninitialized oddball'ın sızdırılmasıdır.
Issue1314616(CVE-2022-1486)'deki POC da doğrudan UninitializedOddball'ı ifşa etti.
Issue1352549(NoCVE)'in etkisi göz ardı edilemez.
Bunlar, PatchGap'dan etkilenebilecek yazılımların yeniden gözden geçirilmesi gerektiğini açıkça göstermektedir.
V8'deki Sentinel Değeri
V8'in çoğu yerel nesnesi v8/src/roots/roots.h dosyasında tanımlanmıştır ve bellekte bitişik bir şekilde düzenlenmiştir. Bu yerel nesneler, JavaScript'e sızdığında, sandbox içinde rastgele kod yürütülmesine neden olabilir.
Bu yöntemin en son V8 sürümündeki geçerliliğini doğrulamak için, V8'in yerel fonksiyonu %TheHole()'i değiştirerek Uninitialized Oddball döndürmesini sağlayabiliriz.
HardenType'ı Atlat
Issue1352549'da tam kod verildi. Biz bunu çıkartıp basitleştirdikten sonra, V8 11.0.0'da test ettik ve hâlâ görece rastgele okumayı gerçekleştirebiliyoruz.
Optimizasyon sonrası JavaScript read fonksiyonunun tersine çevrilmiş haline bakıldığında, obj.prop kontrol edilirken, obj.prop anahtarı olarak kullanılan değerin kontrol edilmediği, bunun yerine JavaScript semantiğine göre kaydırma hesaplayarak dizi değerini doğrudan aldığı görülmektedir. Bu durum, hesaplama sırasında tür karışıklığına neden olarak rastgele okuma gerçekleştirilmesine yol açmaktadır.
uninitialized_oddball geçirildiğinde, obj başlangıç noktası olarak alınarak, nihayet vmovsd xmm0,[r9+r11*8+0x7] komutunda rastgele okuma tamamlanır ve veriler xmm0 kayıtına kaydedilir.
uninitialized_oddball'ın V8 bellek sıralamasında daha önde ve daha ilkel olması nedeniyle, sahteciliğin daha kolay olduğu, atlatmanın tercih edilen yolu olarak değerlendirilmektedir. Keyfi yazma için Issue1352549'da yapı analizi referans alınabilir.
Düzeltme önerisi, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken dizi haritasını kontrol etmesini eklemektir, böylece doğrudan ofset hesaplamasıyla dizi değerini döndürmekten kaçınılır.
PatchGap Uyarısı
Issue1352549'u analiz ettikten sonra, muhtemel PatchGap yazılımlarını kontrol ettik ve Skype'ın bu açığı henüz düzeltmediğini gördük. x86 altındaki herhangi bir okuma yazma biraz farklılık göstermektedir, çünkü adres sıkıştırması yoktur, doğrudan tüm süreçle ilişkilidir.
Skype kullanımında, ASLR açılmış olmasına rağmen, dosya çok büyük olduğu için, bir hacker'ın belirli bir sabit adrese okuma/yazma yapması, Skype dosya içeriğine erişmesini sağlayabilir. PE analizi gibi geleneksel yöntemlerle birleştirildiğinde, tüm istismar zincirini tamamlamak da zor değildir.
Bu sefer PatchGap sadece Issue1352549'u kapsamıyor, yeni bir bypass yönteminin açıklanması, Issue1314616 ve Issue1216437 gibi sorunların istismarını büyük ölçüde kolaylaştırdı. Hackerlar, daha önceki uninitialized_oddball açığının tam istismarını gerçekleştirmek için neredeyse hiçbir araştırma maliyeti olmadan bunu yapabiliyor.
Özet
Bu makale, uninitialized_Oddball sızıntısı yoluyla rastgele okuma ilkesinin nasıl gerçekleştirileceğini kısaca tartışmaktadır. V8'de birçok başka Sentinel değeri bulunmaktadır ve test sırasında int3 olmayan çöküşlerle de kolayca karşılaşılabilir. Uninitialized_Oddball ve TheHole'un V8 korumasını aşabildiği göz önüne alındığında, diğer Sentinel değerlerinin de benzer sorunlar yaşayabileceği ihtimali vardır.
Bu bize bazı ipuçları veriyor:
Diğer uninitialized_Oddball sızıntıları da V8'in RCE'sini kolayca gerçekleştirebilir mi.
Google, TheHole bypass'ını hızla düzeltti, ancak çöp toplayıcı ile ASLR'yi atlama sorununu uzun süre erteledi. Bu, benzer bir sorunun resmi bir güvenlik sorunu olarak görülüp görülmediği konusunda belirsiz bir sınırın hala mevcut olduğunu gösteriyor.
Eğer bunu resmi bir güvenlik sorunu olarak görüyorsanız, fuzzer içinde %TheHole/uninitialized_Oddball gibi Sentinel değerlerini değişken olarak eklemenin gerekli olup olmadığını, diğer istismar ilkelere ulaşmak için düşünmek gerekir.
Bu tür sorunlar resmi olarak güvenlik sorunu olarak görülse de, kötü niyetli kişilerin tam bir istismar gerçekleştirme süresini büyük ölçüde kısaltacaktır.