Out-of-bounds Read — [CWE-125]

1 year ago 63
BOOK THIS SPACE FOR AD
ARTICLE AD

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

Deskripsi

Out-of-bounds read adalah jenis kerentanan keamanan di mana program atau sistem mengakses data dari lokasi memori yang tidak sah, yaitu di luar batas yang seharusnya diakses. Dalam situasi ini, program atau sistem dapat membaca data yang tidak seharusnya diakses, seperti informasi sensitif atau kode eksekusi yang tidak diinginkan.

Contohnya, jika sebuah program meminta input dari pengguna dan tidak memvalidasi apakah input yang diberikan melebihi batas yang diizinkan, maka pengguna dapat memasukkan input yang sangat panjang sehingga melebihi kapasitas memori yang dialokasikan untuk variabel tersebut. Akibatnya, program dapat membaca data dari lokasi memori yang seharusnya tidak diakses, seperti data yang dianggap rahasia atau informasi sensitif lainnya.

2. Potensi Dampak

Pembocoran informasi sensitif: Jika serangan berhasil membaca data yang seharusnya tidak dapat diakses, seperti data pengguna atau informasi kredensial, maka informasi sensitif tersebut dapat dibocorkan dan digunakan untuk tujuan yang tidak sah.Eksploitasi bug: Jika serangan dapat membaca data eksekusi yang tidak sah, maka mereka dapat memanfaatkannya untuk meluncurkan serangan lain pada sistem atau mengambil alih kontrol sistem.Penyimpangan aliran program: Dalam beberapa kasus, membaca data dari lokasi memori yang salah dapat menyebabkan program melompat ke bagian kode yang tidak sah atau menyebabkan crash atau kegagalan sistem.Gangguan privasi: Penggunaan out-of-bounds read vulnerability oleh pengembang atau pihak lain untuk mengakses data pengguna tanpa izin dapat mengganggu privasi dan kepercayaan pengguna pada sistem atau aplikasi tersebut.

3. Contoh Eksploitasi

Penyebabnya adalah cara yang tidak aman untuk mendekompresi input yang diberikan pengguna di mobi_decompress_huffman_internal (src/compression.c baris 118). Secara khusus, code_length bisa jauh lebih besar (nilainya dihitung berdasarkan input pengguna, di PoC kami, nilainya 66) daripada ukuran sebenarnya dari huffcdic->maxcode_table (diperbaiki sebagai 33 di src/compression.h). Oleh karena itu, penyerang dapat membuat program macet (jika dibaca ke alamat memori yang tidak valid) atau mendapatkan informasi sensitif memori (alamat objek penting) untuk melewati ASLR.

Kode berikut menunjukkan titik rentan.

if (!(t1 & 0x80)) {
/* get offset from mincode, maxcode tables */
// Here makes the code_length be much larger than 33 which is the maxcode_table's size
while (code < huffcdic->mincode_table[code_length]) {
code_length++;
}
// HERE causes the out-of-bound read
maxcode = huffcdic->maxcode_table[code_length];
}

Sebuah cara memperbaiki sederhana adalah untuk memeriksa apakah nilai code_length lebih besar dari 33 di sini. Perhatikan bahwa ini mungkin bukan perbaikan yang lengkap karena semua skenario serupa di semua fungsi dekompresi harus diperiksa.

if (!(t1 & 0x80)) {
/* get offset from mincode, maxcode tables */
while (code < huffcdic->mincode_table[code_length]) {
code_length++;
}
// SIMPLE FIX
if (code_length >= (sizeof(huffcdic->maxcode_table) / sizeof(huffcdic->maxcode_table[0])) )
return MOBI_DATA_CORRUPT;
maxcode = huffcdic->maxcode_table[code_length];
}
Proof of concept

Unduh libmobi terbaru dan kompilasi dengan Address Sanitizer: CFLAGS=” -fsanitize=address “ CXXFLAGS=” -fsanitize=address “
Gunakan perintah berikut dan POC-FILE ini untuk mereproduksi crash:

# enable address sanitizer
export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1
# reproduce the crash
./mobitool -cdeimsrux7 -o any-tmp-dir-path POC-FILE

Anda harus mendapatkan informasi kerusakan serupa sebagai berikut:

=================================================================
==6829==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x61a000001e24 at pc 0x7ffff75863b6 bp 0x7fffffffbae0 sp 0x7fffffffbad0
READ of size 4 at 0x61a000001e24 thread T0
#0 0x7ffff75863b5 in mobi_decompress_huffman_internal /src/libmobi/libmobi-git/src/compression.c:146
#1 0x7ffff75868c5 in mobi_decompress_huffman_internal /src/libmobi/libmobi-git/src/compression.c:180
#2 0x7ffff75868c5 in mobi_decompress_huffman_internal /src/libmobi/libmobi-git/src/compression.c:180
#3 0x7ffff75868c5 in mobi_decompress_huffman_internal /src/libmobi/libmobi-git/src/compression.c:180
#4 0x7ffff7586a1e in mobi_decompress_huffman /src/libmobi/libmobi-git/src/compression.c:213
#5 0x7ffff75ad1eb in mobi_decompress_content /src/libmobi/libmobi-git/src/util.c:1782
#6 0x7ffff75ad677 in mobi_dump_rawml /src/libmobi/libmobi-git/src/util.c:1856
#7 0x5555555630e4 in dump_rawml /src/libmobi/libmobi-git/tools/mobitool.c:333
#8 0x5555555661e3 in loadfilename /src/libmobi/libmobi-git/tools/mobitool.c:775
#9 0x555555566e46 in main /src/libmobi/libmobi-git/tools/mobitool.c:962
#10 0x7ffff73a90b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
#11 0x55555555dead in _start (/src/libmobi/libmobi-git/install/bin/mobitool+0x9ead)

Address 0x61a000001e24 is a wild pointer.
SUMMARY: AddressSanitizer: heap-buffer-overflow /src/libmobi/libmobi-git/src/compression.c:146 in mobi_decompress_huffman_internal

Kerentanan ini mampu menimpa konten memori dengan nilai yang diberikan pengguna. Untuk semua aplikasi yang menggunakan libmobi (melakukan c814c4aba4e090fa32805ff8ff459df6c2c61b5c pada 10 September 2021 atau rilis versi 0.7 (2020 10 September)). Kemungkinan, penyerang dapat menggunakan ini untuk melakukan serangan DOS (Denial of Service) atau bypass ALSR (dengan membaca informasi alamat memori yang sensitif) ke aplikasi apa pun yang menggunakan pustaka LibMobi.

4. Cara Pencegahan

Validasi input: Pastikan bahwa semua input yang diterima oleh program telah divalidasi dengan benar dan tidak melebihi batas yang diizinkan. Hal ini dapat dilakukan dengan menggunakan fungsi-fungsi pengujian input dan memastikan bahwa data input yang diterima telah terverifikasi dan memenuhi syarat.Memeriksa indeks array: Pastikan bahwa semua operasi yang melibatkan array dilakukan dengan benar dan indeks yang digunakan dalam operasi tidak melebihi batas array. Hal ini dapat dicapai dengan menambahkan pengujian indeks dalam setiap operasi array.Menggunakan mekanisme proteksi memori: Sistem operasi modern menyediakan mekanisme proteksi memori yang dapat membantu mencegah serangan Out-of-bounds read vulnerability. Memastikan bahwa program menggunakan mekanisme proteksi memori ini dapat membantu mencegah serangan yang melibatkan pembacaan data dari lokasi memori yang tidak sah.Pembaruan perangkat lunak: Selalu pastikan bahwa semua perangkat lunak, termasuk program yang dikembangkan secara internal, diperbarui secara teratur. Pembaruan ini sering mengandung perbaikan keamanan dan bug-fixes yang dapat membantu mencegah serangan Out-of-bounds read vulnerability.Pemeriksaan dan pengujian yang ketat: Melakukan pemeriksaan dan pengujian yang ketat pada program dan sistem dapat membantu mendeteksi potensi kerentanan dan memastikan bahwa program bekerja sesuai dengan yang diharapkan.

Referensi:

Read Entire Article