Chrome v8 motorundaki Sentinel Değeri sızıntısının neden olduğu güvenlik sorunu analizi
Sentinel değeri, algoritmalarda genellikle döngü veya özyinelemeli algoritmaların durma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda birden fazla Sentinel değeri bulunmaktadır; bunlardan bazıları JavaScript ortamına sızarsa güvenlik sorunlarına yol açabilir.
Daha önce yapılan araştırmalar, TheHole nesnesinin sızdırılması yoluyla Chrome sandbox'ında herhangi bir kodun çalıştırılabileceğini göstermiştir. Google ekibi, bunun ardından ilgili CVE'leri düzeltmiştir. Ancak, TheHole nesnesinin yanı sıra, v8'de JS'ye sızdırılmaması gereken başka yerel nesneler de bulunmaktadır. Bu yazıda, mevcut V8 sürümünde hala kullanılabilen Uninitialized Oddball nesnesinin bypass yöntemini tartışacağız.
Dikkate değer olan, bu yöntem belirli bir evrenselliğe sahiptir:
CVE-2021-30551'de, ilk POC, internal uninitialized oddball'ın sızdırılmasıydı.
CVE-2022-1486'da, POC ayrıca UninitializedOddball'ı doğrudan ifşa etti.
Issue1352549('da, CVE) için tam istismar kodu verilmiştir.
Bu örnekler, Uninitialized Oddball'ın sızıntısının ciddi güvenlik sorunlarına yol açabileceğini göstermektedir.
V8'deki Sentinel Değeri
V8'in çoğu yerel nesnesi v8/src/roots/roots.h dosyasında tanımlanmıştır, bu nesneler bellekte ardışık olarak yer alır. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e sızdırılırsa, sandbox içinde herhangi bir kodun çalıştırılması mümkün olabilir.
Bunu doğrulamak için, V8'in yerel fonksiyonunu değiştirerek Uninitialized Oddball'ı JavaScript'e sızdırabiliriz. Özellikle, %TheHole() fonksiyonu içindeki isolate'a göre ofseti değiştirerek Uninitialized Oddball'ı döndürebiliriz.
HardenType korumasını atlatma
Uninitialized Oddball kullanarak göreceli olarak herhangi bir okuma gerçekleştirebilirsiniz. Ana kod aşağıdaki gibidir:
javascript
function read(obj, idx) {
return obj[idx];
}
let uninitialized_oddball = %TheHole();
let ab = new ArrayBuffer(8);
let fa = new Float64Array(ab);
let ia = new BigInt64Array(ab);
let val = read(uninitialized_oddball, "prop");
fa[0] = val;
console.log(ia[0]);
Optimize edilmiş derleme kodunda, obj.prop'un key'inin değerini kontrol etmeden, doğrudan JavaScript anlamına göre kaydırma hesaplanacak ve dizi değeri döndürülecektir. Bu, tür karışıklığına yol açarak keyfî okuma sağladı.
Uninitialized Oddball'ın V8 belleğinde daha öncelikli ve daha ilkel bir sıralamaya sahip olması, TheHole nesnesine göre daha kolay sahtecilik yapılabilmesi, HardenType'ı aşmanın tercih edilen yöntemi olmasını sağlamaktadır.
Önerilen çözüm, optimize edilmiş işlev bir dizi elemanı döndürürken dizi haritasını kontrol etmektir; bu, doğrudan kaydırma hesaplamasını ve dizi değerlerini döndürmekten kaçınmayı içerir.
PatchGap uyarısı
Issue1352549'u analiz ettikten sonra, bazı yazılımların PatchGap sorunu yaşayabileceği tespit edilmiştir. Örneğin, Skype şu anda bu açığı henüz kapatmamıştır. x86 platformunda, adres sıkıştırması olmadığı için, rastgele okuma ve yazma işlemleri tüm süreçle ilişkilidir.
Skype ASLR'yi açmış olmasına rağmen, dosya boyutunun büyük olması nedeniyle, bir hacker sadece belirli bir sabit adreste okuma/yazma yaparak Skype dosya içeriğine erişme olasılığını artırır. PE analizi gibi geleneksel yöntemlerle birleştirildiğinde, tam bir güvenlik açığı istismar zinciri gerçekleştirilebilir.
Bu PatchGap, sadece Issue1352549 ile ilgili değil, aynı zamanda CVE-2022-1486 ve CVE-2021-30551 gibi açıkların istismar zorluğunu da önemli ölçüde azaltacaktır. Hackerların neredeyse ek bir araştırma yapmasına gerek kalmadan tam istismar gerçekleştirmesi mümkün.
Özet
Bu makale, Uninitialized Oddball'ı sızdırarak herhangi bir okuma ilkesini gerçekleştirme yöntemini kısaca tartışmaktadır. V8'de başka birçok Sentinel değeri bulunmaktadır ve benzer güvenlik açıkları olabilir. Bu bize şu dersleri vermektedir:
Diğer Uninitialized Oddball sızıntıları da V8 RCE'yi kolayca gerçekleştirebilir mi.
Bu tür sorunların resmi olarak güvenlik sorunu olarak kabul edilip edilmeyeceği hâlâ tartışmalıdır.
Fuzzer'da %TheHole/Uninitialized Oddball gibi değişkenler eklemek, yeni istismar ilkelere ulaşmak için gerekli midir?
Her halükarda, bu tür sorunlar, hackerların tam bir fayda sağlama süresini önemli ölçüde kısaltacak ve bunun üzerinde ciddi şekilde durmamız gerektiği önemlidir.
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.
6 Likes
Reward
6
5
Share
Comment
0/400
HallucinationGrower
· 11h ago
Aman Tanrım, nasıl sızdırılabilir ki?
View OriginalReply0
CodeAuditQueen
· 11h ago
Bir başka CVE varyantı saldırı yüzeyi, tsk tsk.
View OriginalReply0
WhaleWatcher
· 11h ago
Google ateşle mi oynuyor? Tarihi geriye mi sarıyor?
View OriginalReply0
BearMarketSurvivor
· 11h ago
Gerçekten bitmeyen hatalar.
View OriginalReply0
CryptoAdventurer
· 11h ago
Zeka vergisi ödemek için yine iyi bir zaman mı? Anlayan anlar
V8 motoru Sentinel Değeri sızıntısı güvenlik riski oluşturuyor Uninitialized Oddball yeni bir saldırı vektörü haline geliyor
Chrome v8 motorundaki Sentinel Değeri sızıntısının neden olduğu güvenlik sorunu analizi
Sentinel değeri, algoritmalarda genellikle döngü veya özyinelemeli algoritmaların durma koşulu olarak kullanılan özel bir değerdir. Chrome kaynak kodunda birden fazla Sentinel değeri bulunmaktadır; bunlardan bazıları JavaScript ortamına sızarsa güvenlik sorunlarına yol açabilir.
Daha önce yapılan araştırmalar, TheHole nesnesinin sızdırılması yoluyla Chrome sandbox'ında herhangi bir kodun çalıştırılabileceğini göstermiştir. Google ekibi, bunun ardından ilgili CVE'leri düzeltmiştir. Ancak, TheHole nesnesinin yanı sıra, v8'de JS'ye sızdırılmaması gereken başka yerel nesneler de bulunmaktadır. Bu yazıda, mevcut V8 sürümünde hala kullanılabilen Uninitialized Oddball nesnesinin bypass yöntemini tartışacağız.
Dikkate değer olan, bu yöntem belirli bir evrenselliğe sahiptir:
CVE-2021-30551'de, ilk POC, internal uninitialized oddball'ın sızdırılmasıydı.
CVE-2022-1486'da, POC ayrıca UninitializedOddball'ı doğrudan ifşa etti.
Issue1352549('da, CVE) için tam istismar kodu verilmiştir.
Bu örnekler, Uninitialized Oddball'ın sızıntısının ciddi güvenlik sorunlarına yol açabileceğini göstermektedir.
V8'deki Sentinel Değeri
V8'in çoğu yerel nesnesi v8/src/roots/roots.h dosyasında tanımlanmıştır, bu nesneler bellekte ardışık olarak yer alır. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e sızdırılırsa, sandbox içinde herhangi bir kodun çalıştırılması mümkün olabilir.
Bunu doğrulamak için, V8'in yerel fonksiyonunu değiştirerek Uninitialized Oddball'ı JavaScript'e sızdırabiliriz. Özellikle, %TheHole() fonksiyonu içindeki isolate'a göre ofseti değiştirerek Uninitialized Oddball'ı döndürebiliriz.
HardenType korumasını atlatma
Uninitialized Oddball kullanarak göreceli olarak herhangi bir okuma gerçekleştirebilirsiniz. Ana kod aşağıdaki gibidir:
javascript function read(obj, idx) { return obj[idx]; }
let uninitialized_oddball = %TheHole(); let ab = new ArrayBuffer(8); let fa = new Float64Array(ab); let ia = new BigInt64Array(ab);
let evil = [1.1, 2.2, 3.3]; evil.prop = 1;
%HazırlıkFonksiyonuOptimizeEtme(oku); read(kötü, 0); read(kötü, 1); %OptimizeFunctionOnNextCall(read); read(kötü, 0);
let val = read(uninitialized_oddball, "prop"); fa[0] = val; console.log(ia[0]);
Optimize edilmiş derleme kodunda, obj.prop'un key'inin değerini kontrol etmeden, doğrudan JavaScript anlamına göre kaydırma hesaplanacak ve dizi değeri döndürülecektir. Bu, tür karışıklığına yol açarak keyfî okuma sağladı.
Uninitialized Oddball'ın V8 belleğinde daha öncelikli ve daha ilkel bir sıralamaya sahip olması, TheHole nesnesine göre daha kolay sahtecilik yapılabilmesi, HardenType'ı aşmanın tercih edilen yöntemi olmasını sağlamaktadır.
Önerilen çözüm, optimize edilmiş işlev bir dizi elemanı döndürürken dizi haritasını kontrol etmektir; bu, doğrudan kaydırma hesaplamasını ve dizi değerlerini döndürmekten kaçınmayı içerir.
PatchGap uyarısı
Issue1352549'u analiz ettikten sonra, bazı yazılımların PatchGap sorunu yaşayabileceği tespit edilmiştir. Örneğin, Skype şu anda bu açığı henüz kapatmamıştır. x86 platformunda, adres sıkıştırması olmadığı için, rastgele okuma ve yazma işlemleri tüm süreçle ilişkilidir.
Skype ASLR'yi açmış olmasına rağmen, dosya boyutunun büyük olması nedeniyle, bir hacker sadece belirli bir sabit adreste okuma/yazma yaparak Skype dosya içeriğine erişme olasılığını artırır. PE analizi gibi geleneksel yöntemlerle birleştirildiğinde, tam bir güvenlik açığı istismar zinciri gerçekleştirilebilir.
Bu PatchGap, sadece Issue1352549 ile ilgili değil, aynı zamanda CVE-2022-1486 ve CVE-2021-30551 gibi açıkların istismar zorluğunu da önemli ölçüde azaltacaktır. Hackerların neredeyse ek bir araştırma yapmasına gerek kalmadan tam istismar gerçekleştirmesi mümkün.
Özet
Bu makale, Uninitialized Oddball'ı sızdırarak herhangi bir okuma ilkesini gerçekleştirme yöntemini kısaca tartışmaktadır. V8'de başka birçok Sentinel değeri bulunmaktadır ve benzer güvenlik açıkları olabilir. Bu bize şu dersleri vermektedir:
Diğer Uninitialized Oddball sızıntıları da V8 RCE'yi kolayca gerçekleştirebilir mi.
Bu tür sorunların resmi olarak güvenlik sorunu olarak kabul edilip edilmeyeceği hâlâ tartışmalıdır.
Fuzzer'da %TheHole/Uninitialized Oddball gibi değişkenler eklemek, yeni istismar ilkelere ulaşmak için gerekli midir?
Her halükarda, bu tür sorunlar, hackerların tam bir fayda sağlama süresini önemli ölçüde kısaltacak ve bunun üzerinde ciddi şekilde durmamız gerektiği önemlidir.