Cam kết là gì?
pledge là một cuộc gọi hệ thống.
Gọi pledgetrong một chương trình là để hứa rằng chương trình sẽ chỉ sử dụng một số tài nguyên nhất định.
Một cách nói khác là giới hạn hoạt động của một chương trình theo nhu cầu của nó, ví dụ,
"Tôi cam kết không sử dụng bất kỳ cổng nào khác ngoại trừ port 63"
"Tôi cam kết không sử dụng bất kỳ cuộc gọi hệ thống nào khác ngoại trừ lseek()và fork()"
Làm thế nào để nó làm cho một chương trình an toàn hơn?
Nó giới hạn hoạt động của một chương trình. Thí dụ:
- Bạn đã viết một chương trình có tên
xyzchỉ cần readgọi hệ thống.
- Sau đó, bạn thêm
pledgeđể sử dụng readnhưng không có gì khác.
- Sau đó, một người dùng độc hại phát hiện ra rằng trong chương trình của bạn có một lỗ hổng mà người ta có thể gọi một trình
rootbao.
- Khai thác chương trình của bạn để mở
rootshell sẽ dẫn đến việc kernel sẽ giết tiến trình bằng SIGABRT(không thể bắt / bỏ qua) và tạo nhật ký (mà bạn có thể tìm thấy dmesg).
Điều này xảy ra bởi vì trước khi thực thi các mã khác của chương trình của bạn, trước tiên, nó pledgekhông sử dụng bất cứ thứ gì ngoài readlệnh gọi hệ thống. Nhưng việc mở rootshell sẽ gọi một số cuộc gọi hệ thống khác bị cấm vì nó đã hứa sẽ không sử dụng bất kỳ cuộc gọi nào khác ngoài read.
Cam kết ở đâu?
Nó thường trong một chương trình. Cách sử dụng từ trang man OpenBSD 6.5 :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
Mã ví dụ: Mã ví dụ của catlệnh từ cat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........