Chrome, WebP yığın arabellek taşması açığını düzeltti
(chromereleases.googleblog.com)- Masaüstü Chrome Stable ve Extended Stable kanal güncellemeleri, WebP yığın arabellek taşması açığına yönelik düzeltmeyi içerecek şekilde yayımlandı
- Yeni derlemeler Mac ve Linux’ta 116.0.5845.187, Windows’ta 116.0.5845.187/.188; birkaç günden birkaç haftaya yayılan kademeli bir dağıtımla uygulanacak
- Bu sürümde 1 güvenlik düzeltmesi bulunuyor ve CVE-2023-4863 Critical olarak sınıflandırılıyor
- Açık, Apple SEAR ve University of Toronto Munk School’dan The Citizen Lab tarafından 6 Eylül 2023’te bildirildi
- Google, gerçek dünyada istismar örneklerinin bulunduğunu belirtti; düzeltme sürümü uygulanana kadar hata ayrıntılarına erişim kısıtlanabilir
Masaüstü Chrome kanalı güncellemesi
- Stable ve Extended Stable kanalları, masaüstü için yeni derlemelere güncellendi
- Platformlara göre Stable kanal sürümleri şöyle
- Mac: 116.0.5845.187
- Linux: 116.0.5845.187
- Windows: 116.0.5845.187/.188
- Extended Stable kanalı da ayrı sürümlerle dağıtılıyor
- Windows: 116.0.5845.188
- Mac: 116.0.5845.187
- Güncelleme birkaç günden birkaç haftaya yayılan kademeli bir dağıtımla sunulacak
- Bu derlemedeki değişikliklerin tam listesi log üzerinden görülebilir
Güvenlik düzeltmesi: CVE-2023-4863
- Bu sürümde 1 güvenlik düzeltmesi yer alıyor
- Harici bir araştırmacının katkı verdiği başlıca düzeltme aşağıdaki açıkla ilgili
- Critical CVE-2023-4863: WebP’de yığın arabellek taşması
- Hata numarası: 1479274
- Bildiren: Apple Security Engineering and Architecture(SEAR), University of Toronto Munk School’dan The Citizen Lab
- Bildirim tarihi: 6 Eylül 2023
- Ödül tutarı: $NA
Gerçek dünyada istismar ve bilgi açıklama kısıtlaması
- Google, CVE-2023-4863 exploit’inin gerçek ortamda mevcut olduğunu açıkladı
- Hata ayrıntılarına ve bağlantılara erişim, kullanıcıların büyük çoğunluğu düzeltilmiş sürüme güncellenene kadar kısıtlanabilir
- Aynı hata, başka projelerin de bağımlı olduğu bir üçüncü taraf kütüphanede bulunuyor ve henüz düzeltilmemişse kısıtlama sürdürülebilir
Güvenlik hatası tespiti ve bildirim kanalları
- Birçok güvenlik hatası şu araçlarla tespit ediliyor
- Sürüm kanalı değiştirme yöntemi Chromium release channels kılavuzu üzerinden görülebilir
- Yeni sorunlar crbug.com adresinden bildirilebilir; yardım ise Chrome community help forum üzerinden alınabilir
1 yorum
Hacker News yorumları
Google Chrome’da WebP görselleri renderer process içinde decode edildiği için, exploit başarılı olsa bile en fazla sandbox içindeki renderer kodunun çalıştırılması mümkün olur
Renderer çok karmaşık olduğundan her yıl çok sayıda exploit bulunuyor; ancak renderer’da kod çalıştırma elde edilse bile normal bir web sayfasının sahip olduğu yetkilerin çok ötesine geçilemiyor
Özellikle yerel dosya sistemindeki dosyaları göremez ya da bırakamaz, başka domain’lerin cookie’lerini de okuyamaz
Hemen en yüksek öncelik olmayabilir, ama böyle bir exploit halihazırda gerçek ortamda dolaşmıyorsa, çok rahatsız etmeyecek bir zamanda mümkün olduğunca hızlı patch’lenmeli
Tek bir siteye ya da frontend’e bağlı olmaması açısından güçlendirilmiş XSS’e daha yakın
Ah, yanlış thread’e yazmışım; https://news.ycombinator.com/item?id=37479576 adresindeki “jpeg is good enough” ifadesine yanıt verecektim
Ayrıca JavaScript’i kapatmış olsanız bile web sitesinin bir anda hâlâ kod çalıştırabilir hale gelmesi söz konusu değil mi?
Bu yüzden tarayıcı geliştiricilerinin yeni formatları benimsemekte yavaş davranmasına daha çok hak veriyorum
WebP’nin JPEG’e göre avantajı çok büyük değil; esas olarak şeffaflık gibi konularda, onda da başarısı sınırlı kaldı
Ama şimdi birden fazla yüksek öncelikli güvenlik açığına yol açtı ve libwebp’ye link’lenen her yerde önümüzdeki bir ay boyunca patch dağıtılması gerekecek
Yeni şeyler yapmayalım demiyorum, ama geliştiricilerin maliyeti epey ciddi biçimde küçümsediğini düşünüyorum
WebP ekosisteminin çok daha az olgun olduğu doğru, ama daha eski format işleme kodlarında da epey güvenlik sorunu olduğundan eminim
Yine de mantık geçerli. Daha birkaç hafta önce internet kullanıcıları JPEG XL’in mümkün olduğunca hızlı benimsenmesi gerektiğini, bunun için tarayıcı geliştiricilerinin “referans decoder kodunu codebase’e dahil etmesinin” “neredeyse hiç maliyeti olmadığını” savunuyordu
Diğer görsel formatları ve kütüphaneleri de muhtemelen bug dolu, ama büyük yazılımlarda kullanılmadıkları için kimse umursamıyor
Özellikle bu tür bug’ları bulup istismar edebilecek kişiler için harcanan zamana karşılık getirisi kötü olduğu için
Uzun süre kullanılmaması bug sayısını azaltmaz
Görsel encoder ve decoder’lar ile diğer encoder/decoder’lar güvenli olmayan dilleri kullanmazsa bu tür bug’ların ortaya çıkma olasılığı azalır
Bundan ayrı olarak, kodu gerekenden fazla karmaşık hale getiren kültürün ve ayrıntıları doğru dürüst anlamayan geliştiricilerin de sorun olduğunu düşünüyorum
Bu düzeltme bugünkü Firefox 117.0.1 ve Fenix 117.1.0 sürümlerine dahil edildi: https://hg.mozilla.org/releases/mozilla-release/rev/e245ca21...
Not olarak, image crate içinde güvenli Rust ile yazılmış bir WebP decoder implementasyonu var: https://github.com/image-rs/image
Uzun süre epey eksikti, ama geçen yıl birçok WebP özelliği implemente edildi
Chromium’un artık Rust bağımlılıklarının kullanımına izin veren bir politikası olduğuna göre Chromium da bunu benimsemeye başlayamaz mı?
Soruna yol açan asıl commit: https://github.com/webmproject/libwebp/commit/f75dfbf23d1df1...
Bu hatayı düzelten commit: https://github.com/webmproject/libwebp/commit/902bc919033134...
Asıl commit, Huffman decoder’ını optimize ediyordu. Bu decoder, iyi bilinen bir optimizasyon kullanarak N biti önceden okur; gerçekte kaç bit tüketmesi gerektiğine ve hangi sembolü decode etmesi gerektiğine karar verir. Ya da bu, birden fazla sembolün N bitlik önekiyse, kalan bitler için hangi tabloya bakılması gerektiğini belirler.
Eski sürüm kısa semboller için lookup table kullanıyordu, ancak uzun semboller için grafik dolaşımı gerekiyordu. Yeni sürüm bunu bir lookup table dizisi kullanarak iyileştirdi. Her öğe
(nbits, value)içerir;nbitstüketilecek bit sayısıdır,valueise genellikle semboldür. AncaknbitsN’i aşarsa,valuetablo indeksi olarak yorumlanır venbitso alt ağaçtaki en uzun kod uzunluğu olarak yeniden yorumlanır. Bu yüzden takip eden her tablo2^(nbits - N)öğeye sahip olmalıdır. Kök tablo her zaman2^Nöğe olarak sabittir.Yeni sürüm, sembol sayısına göre azami öğe sayısını (
kTableSize) hesaplıyordu. Doğal olarak Huffman ağacı güvenilmeyen girdiden gelir venbits’in çok büyüdüğü durumlar kolayca hayal edilebilir. VP8 Lossless özellikle en fazla 15 bite izin verdiğinden, tüm LUT’ler ayrı ayrı yardımcı tablolara eşlenirse mümkün olan en büyük tablo2^N + 2^15öğe olur. Bunu oluşturmak için de çok fazla sembol gerekmez; her tablo için16-Nsembol yeterlidir.İlginç biçimde kodun kendisinde yalnızca tablo boyutunu hesaplayan bir mod vardı (
root_table == NULLileVP8LBuildHuffmanTableçağrısı), ama nedense kullanılmıyordu ve sabit bir maksimum boyut varsayılıyordu. Bu yüzden Huffman ağacı öğe sayısını maksimize edecek şekilde oluşturulduğunda ayrılan alanın dışına yazıyordu.Bunun neden olduğunu anlamak mümkün. Huffman decode aşaması, pek çok sıkıştırma formatında hesaplama maliyeti en yüksek kısımlardan biridir; küçük iyileştirmeler bile önemlidir. Yukarıdaki optimizasyon iyi bilinir, ancak uzun kod yollarının genelde nadir olduğu düşünülür ve optimizasyon önceliği düşüktür. Asıl commit mesajı bu varsayımı çürütüyordu ve bu yüzden merge edilebildi. Bellek güvenli bir dilin bu sorunu önleyip önlemeyeceğinden emin olmak zor. Çünkü nadiren de olsa burada taşma kontrollerinden özellikle kaçınmak isteyebileceğiniz bir durum söz konusu.
[1] Ancak bellek bozulması sıkı döngüde değil, tablo oluşturma sırasında gerçekleştiği için kısmi taşma kontrolleri büyük fayda sağlayabilirdi. Gerçek düzeltme
ReadSymbolfonksiyonunu hiç değiştirmedi. Yine de sıkı döngünün güvenliği gerekçelendirilmelidir; yanlış bir gerekçe her şeyi mahvedebilir.Sınır kontrolüne gerek olmadığı söyleniyorsa sorun yok. WUFFS çalışma zamanında sınır kontrolü üretmez.
Ancak bu örnekte olduğu gibi yazılım sınırların dışına çıkıp hatalıysa, WUFFS’ta derlenmez.
“Bu imkânsız” diye düşünebilirsiniz; WUFFS genel amaçlı bir programlama dili olsaydı haklı olurdunuz. Rice teoremine göre önemsiz olmayan anlamsal özellikler karar verilemezdir.
Neyse ki WUFFS genel amaçlı bir dil değil. Çoğu yazılım WUFFS ile yazılamaz, ama görüntü codec’leri yazılabilir.
Yine de bu tür sorunları yakalayan otomatik testlerin yazılıp yazılamayacağını merak ediyorum.
Kendi uğraştığım kodlarda bazı hesaplamaları ayrı fonksiyonlara çıkarıp bağımsız test edebiliyorum. Burada performans nedeniyle zor olmuş olabilir, ama emin değilim.
BuildHuffmanTableiçindeki sınır dışı yazma düzeltmesihttps://github.com/webmproject/libwebp/commit/902bc919033134...
Bu, Google’ın bu hatayı bulduktan sonra libwebp için fuzzer’ı optimize ettiği ve bu sayede daha fazla hata bulduğu anlamına gelebilir.
Apple tarafından bildirilmiş gibi görünüyor ve şu güvenlik güncellemesine çok benziyor: https://support.apple.com/en-us/HT213906
Bu yüzden oldukça olası görünüyor. Apple, dahili olarak ImageIO içinde libwebp kullanıyor olabilir ya da benzer bir hata yapmış olabilir.
Görüntü codec’lerinin uzun bir güvenlik açığı geçmişi var.
Gerçek görüntü işleme, bellek güvenli FORTRAN IV ile bile yazılabilecek kadar temiz doğrusal kod olabilir; ancak sıkıştırma devreye girince değişken uzunluklu veri yapıları, pointer takibi vb. çoğalır.
Buna hızlı çalışması gerektiği baskısı da eklenir.
Bu Electron’ı da etkiliyor mu? Öyleyse hangi sürüm?
İlginç olan, Electron’ı dahili olarak kullanan Signal Desktop’ın Linux’ta sandbox olmadan çalışması [1][2]
[0] https://github.com/electron/electron/pull/39824
[1] https://github.com/signalapp/Signal-Desktop/issues/5195
[2] https://github.com/signalapp/Signal-Desktop/pull/4381
Bunu gerçekçi olarak istismar etmenin bir yolu var mı?
Duyduğuma göre 64 bitte heap spraying artık pratik değilmiş
Bellekte üzerine yazılabilecek, öngörülebilir bir nesne mi var?
64 bitte bile kernel exploit’lerde heap spraying hâlâ kesinlikle kullanılıyor. V8 exploit’lerinde insanların hangi ilkel işlemleri kullandığını pek bilmiyorum