Apa singkatnya janji OpenBSD?

18

Dapatkah seseorang tolong jelaskan, untuk non-programmer, tetapi orang ITU, apa itu janji ?

Mis .: ada program, mis .: "xterm". Bagaimana janji bisa membuatnya lebih aman? It janji di dalam kode program, atau di luar di OS itu sendiri?

Di mana janji? Apakah itu dalam kode program; atau apakah OS memiliki daftar binari yang hanya dapat menjalankan syscall xy?

Peter
sumber

Jawaban:

13

Apa itu Ikrar?

pledge adalah panggilan sistem.

Memanggil pledgesuatu 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 xyzyang hanya membutuhkan readsystem-call.
  • Kemudian Anda menambahkan pledgehanya menggunakan readtetapi tidak ada yang lain.
  • Kemudian pengguna jahat menemukan bahwa dalam program Anda ada kerentanan di mana seseorang dapat meminta rootshell.
  • Mengeksploitasi program Anda untuk membuka rootshell 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 pledgejangan menggunakan apa pun selain readpanggilan sistem. Tetapi rootshell 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 catperintah dari cat.c

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........
muhammad
sumber
5

Suatu program biasanya hanya menggunakan satu set panggilan sistem atau pustaka tertentu. Dengan pledgeAnda dapat membatasi set panggilan sistem yang diizinkan hanya set ini. Misalnya, jika suatu program tidak perlu membaca basis data kata sandi, Anda dapat melarang memanggil getpwnam()fungsi tersebut.

Bagaimana ini berguna? Ini adalah garis pertahanan ekstra terhadap kerentanan. Jika program mengandung bug, seseorang mungkin dapat menggunakan exploit bug untuk mengubah alur eksekusi program atau menyuntikkan beberapa kode tambahan ke dalam proses. Bug tersebut dapat, misalnya, kesalahan buffer overflow dalam jaringan yang menghadapi daemon, yang dapat dipicu oleh penyerang dengan mengirimkan program lebih banyak data daripada yang dapat ditangani, mungkin mengatur agar program membaca dan mengirim konten /etc/passwdfile melalui jaringan.

Johan Myréen
sumber
4

Program Anda "berjanji" hanya menggunakan fungsionalitas {A, B, C}

Jika seorang hacker dapat menyuntikkan kode ke dalam proses yang Anda janjikan dan mencoba fungsionalitas D, maka OS Anda akan crash

Misalnya, Anda memiliki server NTP. Itu telah berjanji untuk hanya menggunakan fungsionalitas DNS dan JAM. Tetapi memiliki kelemahan yang memungkinkan eksekusi kode jauh. Hacker memintanya untuk MENULIS FILE. Tetapi pledgeakan mendeteksi ini dan mematikan program dan mencatat kesalahan

Neil McGuigan
sumber