Sentinel Value ile Chrome v8 HardenProtect oyalama
Sentinel değeri, algoritmalardaki özel bir değerdir ve genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılır. Chrome kaynak kodunda bu tür özel değerler yaygın olarak kullanılmaktadır. Son zamanlarda bazı Sentinel değeri nesnelerinin sızdırılması yoluyla Chrome sandbox'ında rastgele kod yürütmenin sağlanabileceğine dair araştırmalar yapılmıştır.
Bu makale, Uninitialized Oddball nesnelerini kullanarak Chrome v8 HardenProtect mekanizmasını aşma yöntemini araştıracaktır. Bu yöntem, ilk olarak Project0 üyeleri tarafından Issue1352549'da önerilmiştir ve şu anda V8'in en son sürümünde de kullanılabilir, Google henüz buna yönelik bir düzeltme yapmamıştır.
Dikkate değer olan, bu yöntemin güçlü bir evrenselliğe sahip olduğudur:
Issue1216437(CVE-2021-30551)'de, internal uninitialized oddball'ın sızdırılması için ilk kez bir poc verilmiştir.
Issue1314616(CVE-2022-1486)'de UninitializedOddball nesnesi de doğrudan sızdırılmıştır.
Issue1352549('de CVE)'in gösterilmediği bu yöntem için tam bir istismar zinciri sunulmaktadır.
Bu vakalar, bu geçiş yönteminin birden fazla yazılım sürümünü etkileyebileceğini göstermektedir. Şu ana kadar, Skype gibi yazılımlar bu güvenlik açığını henüz düzeltmemiştir.
V8'de Sentinel Değeri
V8 kaynak kodunda birçok yerel nesne tanımlanmıştır, bunlar arasında çeşitli Sentinel değeri de bulunmaktadır. Bu nesneler bellekte yan yana sıralanır. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e açılırsa, sandbox içinde rastgele kod yürütme gerçekleştirmek mümkün olabilir.
Bu yöntemi doğrulamak için, V8'in %TheHole() fonksiyonunu değiştirerek Uninitialized Oddball nesnesini döndürebiliriz.
HardenType'ı Atlat
Aşağıdaki kod, sızdırılmış Uninitialized Oddball nesnesini kullanarak rastgele okumayı nasıl gerçekleştireceğinizi göstermektedir:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized_oddball = %GetUninitialized();
let ab = new ArrayBuffer(8);
let f64 = new Float64Array(ab);
let u32 = new Uint32Array(ab);
for (let i = 0; i < 0x10000; i++) {
read({prop: 1.1}, 0);
}
%OptimizeFunctionOnNextCall(read);
let val = read({prop: uninitialized_oddball}, 0x1234);
f64[0] = val;
console.log(u32[0].toString(16), u32[1].toString(16));
Optimize edilmiş read fonksiyonunun assembler kodu, fonksiyonun sadece obj'nin prop özelliğini kontrol ettiğini, obj.prop'un değerini kontrol etmeden doğrudan ofset hesapladığını, bu durumun tür karışıklığına neden olduğunu ve herhangi bir okuma gerçekleştirdiğini gösteriyor.
Önerilen düzeltme: Optimize edilmiş fonksiyon dizi elemanlarını döndürdüğünde, doğrudan kaydırma hesaplamaktan kaçınmak için dizi haritasını kontrol etmek.
PatchGap uyarısı
Bu sarmalayıcı yöntem yalnızca tarihsel açıkları etkilemekle kalmaz, aynı zamanda mevcut yazılımları da etkileyebilir. Örneğin, Skype şu anda bu sorunu henüz çözmedi. x86 platformunda, adres sıkıştırmasının eksikliği nedeniyle, rastgele okuma/yazma alanı daha büyüktür.
Bu sefer PatchGap yalnızca Issue1352549 ile ilgili değil, aynı zamanda Issue1314616 ve Issue1216437 gibi benzerlerinin istismarını büyük ölçüde kolaylaştırdı. Üreticilerin ilgili güvenlik açıklarını kapsamlı bir şekilde kontrol etmeleri önerilir.
Özet
Bu makalede, Uninitialized Oddball kullanarak V8'de herhangi bir okuma gerçekleştirme yöntemini tanıtmaktadır. V8'de başka çeşitli Sentinel değerleri de bulunmaktadır ve benzer güvenlik açıkları olabilir. Daha fazla araştırma yapılması önerilmektedir:
Diğer Sentinel değerinin sızdırılması V8 RCE'yi gerçekleştirebilir mi?
Sentinel değerini bir değişken olarak Fuzzer'a ekleyin, yeni sömürü ilkelere ulaşın.
Bu tür sorunların getirebileceği güvenlik risklerini ciddiye almak.
Bu sorunun resmi olarak bir güvenlik açığı olarak listelenip listelenmediğine bakılmaksızın, hackerların tam istismar süresini önemli ölçüde kısaltabilir. Umarım bu makale ilgili tarafların dikkatini çeker.
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 HardenProtect atlatma: Sentinel Value kullanarak rastgele kod yürütme
Sentinel Value ile Chrome v8 HardenProtect oyalama
Sentinel değeri, algoritmalardaki özel bir değerdir ve genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılır. Chrome kaynak kodunda bu tür özel değerler yaygın olarak kullanılmaktadır. Son zamanlarda bazı Sentinel değeri nesnelerinin sızdırılması yoluyla Chrome sandbox'ında rastgele kod yürütmenin sağlanabileceğine dair araştırmalar yapılmıştır.
Bu makale, Uninitialized Oddball nesnelerini kullanarak Chrome v8 HardenProtect mekanizmasını aşma yöntemini araştıracaktır. Bu yöntem, ilk olarak Project0 üyeleri tarafından Issue1352549'da önerilmiştir ve şu anda V8'in en son sürümünde de kullanılabilir, Google henüz buna yönelik bir düzeltme yapmamıştır.
Dikkate değer olan, bu yöntemin güçlü bir evrenselliğe sahip olduğudur:
Issue1216437(CVE-2021-30551)'de, internal uninitialized oddball'ın sızdırılması için ilk kez bir poc verilmiştir.
Issue1314616(CVE-2022-1486)'de UninitializedOddball nesnesi de doğrudan sızdırılmıştır.
Issue1352549('de CVE)'in gösterilmediği bu yöntem için tam bir istismar zinciri sunulmaktadır.
Bu vakalar, bu geçiş yönteminin birden fazla yazılım sürümünü etkileyebileceğini göstermektedir. Şu ana kadar, Skype gibi yazılımlar bu güvenlik açığını henüz düzeltmemiştir.
V8'de Sentinel Değeri
V8 kaynak kodunda birçok yerel nesne tanımlanmıştır, bunlar arasında çeşitli Sentinel değeri de bulunmaktadır. Bu nesneler bellekte yan yana sıralanır. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e açılırsa, sandbox içinde rastgele kod yürütme gerçekleştirmek mümkün olabilir.
Bu yöntemi doğrulamak için, V8'in %TheHole() fonksiyonunu değiştirerek Uninitialized Oddball nesnesini döndürebiliriz.
HardenType'ı Atlat
Aşağıdaki kod, sızdırılmış Uninitialized Oddball nesnesini kullanarak rastgele okumayı nasıl gerçekleştireceğinizi göstermektedir:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized_oddball = %GetUninitialized(); let ab = new ArrayBuffer(8); let f64 = new Float64Array(ab); let u32 = new Uint32Array(ab);
for (let i = 0; i < 0x10000; i++) { read({prop: 1.1}, 0);
}
%OptimizeFunctionOnNextCall(read);
let val = read({prop: uninitialized_oddball}, 0x1234); f64[0] = val; console.log(u32[0].toString(16), u32[1].toString(16));
Optimize edilmiş read fonksiyonunun assembler kodu, fonksiyonun sadece obj'nin prop özelliğini kontrol ettiğini, obj.prop'un değerini kontrol etmeden doğrudan ofset hesapladığını, bu durumun tür karışıklığına neden olduğunu ve herhangi bir okuma gerçekleştirdiğini gösteriyor.
Önerilen düzeltme: Optimize edilmiş fonksiyon dizi elemanlarını döndürdüğünde, doğrudan kaydırma hesaplamaktan kaçınmak için dizi haritasını kontrol etmek.
PatchGap uyarısı
Bu sarmalayıcı yöntem yalnızca tarihsel açıkları etkilemekle kalmaz, aynı zamanda mevcut yazılımları da etkileyebilir. Örneğin, Skype şu anda bu sorunu henüz çözmedi. x86 platformunda, adres sıkıştırmasının eksikliği nedeniyle, rastgele okuma/yazma alanı daha büyüktür.
Bu sefer PatchGap yalnızca Issue1352549 ile ilgili değil, aynı zamanda Issue1314616 ve Issue1216437 gibi benzerlerinin istismarını büyük ölçüde kolaylaştırdı. Üreticilerin ilgili güvenlik açıklarını kapsamlı bir şekilde kontrol etmeleri önerilir.
Özet
Bu makalede, Uninitialized Oddball kullanarak V8'de herhangi bir okuma gerçekleştirme yöntemini tanıtmaktadır. V8'de başka çeşitli Sentinel değerleri de bulunmaktadır ve benzer güvenlik açıkları olabilir. Daha fazla araştırma yapılması önerilmektedir:
Bu sorunun resmi olarak bir güvenlik açığı olarak listelenip listelenmediğine bakılmaksızın, hackerların tam istismar süresini önemli ölçüde kısaltabilir. Umarım bu makale ilgili tarafların dikkatini çeker.