Rehin nedir?
pledge
bir sistem çağrısıdır.
pledge
Bir 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:
xyz
Yalnızca read
sistem çağrısına ihtiyaç duyan bir program yazdınız .
- Sonra
pledge
sadece kullanmak için eklemek read
ama başka hiçbir şey.
- Daha sonra kötü niyetli bir kullanıcı, programınızda bir
root
kabuğun çağırabileceği bir güvenlik açığı olduğunu öğrendi .
- Bir
root
kabuk 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ı pledge
dışında bir şey kullanmamasıdır read
. Ancak açılış root
kabuğ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)
..........