Google Chrome V8 Motorunda Sentinel Value'nın Analizi ve Güvenlik Tehditleri
Sentinel değeri, algoritmalarda döngü veya özyineleme için bir sonlandırma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda birden fazla Sentinel değeri bulunmaktadır ve bunlardan bazıları JavaScript ortamına sızarsa güvenlik sorunlarına yol açabilir. Bu yazıda, sızan Uninitialized Oddball nesnelerini kullanarak Chrome V8 HardenProtect mekanizmasını aşmanın yolları ele alınacaktır.
V8'de Sentinel Değeri
V8 kaynak kodunun roots.h dosyası, bellek içinde sıralı bir şekilde tanımlanan birçok yerel nesneyi tanımlar. Eğer bu JavaScript'e ifşa edilmemesi gereken yerel nesneler sızdırılırsa, kum havuzundan kaçışa neden olabilir. Önceki TheHole nesnesinin sızdırılması tipik bir örnektir.
En son V8'deki sorunu doğrulamak için %TheHole() fonksiyonunu değiştirerek Uninitialized Oddball nesnesini döndürebilirsiniz:
javascript
print(%DebugPrint(%TheHole()));
// Çıktı: Başlatılmamış değer
HardenType korumasını atlatma
Uninitialized Oddball kullanarak aşağıdaki PoC kodunu kullanarak herhangi bir okuma gerçekleştirebilirsiniz:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized = %TheHole();
let arr = [1.1];
%OptimizeİçinFonksiyonuHazırla(oku);
read(arr, 0);
read(arr, 0);
%OptimizeFunctionOnNextCall(read);
read(arr, 0);
print(read(başlatılmamış, 0x1234n));
Yeniden derlenmiş optimize edilmiş read fonksiyonuna bakıldığında, obj.prop'un Value türünü sıkı bir şekilde kontrol etmediği, doğrudan JavaScript semantiğine göre kaydırma hesapladığı ve dizi elemanını döndürdüğü görülmektedir. Bu da tür karmaşasına neden olarak rastgele okuma gerçekleştirmektedir.
Önerilen düzeltme, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken, dizinin haritasını kontrol etmeyi eklemektir; bu, doğrudan ofset döndürme değerinin hesaplanmasını önleyecektir.
PatchGap Risk Uyarısı
Analizler, Skype gibi bazı yazılımların PatchGap sorununa sahip olabileceğini ve bu açığın henüz kapatılmadığını ortaya koydu. Hackerlar, bu açığı kullanarak kısa sürede tam bir istismar zinciri oluşturabilir.
Ayrıca, yeni bir bypass yöntemi açıklandıktan sonra, bazı tarihsel açıkların ( gibi Issue1314616, Issue1216437) istismar zorluğu büyük ölçüde azaldı. Üreticilere ilgili açıkların güvenlik risklerini yeniden değerlendirmeleri önerilir.
Özet
V8'de daha fazla Sentinel value üzerinde araştırma yapılması önerilmektedir. %TheHole/Uninitialized_Oddball gibi değişkenlerin Fuzzer'a eklenmesi, yeni sömürü ilkelere ulaşmak için önerilmektedir. Bu tür sorunlar resmi olarak güvenlik sorunu olarak listelenip listelenmemesi önemli değil, bu durum hacker'ların tam sömürü sürecini önemli ölçüde kısaltabilir.
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.
Chrome V8 motoru Sentinel Value güvenlik açığı analizi ve kullanımı
Google Chrome V8 Motorunda Sentinel Value'nın Analizi ve Güvenlik Tehditleri
Sentinel değeri, algoritmalarda döngü veya özyineleme için bir sonlandırma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda birden fazla Sentinel değeri bulunmaktadır ve bunlardan bazıları JavaScript ortamına sızarsa güvenlik sorunlarına yol açabilir. Bu yazıda, sızan Uninitialized Oddball nesnelerini kullanarak Chrome V8 HardenProtect mekanizmasını aşmanın yolları ele alınacaktır.
V8'de Sentinel Değeri
V8 kaynak kodunun roots.h dosyası, bellek içinde sıralı bir şekilde tanımlanan birçok yerel nesneyi tanımlar. Eğer bu JavaScript'e ifşa edilmemesi gereken yerel nesneler sızdırılırsa, kum havuzundan kaçışa neden olabilir. Önceki TheHole nesnesinin sızdırılması tipik bir örnektir.
En son V8'deki sorunu doğrulamak için %TheHole() fonksiyonunu değiştirerek Uninitialized Oddball nesnesini döndürebilirsiniz:
javascript print(%DebugPrint(%TheHole())); // Çıktı: Başlatılmamış değer
HardenType korumasını atlatma
Uninitialized Oddball kullanarak aşağıdaki PoC kodunu kullanarak herhangi bir okuma gerçekleştirebilirsiniz:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized = %TheHole(); let arr = [1.1]; %OptimizeİçinFonksiyonuHazırla(oku); read(arr, 0); read(arr, 0); %OptimizeFunctionOnNextCall(read); read(arr, 0);
print(read(başlatılmamış, 0x1234n));
Yeniden derlenmiş optimize edilmiş read fonksiyonuna bakıldığında, obj.prop'un Value türünü sıkı bir şekilde kontrol etmediği, doğrudan JavaScript semantiğine göre kaydırma hesapladığı ve dizi elemanını döndürdüğü görülmektedir. Bu da tür karmaşasına neden olarak rastgele okuma gerçekleştirmektedir.
Önerilen düzeltme, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken, dizinin haritasını kontrol etmeyi eklemektir; bu, doğrudan ofset döndürme değerinin hesaplanmasını önleyecektir.
PatchGap Risk Uyarısı
Analizler, Skype gibi bazı yazılımların PatchGap sorununa sahip olabileceğini ve bu açığın henüz kapatılmadığını ortaya koydu. Hackerlar, bu açığı kullanarak kısa sürede tam bir istismar zinciri oluşturabilir.
Ayrıca, yeni bir bypass yöntemi açıklandıktan sonra, bazı tarihsel açıkların ( gibi Issue1314616, Issue1216437) istismar zorluğu büyük ölçüde azaldı. Üreticilere ilgili açıkların güvenlik risklerini yeniden değerlendirmeleri önerilir.
Özet
V8'de daha fazla Sentinel value üzerinde araştırma yapılması önerilmektedir. %TheHole/Uninitialized_Oddball gibi değişkenlerin Fuzzer'a eklenmesi, yeni sömürü ilkelere ulaşmak için önerilmektedir. Bu tür sorunlar resmi olarak güvenlik sorunu olarak listelenip listelenmemesi önemli değil, bu durum hacker'ların tam sömürü sürecini önemli ölçüde kısaltabilir.