Apa itu Ikrar?
pledge
adalah panggilan sistem.
Memanggil pledge
suatu program berarti berjanji bahwa program hanya akan menggunakan sumber daya tertentu.
Cara lain untuk mengatakan adalah membatasi operasi suatu program sesuai kebutuhannya, misalnya,
"Saya berjanji untuk tidak menggunakan port lain kecuali port 63
"
"Saya berjanji untuk tidak menggunakan panggilan sistem lain kecuali lseek()
dan fork()
"
Bagaimana cara membuat program lebih aman?
Ini membatasi pengoperasian suatu program. Contoh:
- Anda menulis sebuah program bernama
xyz
yang hanya membutuhkan read
system-call.
- Kemudian Anda menambahkan
pledge
hanya menggunakan read
tetapi tidak ada yang lain.
- Kemudian pengguna jahat menemukan bahwa dalam program Anda ada kerentanan di mana seseorang dapat meminta
root
shell.
- Mengeksploitasi program Anda untuk membuka
root
shell akan menghasilkan bahwa kernel akan membunuh proses dengan SIGABRT
(yang tidak dapat ditangkap / diabaikan) dan menghasilkan log (yang dapat Anda temukan dengan dmesg
).
Itu terjadi karena sebelum mengeksekusi kode lain dari program Anda, pertama-tama pledge
jangan menggunakan apa pun selain read
panggilan sistem. Tetapi root
shell pembukaan akan memanggil beberapa system-calls lainnya yang dilarang karena sudah berjanji untuk tidak menggunakan yang lain kecuali read
.
Dimana Ikrar?
Biasanya dalam suatu program. Penggunaan dari halaman manual OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Kode Contoh: Contoh kode cat
perintah dari cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........