Cam kết là gì?
pledge
là một cuộc gọi hệ thống.
Gọi pledge
trong 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
xyz
chỉ cần read
gọi hệ thống.
- Sau đó, bạn thêm
pledge
để sử dụng read
như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
root
bao.
- Khai thác chương trình của bạn để mở
root
shell 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ó pledge
không sử dụng bất cứ thứ gì ngoài read
lệnh gọi hệ thống. Nhưng việc mở root
shell 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 cat
lệ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)
..........