Chrome V8 HardenProtect'ı Sızdırılan Sentinel Değeri ile Aşma
Sentinel value, algoritmalardaki özel bir değerdir ve genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılır. Chrome kaynak kodunda birden fazla Sentinel value bulunmaktadır. Daha önce, TheHole nesnesinin sızıntılarını kullanarak bir kumanda içinde rastgele kod yürütmenin nasıl gerçekleştirileceğine dair araştırmalar yapılmıştır. Bu yazı, V8'in başka bir yerel nesnesi olan Uninitialized Oddball'ı tartışacaktır; bu yöntem, V8'in en son sürümünde hala kullanılabilir durumdadır.
Bu yöntem evrenseldir:
Issue1216437'de ilk olarak internal uninitialized oddball kavramı ortaya atılmıştır.
Issue1314616'da UninitializedOddball doğrudan sızdırılmıştır, ancak o zamanlar istismar yöntemi net değildi.
Issue1352549'un potansiyel etkisi dikkat çekiyor.
Şu anda bazı yazılımlar bu açığı henüz düzeltmedi.
V8'deki çoğu yerel nesne, v8/src/roots/roots.h dosyasında tanımlanmıştır ve bu nesneler bellek içinde yan yana dizilmiştir. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e açığa çıkarılırsa, sandbox içinde herhangi bir kodun çalıştırılması mümkün olabilir.
Bu yöntemi doğrulamak için, V8'in yerel fonksiyonunu değiştirerek Uninitialized Oddball'ı JavaScript'e sızdırabilirsiniz. Özellikle %TheHole() fonksiyonundaki isolate'a göre kaydırmayı değiştirebilirsiniz.
Bu yöntemden kaçınmanın temel kodu aşağıdaki gibidir:
javascript
function read(obj, prop) {
return obj[prop];
}
let uninitialized_oddball = %TheHole();
let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) {
read(arr, 0);
}
let val = read(uninitialized_oddball, 0);
console.log(val);
V8 11.0.0'de test edildiğinde, %TheHole() UninitializedOddball'ı döndürdüğünde, hala göreli olarak herhangi bir okuma gerçekleştirilebilir.
Optimize edilmiş read fonksiyonunun ana montajı aşağıdaki gibidir:
uninitialized_oddball geçirildiğinde, 0x558b20004086 adresinden obj ile başlayarak hesaplama yapılır ve nihayetinde vmovsd talimatında rastgele okuma tamamlanır, veriler xmm0 register'ında saklanır.
Önerilen düzeltme yöntemi, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken dizi haritasını kontrol etmeyi eklemektir, bu sayede doğrudan ofset hesaplamasıyla dizi değerlerini döndürmekten kaçınılır.
Dikkate değer olan, bazı yazılımların hala bu açığı kapatmamış olmasıdır. x86 platformunda kullanım şekli biraz farklıdır, adres sıkıştırması olmadığı için, rastgele okuma ve yazma işlemleri tüm süreçle ilişkilidir. ASLR açık olsa bile, dosya çok büyük olduğu için hedef içeriğe rastgele okuma ve yazma işlemi yapma olasılığı hala oldukça yüksektir.
Bu yeni geçiş yöntemi, daha önceki benzer güvenlik açıklarının istismar zorluğunu önemli ölçüde azalttı. Tüm sızdırılan uninitialized_oddball açıklarını yeniden gözden geçirmenizi öneririm.
V8'de başka Sentinel değerleri de bulunmaktadır, bunlar benzer sorunlara yol açabilir. Bu bize şu çıkarımı veriyor:
Diğer uninitialized_Oddball sızıntıları da V8 RCE'yi gerçekleştirmek için kolay mı?
Bu tür sorunların resmi olarak güvenlik sorunu olarak kabul edilip edilmemesi hala tartışmalıdır.
Fuzzer'da yeni sömürü ilkelere ulaşmak için Sentinel değerini değişken olarak eklemeli miyiz?
Her ne olursa olsun, bu tür sorunlar, hackerların tam olarak faydalanma süresini önemli ö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.
10 Likes
Reward
10
5
Share
Comment
0/400
ZKProofEnthusiast
· 07-09 11:53
Herkesin bildiği gibi V8 dünyayı yönetiyor.
View OriginalReply0
SleepyValidator
· 07-06 23:01
Chrome gerçekten de sağlam.
View OriginalReply0
FlashLoanLord
· 07-06 17:06
Bu kadar büyük bir güvenlik açığı hala düzeltilmemiş mi?
View OriginalReply0
ForkItAll
· 07-06 17:00
v8 bu açık gerçekten ybb.
View OriginalReply0
FudVaccinator
· 07-06 16:51
Yine bir büyük açık! Firefox kullanmak gerçekten harika.
Chrome V8 motoru tekrar güvenlik açığı ortaya çıkardı: Sentinel Değeri sızdırması kum havuzunu atlatabilir.
Chrome V8 HardenProtect'ı Sızdırılan Sentinel Değeri ile Aşma
Sentinel value, algoritmalardaki özel bir değerdir ve genellikle döngü veya özyinelemeli algoritmaların sonlandırma koşulu olarak kullanılır. Chrome kaynak kodunda birden fazla Sentinel value bulunmaktadır. Daha önce, TheHole nesnesinin sızıntılarını kullanarak bir kumanda içinde rastgele kod yürütmenin nasıl gerçekleştirileceğine dair araştırmalar yapılmıştır. Bu yazı, V8'in başka bir yerel nesnesi olan Uninitialized Oddball'ı tartışacaktır; bu yöntem, V8'in en son sürümünde hala kullanılabilir durumdadır.
Bu yöntem evrenseldir:
Issue1216437'de ilk olarak internal uninitialized oddball kavramı ortaya atılmıştır.
Issue1314616'da UninitializedOddball doğrudan sızdırılmıştır, ancak o zamanlar istismar yöntemi net değildi.
Issue1352549'un potansiyel etkisi dikkat çekiyor.
Şu anda bazı yazılımlar bu açığı henüz düzeltmedi.
V8'deki çoğu yerel nesne, v8/src/roots/roots.h dosyasında tanımlanmıştır ve bu nesneler bellek içinde yan yana dizilmiştir. Eğer sızdırılmaması gereken yerel nesneler JavaScript'e açığa çıkarılırsa, sandbox içinde herhangi bir kodun çalıştırılması mümkün olabilir.
Bu yöntemi doğrulamak için, V8'in yerel fonksiyonunu değiştirerek Uninitialized Oddball'ı JavaScript'e sızdırabilirsiniz. Özellikle %TheHole() fonksiyonundaki isolate'a göre kaydırmayı değiştirebilirsiniz.
Bu yöntemden kaçınmanın temel kodu aşağıdaki gibidir:
javascript function read(obj, prop) { return obj[prop]; }
let uninitialized_oddball = %TheHole(); let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) { read(arr, 0);
}
let val = read(uninitialized_oddball, 0); console.log(val);
V8 11.0.0'de test edildiğinde, %TheHole() UninitializedOddball'ı döndürdüğünde, hala göreli olarak herhangi bir okuma gerçekleştirilebilir.
Optimize edilmiş read fonksiyonunun ana montajı aşağıdaki gibidir:
0x558b20004086 mov r11,rdi 0x558b20004089 movzx edi,byte ptr [r11+0xb] 0x558b2000408d cmp edi,0x81 0x558b20004093 jnz 0x558b200040d8 0x558b20004095 mov r9,qword ptr [r11+0xf] 0x558b20004099 test esi,esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd r11,esi 0x558b200040a0 cmp r11,qword ptr [r9+0xf] 0x558b200040a4 jae 0x558b200040d8 0x558b200040a6 vmovsd xmm0,[r9+r11*8+0x7]
uninitialized_oddball geçirildiğinde, 0x558b20004086 adresinden obj ile başlayarak hesaplama yapılır ve nihayetinde vmovsd talimatında rastgele okuma tamamlanır, veriler xmm0 register'ında saklanır.
Önerilen düzeltme yöntemi, optimize edilmiş fonksiyonun dizi elemanlarını döndürürken dizi haritasını kontrol etmeyi eklemektir, bu sayede doğrudan ofset hesaplamasıyla dizi değerlerini döndürmekten kaçınılır.
Dikkate değer olan, bazı yazılımların hala bu açığı kapatmamış olmasıdır. x86 platformunda kullanım şekli biraz farklıdır, adres sıkıştırması olmadığı için, rastgele okuma ve yazma işlemleri tüm süreçle ilişkilidir. ASLR açık olsa bile, dosya çok büyük olduğu için hedef içeriğe rastgele okuma ve yazma işlemi yapma olasılığı hala oldukça yüksektir.
Bu yeni geçiş yöntemi, daha önceki benzer güvenlik açıklarının istismar zorluğunu önemli ölçüde azalttı. Tüm sızdırılan uninitialized_oddball açıklarını yeniden gözden geçirmenizi öneririm.
V8'de başka Sentinel değerleri de bulunmaktadır, bunlar benzer sorunlara yol açabilir. Bu bize şu çıkarımı veriyor:
Diğer uninitialized_Oddball sızıntıları da V8 RCE'yi gerçekleştirmek için kolay mı?
Bu tür sorunların resmi olarak güvenlik sorunu olarak kabul edilip edilmemesi hala tartışmalıdır.
Fuzzer'da yeni sömürü ilkelere ulaşmak için Sentinel değerini değişken olarak eklemeli miyiz?
Her ne olursa olsun, bu tür sorunlar, hackerların tam olarak faydalanma süresini önemli ölçüde kısaltacaktır.