Chrome Memperbaiki Kerentanan Heap Buffer Overflow WebP
(chromereleases.googleblog.com)- Pembaruan kanal Chrome Stable dan Extended Stable untuk desktop telah dirilis, termasuk perbaikan kerentanan heap buffer overflow WebP
- Build baru adalah 116.0.5845.187 untuk Mac dan Linux, serta 116.0.5845.187/.188 untuk Windows, dan akan diterapkan bertahap selama beberapa hari hingga beberapa minggu
- Rilis ini memuat 1 perbaikan keamanan, dan CVE-2023-4863 diklasifikasikan sebagai tingkat Critical
- Apple SEAR dan The Citizen Lab dari University of Toronto Munk School melaporkan kerentanan tersebut pada 6 September 2023
- Google menyatakan ada kasus eksploitasi nyata, dan akses ke detail bug dapat dibatasi hingga versi perbaikan diterapkan
Pembaruan Kanal Chrome Desktop
- Kanal Stable dan Extended Stable telah diperbarui ke build baru untuk desktop
- Versi kanal Stable per platform adalah sebagai berikut
- Mac: 116.0.5845.187
- Linux: 116.0.5845.187
- Windows: 116.0.5845.187/.188
- Kanal Extended Stable juga dirilis dengan versi tersendiri
- Windows: 116.0.5845.188
- Mac: 116.0.5845.187
- Pembaruan didistribusikan bertahap selama beberapa hari hingga beberapa minggu
- Daftar lengkap perubahan pada build ini dapat dilihat di log
Perbaikan Keamanan: CVE-2023-4863
- Rilis ini mencakup 1 perbaikan keamanan
- Perbaikan utama yang dikontribusikan oleh peneliti eksternal adalah kerentanan berikut
- Critical CVE-2023-4863: heap buffer overflow di WebP
- Nomor bug: 1479274
- Pelapor: Apple Security Engineering and Architecture(SEAR), The Citizen Lab dari University of Toronto Munk School
- Tanggal laporan: 6 September 2023
- Jumlah imbalan: $NA
Eksploitasi Nyata dan Pembatasan Pengungkapan Informasi
- Google menyatakan eksploit CVE-2023-4863 ada di lingkungan nyata
- Akses ke detail bug dan tautan dapat dibatasi sampai mayoritas pengguna memperbarui ke versi yang telah diperbaiki
- Pembatasan juga dapat dipertahankan jika bug yang sama berada di library pihak ketiga yang juga diandalkan proyek lain dan belum diperbaiki
Deteksi Bug Keamanan dan Jalur Pelaporan
- Banyak bug keamanan terdeteksi dengan alat berikut
- Cara berpindah kanal rilis dapat dilihat di panduan Chromium release channels
- Isu baru dapat dilaporkan di crbug.com, dan bantuan tersedia di Chrome community help forum
1 komentar
Komentar Hacker News
Di Google Chrome, gambar WebP didekodekan di proses renderer, jadi meskipun eksploit berhasil, yang bisa dilakukan hanya eksekusi kode renderer di dalam sandbox.
Renderer sangat kompleks sehingga banyak eksploit ditemukan setiap tahun, tetapi bahkan jika berhasil mendapatkan eksekusi kode di renderer, haknya tidak jauh melampaui hak yang dimiliki halaman web biasa.
Secara khusus, ia tidak bisa melihat atau meninggalkan file di filesystem lokal, dan juga tidak bisa membaca cookie dari domain lain.
Ini bukan prioritas tertinggi seketika, tetapi jika eksploit seperti itu belum beredar di alam liar, sebaiknya dipatch secepat mungkin pada waktu yang tidak terlalu merepotkan.
Ini lebih mirip XSS versi lebih kuat karena tidak terikat pada satu situs atau frontend.
Ah, saya menulis di thread yang salah; saya bermaksud membalas “jpeg is good enough” di https://news.ycombinator.com/item?id=37479576.
Selain itu, meskipun JavaScript dimatikan, bukankah ini tiba-tiba membuat situs web tetap bisa menjalankan kode?
Jadi saya jadi lebih memahami mengapa para pengembang browser lambat dalam mengadopsi format baru.
WebP tidak punya keunggulan besar dibanding JPEG, terutama hanya soal transparansi, dan keberhasilannya pun terbatas.
Namun sekarang ini berujung pada beberapa celah keamanan prioritas tinggi, dan setiap tempat yang menautkan libwebp harus mendistribusikan patch selama sebulan ke depan.
Bukan berarti jangan melakukan hal baru, tetapi menurut saya pengembang cenderung cukup besar meremehkan biayanya.
Memang benar ekosistem WebP jauh kurang matang, tetapi saya yakin kode pemrosesan format yang lebih tua pun punya cukup banyak masalah keamanan.
Meski begitu, logikanya valid. Baru beberapa minggu lalu suasananya adalah netizen berargumen bahwa JPEG XL harus diadopsi secepat mungkin, dan untuk itu pengembang browser “cukup memasukkan kode reference decoder ke codebase” dengan “biaya nyaris nol”.
Format dan library gambar lain kemungkinan besar juga penuh bug, tetapi karena tidak dipakai di software utama, tidak ada yang peduli.
Terutama bagi orang yang punya kemampuan menemukan dan mengeksploitasi bug semacam ini, imbalannya buruk dibanding waktu yang dihabiskan.
Tidak dipakai lama bukan berarti bug-nya berkurang.
Jika encoder dan decoder gambar, serta encoder/decoder lain, tidak memakai bahasa yang tidak aman, kemungkinan terciptanya bug seperti ini akan lebih rendah.
Terlepas dari itu, saya juga melihat masalah pada budaya yang membuat kode lebih rumit dari yang diperlukan dan pada pengembang yang tidak benar-benar memahami detailnya.
Perbaikan ini masuk ke Firefox 117.0.1 dan Fenix 117.1.0 hari ini: https://hg.mozilla.org/releases/mozilla-release/rev/e245ca21...
Sebagai referensi, crate image memiliki implementasi decoder WebP yang ditulis dalam Rust yang aman: https://github.com/image-rs/image
Sudah lama cukup belum lengkap, tetapi tahun lalu banyak fitur WebP diimplementasikan.
Chromium sekarang punya kebijakan yang mengizinkan penggunaan dependensi Rust, jadi mungkinkah Chromium juga mulai mengadopsinya?
Commit asli yang bermasalah: https://github.com/webmproject/libwebp/commit/f75dfbf23d1df1...
Commit yang memperbaiki bug ini: https://github.com/webmproject/libwebp/commit/902bc919033134...
Commit asli mengoptimalkan decoder Huffman. Decoder ini memakai optimisasi yang sudah dikenal: membaca N bit terlebih dahulu, lalu menentukan berapa bit yang sebenarnya harus dikonsumsi dan simbol apa yang harus didekode. Atau, jika itu adalah prefiks N bit dari beberapa simbol, menentukan tabel mana yang harus dirujuk untuk bit yang tersisa.
Versi lama memakai tabel lookup untuk simbol pendek, tetapi simbol panjang memerlukan traversal graf. Versi baru memperbaikinya dengan memakai array tabel lookup. Tiap entri berisi
(nbits, value), dengannbitsadalah jumlah bit yang dikonsumsi danvaluebiasanya berupa simbol. Namun jikanbitsmelebihi N,valueditafsirkan sebagai indeks tabel, dannbitsditafsirkan ulang sebagai panjang kode terpanjang di subpohon tersebut. Jadi tiap tabel berikutnya harus memiliki2^(nbits - N)entri. Tabel root selalu tetap berukuran2^Nentri.Versi baru menghitung jumlah entri maksimum (
kTableSize) berdasarkan jumlah simbol. Tentu saja pohon Huffman berasal dari input yang tidak tepercaya, dan mudah dibayangkan kasus ketikanbitsmenjadi sangat besar. VP8 Lossless secara spesifik mengizinkan hingga maksimum 15 bit, jadi jika semua LUT masing-masing dipetakan ke tabel bantu terpisah, tabel maksimum yang mungkin menjadi2^N + 2^15entri. Untuk membuat ini pun tidak perlu terlalu banyak simbol; cukup16-Nsimbol untuk tiap tabel.Menariknya, kode itu sendiri memiliki mode yang hanya menghitung ukuran tabel (memanggil
VP8LBuildHuffmanTabledenganroot_table == NULL), tetapi entah kenapa tidak digunakan dan malah mengasumsikan ukuran maksimum tetap. Jadi jika pohon Huffman dibuat untuk memaksimalkan jumlah entri, penulisan akan meluap melewati area yang dialokasikan.Bisa dimengerti mengapa hal seperti ini terjadi. Tahap decoding Huffman adalah salah satu bagian dengan beban komputasi terbesar dalam banyak format kompresi, sehingga peningkatan kecil pun penting. Optimisasi di atas memang sudah dikenal, tetapi jalur kode panjang umumnya dianggap jarang, sehingga prioritas optimisasinya rendah. Pesan commit asli membantah asumsi ini dan bisa digabungkan. Sulit juga memastikan apakah bahasa yang aman memori akan mencegah masalah ini. Karena, jarang terjadi, tetapi dalam kasus ini orang justru ingin secara aktif menghindari pemeriksaan overflow.
[1] Namun kerusakan memori terjadi saat penyusunan tabel, bukan di loop yang ketat, jadi pemeriksaan overflow parsial akan sangat membantu. Perbaikan sebenarnya sama sekali tidak mengubah fungsi
ReadSymbol. Meski begitu, keamanan loop yang ketat harus dibenarkan, dan pembenaran yang keliru bisa merusak semuanya.Jika benar tidak perlu pemeriksaan batas, itu tidak masalah. WUFFS tidak mengeluarkan pemeriksaan batas runtime.
Namun jika software keliru hingga keluar dari batas seperti kali ini, di WUFFS ia tidak akan bisa dikompilasi.
Orang mungkin berpikir “itu mustahil”, dan jika WUFFS adalah bahasa pemrograman serbaguna, itu benar. Menurut teorema Rice, properti semantik nontrivial tidak dapat diputuskan.
Untungnya WUFFS bukan bahasa serbaguna. Sebagian besar software tidak bisa ditulis dengan WUFFS, tetapi codec gambar bisa.
Namun saya juga penasaran apakah mungkin membuat pengujian otomatis yang menangkap masalah semacam ini.
Pada kode yang saya tangani sendiri, sebagian perhitungan bisa dipisahkan ke fungsi tersendiri agar bisa diuji secara independen. Di sini mungkin sulit karena alasan performa, tetapi saya tidak yakin.
Perbaikan penulisan di luar rentang pada
BuildHuffmanTablehttps://github.com/webmproject/libwebp/commit/902bc919033134...
Ini bisa berarti bahwa setelah Google menemukan bug ini, mereka mengoptimalkan fuzzer untuk libwebp, sehingga kini menemukan lebih banyak bug.
Tampaknya dilaporkan oleh Apple, dan terlihat sangat mirip dengan pembaruan keamanan ini: https://support.apple.com/en-us/HT213906
Jadi kemungkinannya cukup tinggi. Apple mungkin memakai libwebp secara internal di ImageIO, atau bisa saja membuat kesalahan serupa.
Codec gambar memiliki sejarah panjang kerentanan.
Pemrosesan gambar yang sebenarnya bisa berupa kode linear yang rapi sampai-sampai dapat ditulis dengan FORTRAN IV yang aman memori, tetapi begitu kompresi masuk, ada banyak struktur data panjang variabel, penelusuran pointer, dan sebagainya.
Di atas itu masih ada tekanan agar berjalan cepat.
Apakah ini juga berdampak pada Electron? Kalau ya, versi yang mana?
Yang menarik, Signal Desktop yang secara internal memakai Electron dijalankan di Linux tanpa sandbox [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
Apakah ada jalur realistis untuk mengeksploitasi ini?
Dari yang saya dengar, di 64-bit heap spray sudah tidak praktis lagi
Apakah ada objek yang dapat diprediksi di dalam memori yang bisa ditimpa?
Bahkan di 64-bit, heap spray jelas masih digunakan dalam eksploit kernel. Saya kurang tahu primitive apa yang dipakai orang dalam eksploit V8