Out-of-bounds Write-[787]

1 year ago 65
BOOK THIS SPACE FOR AD
ARTICLE AD

— — — — — — — — — — — — — — — — — — — — — — — — — — — -

Deskripsi

Out-of-bounds write adalah jenis kerentanan keamanan pada program komputer di mana penulis program tidak memvalidasi dengan benar input yang diberikan ke program sehingga terjadi penulisan data ke lokasi memori di luar batas yang seharusnya, dan dapat menyebabkan program mengalami kegagalan atau bahkan dapat dimanfaatkan oleh penyerang untuk melakukan serangan.

Contohnya, jika sebuah program memiliki variabel array yang digunakan untuk menyimpan data, dan input yang diberikan ke program melebihi ukuran array tersebut, maka data yang seharusnya disimpan pada lokasi memori tertentu di luar batas array dapat ditulis ke lokasi memori yang salah, yang dapat mengakibatkan kerusakan pada program dan bahkan membahayakan keamanan sistem.

Penyerang dapat memanfaatkan kerentanan ini dengan memasukkan input yang dirancang secara khusus untuk menulis data ke lokasi memori yang salah, yang dapat mengubah perilaku program atau bahkan mengambil kendali atas sistem. Oleh karena itu, penting untuk selalu memvalidasi input dan memastikan bahwa data tidak ditulis ke lokasi memori yang tidak diizinkan.

2. Potensi Dampak

Crash atau kegagalan program: Out-of-bounds write vulnerability dapat menyebabkan program mengalami crash atau kegagalan karena adanya penulisan data ke lokasi memori yang tidak seharusnya.Pengambil alihan kontrol: Penyerang dapat memanfaatkan Out-of-bounds write vulnerability untuk menulis kode jahat ke lokasi memori yang salah, yang dapat mengubah perilaku program atau bahkan mengambil kendali atas sistem.Pengungkapan informasi sensitif: Out-of-bounds write vulnerability juga dapat digunakan untuk membocorkan informasi sensitif dari program atau sistem, seperti kata sandi atau data pribadi.Pemalsuan data: Penyerang dapat memanfaatkan Out-of-bounds write vulnerability untuk memalsukan data atau informasi yang disimpan dalam program atau sistem.Peretasan sistem: Out-of-bounds write vulnerability dapat memungkinkan penyerang untuk melakukan peretasan sistem dengan mengambil kendali atas sistem dan melakukan aksi jahat seperti menghapus data atau menginstal malware

3. Contoh Eksploitasi

Kerentanan ini disebabkan oleh pemeriksaan batas buffer yang tidak lengkap di mobi_buffer_move (src/buffer.c). Pada fungsi tersebut, ketika offset < 0, kondisi buf->offset + len <= buf->maxlen tidak dicentang. Saat ini, fungsi tersebut hanya memeriksa apakah buf->offset >= abs(offset) saat offset < 0.

Kode berikut menunjukkan titik rawan dan kemungkinan perbaikan.

// src/buffer.c
void mobi_buffer_move(MOBIBuffer *buf, const int offset, const size_t len) {
size_t aoffset = (size_t) abs(offset);
unsigned char *source = buf->data + buf->offset;
if (offset >= 0) {
if (buf->offset + aoffset + len > buf->maxlen) {
debug_print("%s", "End of buffer\n");
buf->error = MOBI_BUFFER_END;
return;
}
source += aoffset;
} else {
// INCOMPLETE CHECK HERE:
// should also check buf->offset + len <= buf->maxlen
// POSSIBLE FIX:
// if ( (buf->offset < aoffset) || (buf->offset + len <= buf->maxlen) )
if (buf->offset < aoffset) {
debug_print("%s", "End of buffer\n");
buf->error = MOBI_BUFFER_END;
return;
}
source -= aoffset;
}
// due to the incomplete check, the memmove can out-of-bound write
memmove(buf->data + buf->offset, source, len);
buf->offset += len;
}
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:

=================================================================
==14492==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x621000009d00 at pc 0x7ffff762917a bp 0x7fffffffbef0 sp 0x7fffffffb698
WRITE of size 1 at 0x621000009d00 thread T0
#0 0x7ffff7629179 in memmove (/lib/x86_64-linux-gnu/libasan.so.6+0x3a179)
#1 0x7ffff75857c9 in mobi_buffer_move /src/libmobi/libmobi-git/src/buffer.c:520
#2 0x7ffff7585d83 in mobi_decompress_lz77 /src/libmobi/libmobi-git/src/compression.c:59
#3 0x7ffff75ad161 in mobi_decompress_content /src/libmobi/libmobi-git/src/util.c:1774
#4 0x7ffff75ad677 in mobi_dump_rawml /src/libmobi/libmobi-git/src/util.c:1856
#5 0x5555555630e4 in dump_rawml /src/libmobi/libmobi-git/tools/mobitool.c:333
#6 0x5555555661e3 in loadfilename /src/libmobi/libmobi-git/tools/mobitool.c:775
#7 0x555555566e46 in main /src/libmobi/libmobi-git/tools/mobitool.c:962
#8 0x7ffff73a90b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
#9 0x55555555dead in _start (/src/libmobi/libmobi-git/install/bin/mobitool+0x9ead)

0x621000009d00 is located 0 bytes to the right of 4096-byte region [0x621000008d00,0x621000009d00)
allocated by thread T0 here:
#0 0x7ffff769f517 in malloc (/lib/x86_64-linux-gnu/libasan.so.6+0xb0517)
#1 0x7ffff75acb85 in mobi_decompress_content /src/libmobi/libmobi-git/src/util.c:1702
#2 0x7ffff75ad677 in mobi_dump_rawml /src/libmobi/libmobi-git/src/util.c:1856
#3 0x5555555630e4 in dump_rawml /src/libmobi/libmobi-git/tools/mobitool.c:333
#4 0x5555555661e3 in loadfilename /src/libmobi/libmobi-git/tools/mobitool.c:775
#5 0x555555566e46 in main /src/libmobi/libmobi-git/tools/mobitool.c:962
#6 0x7ffff73a90b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)

Kerentanan ini mampu menimpa konten memori dengan nilai yang diberikan pengguna. Untuk semua aplikasi yang menggunakan libmobi (melakukan 983b89820e1c592d9d7c8c438af46e75be1f96e1 pada 8 Juni 2021 atau rilis versi 0.6 (1 Agustus 2020)) Penyerang akhirnya dapat menyelesaikan RCE (Remote Code Execution) menggunakan kerentanan penulisan di luar batas ini untuk menimpa kontrol -aliran nilai memori kritis.

4. Cara Pencegahan

Validasi Input: Validasi input adalah teknik memeriksa apakah input yang dimasukkan oleh pengguna valid atau tidak. Hal ini dapat mencegah penulisan data ke lokasi memori yang tidak seharusnya karena input yang tidak valid.Menggunakan Fungsi dan API yang Aman: Penggunaan fungsi dan API yang aman dapat membantu mencegah Out-of-bounds write vulnerability. Fungsi yang aman akan memastikan bahwa data ditulis pada lokasi memori yang diizinkan dan sesuai dengan ukuran buffer yang sudah ditentukan.Menggunakan Compiler yang Aman: Compiler yang aman dapat membantu mencegah Out-of-bounds write vulnerability dengan mengecek kesalahan saat kompilasi dan memberikan peringatan jika ada kesalahan penulisan data pada lokasi memori yang tidak seharusnya.Melakukan Audit Kode: Melakukan audit kode secara berkala untuk mencari kerentanan keamanan termasuk Out-of-bounds write vulnerability dapat membantu mencegah serangan yang mungkin terjadi.

Referensi:

Read Entire Article