Rehin nedir?
pledge bir sistem çağrısıdır.
pledgeBir programı çağırmak , programın yalnızca belirli kaynakları kullanacağına dair söz vermektir.
Söylemenin başka bir yolu, bir programın çalışmasını kendi gereksinimlerine sınırlamaktır, örneğin
"Dışında başka herhangi bir bağlantı noktası
kullanmamayı taahhüt ediyorum port 63"
" lseek()ve fork()"
Bir programı nasıl daha güvenli hale getirir?
Bir programın çalışmasını sınırlar. Misal:
xyzYalnızca readsistem çağrısına ihtiyaç duyan bir program yazdınız .
- Sonra
pledgesadece kullanmak için eklemek readama başka hiçbir şey.
- Daha sonra kötü niyetli bir kullanıcı, programınızda bir
rootkabuğun çağırabileceği bir güvenlik açığı olduğunu öğrendi .
- Bir
rootkabuk açmak için programınızı kullanmak , çekirdeğin işlemi SIGABRT(yakalanamayan / yoksayılamayan) ile öldürmesine ve (bulabileceğiniz) bir günlük oluşturmasına neden olur dmesg.
Bunun nedeni, programınızın diğer kodlarını çalıştırmadan önce, sistem çağrısı pledgedışında bir şey kullanmamasıdır read. Ancak açılış rootkabuğu yasaklanmış olan başka sistem çağrılarını çağıracaktır çünkü zaten başka birini kullanmayacağına söz vermişti read.
Rehin nerede?
Genellikle bir programda. Dan Kullanımı OpenBSD 6.5 kılavuz sayfasında :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Örnek Kod: cat.ccat komutunun örnek kodu
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........