Chrome zero-day: “Exploit ini liar”, jadi periksa versi Anda sekarang

Chrome zero-day: “Exploit ini liar”, jadi periksa versi Anda sekarang

Node Sumber: 2704382

Pembaruan Chrome terbaru Google keluar, dan kali ini perusahaan belum berbasa-basi tentang salah satu dari dua tambalan keamanan yang meliputi:

Google menyadari bahwa mengeksploitasi untuk CVE-2023-3079 ada di alam liar.

Tidak ada kata-kata pemisahan dua derajat, seperti yang sering kita lihat dari Google sebelumnya, untuk mengatakan bahwa perusahaan "mengetahui laporan" tentang eksploitasi.

Kali ini, "kami menyadarinya sendiri", yang diterjemahkan lebih blak-blakan menjadi "kami tahu bahwa penjahat menyalahgunakan ini saat kami berbicara", mengingat bahwa laporan bug datang langsung dari Threat Research Group Google sendiri.

Seperti biasa, ini menyiratkan bahwa Google sedang menyelidiki serangan aktif (apakah terhadap Google itu sendiri, atau beberapa organisasi eksternal, kami tidak tahu) di mana Chrome telah dibobol oleh lubang keamanan yang sebelumnya tidak diketahui.

Bug tersebut dijelaskan secara sederhana sebagai: Ketik Kebingungan di V8. (Maklum, Google tidak mengatakan lebih dari itu pada tahap ini.)

Seperti yang telah kami jelaskan sebelumnya, a kebingungan mengetik bug terjadi ketika Anda menyediakan program dengan potongan data yang seharusnya diurai, divalidasi, diproses, dan ditindaklanjuti dengan satu cara…

…tetapi Anda kemudian berhasil mengelabui program agar menginterpretasikan data dengan cara yang berbeda, tidak resmi, tidak valid, dan berpotensi berbahaya.

Jenis bahaya kebingungan dijelaskan

Bayangkan Anda sedang menulis program dalam bahasa C. (Tidak masalah apakah Anda tahu bahasa C atau tidak, Anda tetap bisa mengikutinya.)

Di C, Anda biasanya mendeklarasikan variabel satu per satu, sehingga tidak hanya menyimpan memori di mana mereka dapat disimpan, tetapi juga memberi sinyal ke program bagaimana variabel tersebut seharusnya digunakan.

Sebagai contoh:

 panjang int JulianDayNumber; karakter yang ditandatangani* NamaPelanggan;

Deklarasi variabel pertama mencadangkan 64 bit untuk menyimpan nilai integer biasa yang mewakili angka hari astronomi. (Jika Anda bertanya-tanya, sore ini adalah JDN 23157 – Julian Days dimulai pada siang hari, bukan tengah malam, karena para astronom sering bekerja pada malam hari, dengan tengah malam adalah tengah hari kerja mereka.)

Cadangan kedua 64 bit untuk menyimpan alamat memori tempat string teks nama pelanggan dapat ditemukan.

Seperti yang dapat Anda bayangkan, sebaiknya Anda tidak mencampurkan kedua nilai ini, karena angka yang masuk akal, dan aman, untuk digunakan sebagai angka hari, seperti 23157, hampir pasti tidak aman untuk digunakan sebagai alamat memori.

Seperti yang Anda lihat dari dump memori dari program Windows yang sedang berjalan ini, alamat memori terendah yang dialokasikan untuk digunakan mulai dari 0x00370000, yaitu 3,604,480 dalam desimal, jauh lebih besar daripada angka hari yang masuk akal.

Alamat memori sebenarnya yang digunakan oleh Windows bervariasi secara acak dari waktu ke waktu, untuk membuat tata letak memori Anda lebih sulit ditebak oleh penjahat, jadi jika Anda menjalankan program yang sama, Anda akan mendapatkan nilai, tetapi tetap saja serupa:

Dan (walaupun di bagian bawah gambar di atas) alamat memori dari bagian data pengguna runtime saat program ini dijalankan 0x01130000 untuk 0x01134FFF, mewakili rentang tanggal yang tidak mungkin dari 22 Juli 44631 hingga 16 Agustus 44687.

Memang, jika Anda mencoba mencampurkan kedua variabel tersebut, kompiler harus mencoba memperingatkan Anda, misalnya seperti ini:

 JulianNomorHari = NamaPelanggan; CustomerName = JulianDayNumber; peringatan: penugasan membuat integer dari pointer tanpa cast peringatan: penugasan membuat pointer dari integer tanpa cast

Sekarang, jika Anda pernah memprogram dalam C, Anda akan tahu bahwa untuk kenyamanan, Anda dapat mendeklarasikan variabel dengan berbagai interpretasi menggunakan union kata kunci, seperti ini:

 serikat { panjang panjang int JulianDayNumer; karakter yang ditandatangani* NamaPelanggan; } data;

Anda sekarang dapat mereferensikan variabel yang persis sama di memori dengan dua cara berbeda.

Jika Anda menulis data.JulianDayNumber, Anda secara ajaib menafsirkan data yang disimpan sebagai bilangan bulat, tetapi menulis data.CustomerName memberi tahu kompiler bahwa Anda mereferensikan alamat memori, meskipun Anda mengakses data tersimpan yang sama.

Apa yang Anda lakukan, kurang lebih, adalah mengakui kepada kompiler bahwa terkadang Anda akan memperlakukan data yang Anda miliki sebagai tanggal, dan di lain waktu sebagai alamat memori, dan itu Anda bertanggung jawab untuk mengingat interpretasi mana yang berlaku pada saat apa dalam kode

Anda mungkin memutuskan untuk memiliki variabel kedua, yang dikenal sebagai a tag (biasanya bilangan bulat) untuk mengikuti Anda union untuk melacak jenis data yang sedang Anda kerjakan saat ini, misalnya:

 struct { tag int; serikat { panjang panjang int JulianDayNumer; karakter yang ditandatangani* NamaPelanggan; } data; } nilai;

Anda mungkin memutuskan kapan value.tag diatur ke 0, data belum diinisialisasi untuk digunakan, 1 berarti Anda menyimpan tanggal, 2 berarti itu adalah alamat memori, dan yang lainnya menunjukkan kesalahan.

Nah, Anda sebaiknya tidak membiarkan orang lain mengacaukannya value.tag pengaturan, atau program Anda bisa berakhir nakal secara dramatis.

Contoh yang lebih mengkhawatirkan mungkin seperti ini:

 struct { tag int; // 1 = hash, 2 = function pointers union { unsigned char hash[16]; // menyimpan hash acak struct { void* openfunc; // atau dua void* closefunc yang divalidasi dengan hati-hati; // penunjuk kode untuk dieksekusi nanti } validasi; } } nilai;

Sekarang, kami membebani blok memori yang sama sehingga terkadang kami dapat menggunakannya untuk menyimpan hash 16-byte, dan terkadang untuk menyimpan dua pointer 8-byte ke fungsi yang akan dipanggil oleh program kami nanti.

Jelas, kapan value.tag == 1, kami akan dengan senang hati mengizinkan perangkat lunak kami menyimpan string 16 byte apa pun ke dalam memori yang dialokasikan untuk penyatuan, karena hash adalah pseudorandom, sehingga kumpulan byte apa pun memiliki kemungkinan yang sama.

Tapi Ketika value.tag == 2, kode kita harus ekstra hati-hati untuk tidak mengizinkan pengguna memberikan alamat fungsi yang tidak divalidasi, tidak dipercaya, dan tidak diketahui untuk dieksekusi nanti.

Sekarang bayangkan Anda dapat mengirimkan nilai ke kode ini saat tag disetel ke 1, sehingga tidak diperiksa dan divalidasi…

…tetapi kemudian, tepat sebelum program benar-benar menggunakan nilai yang disimpan, Anda dapat mengelabui kode untuk mengalihkan tag ke 2.

Kode kemudian akan menerima alamat fungsi Anda yang tidak divalidasi sebagai "dikenal dan sudah diverifikasi aman" (meskipun sebenarnya tidak), dan dengan percaya diri akan mengirimkan eksekusi program ke lokasi nakal di memori yang telah Anda pilih sebelumnya secara diam-diam.

Dan itulah yang terjadi pada bug kebingungan tipe, meskipun menggunakan contoh yang dibuat-buat dan disederhanakan,

Memori yang akan aman dikonsumsi jika ditangani dengan satu cara dengan jahat dikirim ke program untuk diproses dengan cara alternatif yang tidak aman.

Apa yang harus dilakukan?

Pastikan Anda memiliki Chrome atau Chromium versi terbaru.

Anda menginginkan Chrome 114.0.5735.106 atau lebih baru di Mac dan Linux, dan 114.0.5735.110 atau lebih baru di Windows.

Microsoft Edge, yang berbasis Chromium, juga terkena dampak bug ini.

Microsoft sejauh ini [2023-06-06T16:25:00Z] Catat itu

Microsoft menyadari eksploitasi baru-baru ini yang ada di alam liar. Kami secara aktif berupaya merilis tambalan keamanan.

Edge saat ini berada di versi 114.0.1823.37, jadi apa pun yang diberi nomor lebih lambat dari itu harus menyertakan tambalan CVE-2023-3079 Microsoft.

Untuk memeriksa versi Anda dan memaksakan pembaruan jika ada yang belum Anda terima:

  • Google Chrome Menu tiga titik (⋮) > Bantuan > Tentang Chrome.
  • Microsoft Edge. Pengaturan dan lainnya (…) > Bantuan dan umpan balik > Tentang Microsoft Edge.

Sama-sama.


Stempel Waktu:

Lebih dari Keamanan Telanjang