Ini adalah jenis eksploit yang sangat spesifik yang menjangkiti semua jenis perangkat lunak.
Use-After-Free (UAF) adalah kerentanan korupsi memori primitif yang terus menjadi ancaman signifikan bagi semua jenis perangkat lunak dari sistem operasi hingga perangkat lunak aplikasi. Cacat keamanan kritis ini terjadi ketika komponen aplikasi mencoba mengakses data di alamat memori yang telah dibebaskan, oleh karena itu namanya— gunakan-setelah-bebas.
Kerentanan UAF dapat menyebabkan potensi eksploitasi perangkat lunak atau bahkan kompromi sistem. Inilah kerentanan UAF, mengapa itu terjadi, dan bagaimana Anda dapat mengamankan perangkat lunak Anda dari kerentanan UAF.
Apa Kerentanan Use-After-Free (UAF)?
Sebelum menyelami kerentanan Use-After-Free, mari mundur selangkah dan pahami beberapa dasar manajemen memori. Ketika sebuah program dijalankan, data dan kodenya dimuat ke dalam memori.
Manajemen memori adalah proses mengelola cara menyimpan (disebut alokasi memori) dan menghapus (disebut memory deallocation) data dan kode di dalam memori secara optimal. Dua segmen memori utama tempat data program disimpan adalah
tumpukan dan tumpukan.Program dapat dialokasikan ruang memori secara statis di tumpukan dan secara dinamis di tumpukan. Kerentanan use-after-free terjadi ketika pemrogram tidak mengelola alokasi memori dinamis dan dealokasi dengan benar dalam program mereka. Ini berarti kelas kerentanan UAF adalah jenis eksploitasi heap. Untuk memahami kerentanan ini dengan lebih baik, ada baiknya memiliki pemahaman yang kuat tentang bagaimana pointer bekerja dalam pemrograman.
Use-After-Free (UAF) seperti namanya, adalah jenis kerentanan korupsi memori primitif yang terjadi ketika objek yang sudah deallocated dari memori diakses lagi menyebabkan crash, atau konsekuensi yang tidak diinginkan seperti kebocoran memori, Escalation of Privilege (EOP) atau kode arbitrer eksekusi. Mari kita pelajari bagaimana kondisi ini terjadi dan bagaimana eksploitasinya.
Bagaimana Use-After-Free (UAF) Dieksploitasi?
Use-After-Free (UAF), seperti namanya, adalah kerentanan kerusakan memori primitif yang terjadi saat program terus mengakses lokasi memori yang telah dibebaskan. Mari kita lihat contoh kode:
#termasuk <stdio.H>
#termasuk <stdlib.H>
intutama(){
int *MUO = malloc (ukuran(int));
*MUO = 69420;
printf("Nilai: %d\n", *MUO);
gratis (MUO);
printf("Nilai?: %d\n", *MUO);
kembali0;
}
Bisa menemukan kerentanan? Seperti yang Anda lihat, dalam kode ini, file MUO pointer dibatalkan alokasinya dari memori menggunakan bebas() fungsi, namun dipanggil lagi di baris berikutnya menggunakan printf() fungsi. Ini menghasilkan perilaku program yang tidak terduga dan bergantung pada di mana kerentanan ada dalam perangkat lunak, hal itu dapat dimanfaatkan untuk mendapatkan eskalasi hak istimewa dan kebocoran memori.
Bagaimana Mengurangi Pemakaian-Setelah-Bebas?
UAF terjadi karena kesalahan dalam pemrograman suatu aplikasi. Ada beberapa tindakan pencegahan yang dapat Anda lakukan untuk menghindari kerentanan Use-After-Free di perangkat lunak Anda.
Berikut adalah beberapa praktik terbaik yang dapat Anda terapkan untuk meminimalkan kerentanan kerusakan memori pada perangkat lunak Anda:
- Menggunakan bahasa pemrograman yang aman untuk memori seperti Rust dengan mekanisme bawaan untuk mencegah kerentanan korupsi memori primitif seperti UAF, Buffer Overflows, dll. Jika Anda menggunakan bahasa pemrograman seperti C/C++, kemungkinan besar Anda akan memperkenalkan bug memori dalam kode Anda. Untuk alasan yang sama, bahkan sistem operasi seperti Windows dan Linux secara perlahan bermigrasi ke Rust. Anda juga harus mempertimbangkan belajar tentang Rust jika Anda membuat program tingkat rendah.
- Selain menggunakan bahasa yang aman untuk memori, Anda disarankan untuk mengikuti praktik terbaik seperti menyetel pointer ke nilai NULL setelah dibebaskan untuk menghindari pengenalan kerentanan Use-After-Free.
- Anda juga dapat menerapkan teknik seperti One Time Allocation (OTA) yang mencegah penyerang mengakses memori yang dibebaskan objek dan Kebijakan Siklus Hidup Objek Ketat, yang membantu melacak setiap objek memori yang dialokasikan dan tidak dialokasikan. Perlu diingat bahwa implementasi ini dapat meningkatkan memori dan overhead kinerja.
Contoh Dunia Nyata dari Kerentanan Use-After-Free (UAF).
Kerentanan Use-After-Free (UAF) telah ditemukan dan dieksploitasi dalam berbagai skenario dunia nyata dari browser web hingga kernel Android hingga aplikasi sehari-hari. Ini menunjukkan perlunya langkah-langkah keamanan proaktif. Beberapa contoh UAF dunia nyata meliputi:
- Browser Internet: Kerentanan UAF di browser web telah dieksploitasi untuk mengeksekusi kode arbitrer, membahayakan privasi pengguna, dan mengeksekusi serangan eksekusi kode jarak jauh. Contoh baru-baru ini adalah CVE-2021-38008, yang mengeksploitasi kerentanan UAF di Google Chrome, memungkinkan pelaku ancaman untuk mengeksekusi kode arbitrer dari jarak jauh di mesin korban.
- Sistem Operasi: Kerentanan UAF yang ditemukan di kernel Windows/Linux/Android telah memungkinkan penyerang mendapatkan hak istimewa yang lebih tinggi, melewati mekanisme keamanan, dan mendapatkan kegigihan. Ada sejumlah besar kerentanan UAF yang telah ditemukan dan masih ditemukan di kernel sistem operasi hingga saat ini. Pada saat penulisan ini, CVE-2023-3269, satu lagi kerentanan UAF di kernel Linux yang menyebabkan eskalasi hak istimewa dirilis ke publik. CVE-2022-23270 adalah contoh kerentanan UAF di kernel Windows.
- Aplikasi Perangkat Lunak: Kerentanan UAF dalam aplikasi perangkat lunak telah dieksploitasi untuk memanipulasi program perilaku, yang mengarah ke pengungkapan informasi, eksekusi kode arbitrer, crash program, dan dalam kasus terburuk, hak istimewa eskalasi. Beberapa aplikasi perangkat lunak telah dan masih rentan terhadap serangan UAF. Perangkat lunak ini sebagian besar adalah program C/C++ yang telah dikembangkan dengan pendekatan manajemen memori yang tidak efisien dan tidak aman.
Untuk mempelajari selengkapnya tentang kerentanan Use-After-Free di aplikasi dunia nyata, Anda dapat memeriksa CVE MITER resmi halaman daftar dan urutkan berdasarkan kata kunci Use-After-Free.
Alokasi Memori yang Efisien Membantu Membuat Perangkat Lunak Aman
Alokasi memori yang optimal dan dipikirkan dengan matang sangat membantu untuk melindungi aplikasi Anda agar tidak menjadi mangsa kerentanan korupsi memori primitif yang umum.
UAF bersama dengan Time Of Check Time of Use (TOCTOU), kondisi balapan, dan Buffer Overflows (BOF) adalah beberapa kerentanan memori yang paling sering dieksploitasi. Semua ini dapat dihindari dengan mempelajari bagaimana memori program Anda dikelola oleh platform tempatnya berjalan. Ini memberi Anda kejelasan tentang bagaimana sistem operasi mengalokasikan program Anda di memori dan membekali Anda dengan alat untuk merancang perangkat lunak untuk kinerja dan keamanan yang optimal.
Jika Anda belum melakukannya, Anda bisa mulai dengan memahami bagaimana manajemen memori dilakukan di Linux, sistem operasi server yang paling banyak digunakan di dunia.