Tóm tắt của OpenBSD là gì?


18

Ai đó có thể vui lòng mô tả, đối với một người không lập trình, nhưng người CNTT, cam kết là gì?

Vd: có một chương trình, ví dụ: "xterm". Làm thế nào có thể cam kết làm cho nó an toàn hơn? Nó cam kết bên trong mã chương trình, hoặc bên ngoài trong chính hệ điều hành?

Cam kết ở đâu? Có phải trong mã chương trình; hoặc hệ điều hành có một danh sách các nhị phân chỉ có thể gọi các tòa nhà xy không?

Câu trả lời:


13

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()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)
..........

5

Một chương trình thường chỉ sử dụng một tập hợp các cuộc gọi thư viện hoặc hệ thống nhất định. Với pledgebạn có thể giới hạn tập hợp các cuộc gọi hệ thống được phép chỉ với bộ này. Ví dụ, nếu một chương trình không cần đọc cơ sở dữ liệu mật khẩu, bạn có thể cấm gọi getpwnam()hàm.

Điều này hữu ích như thế nào? Nó là một tuyến phòng thủ bổ sung chống lại các lỗ hổng. Nếu chương trình có lỗi, ai đó có thể sử dụng khai thác lỗi để thay đổi luồng thực thi của chương trình hoặc đưa thêm một số mã vào quy trình. Ví dụ, lỗi có thể là lỗi tràn bộ đệm trong trình nền phải đối mặt với mạng mà kẻ tấn công có thể kích hoạt bằng cách gửi chương trình nhiều dữ liệu hơn mức có thể xử lý, có thể sắp xếp để chương trình đọc và gửi nội dung của /etc/passwdtệp qua mạng.


4

Chương trình của bạn "cam kết" chỉ sử dụng chức năng {A, B, C}

Nếu tin tặc có thể tiêm mã vào quy trình đã cam kết của bạn và thử chức năng D, thì HĐH sẽ làm hỏng chương trình của bạn

Ví dụ: giả sử bạn có máy chủ NTP. Nó đã cam kết chỉ sử dụng chức năng DNS và CLOCK. Nhưng nó có một lỗ hổng cho phép thực thi mã từ xa. Hacker yêu cầu nó VIẾT TẬP TIN. Nhưng pledgesẽ phát hiện điều này và tắt chương trình và ghi lại lỗi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.