จำนำคืออะไร
pledge
เป็นการเรียกระบบ
การโทรpledge
ในโปรแกรมคือสัญญาว่าโปรแกรมจะใช้ทรัพยากรบางอย่างเท่านั้น
อีกวิธีในการพูดคือ จำกัด การทำงานของโปรแกรมให้ตรงกับความต้องการเช่น
"ฉันสัญญาว่าจะไม่ใช้พอร์ตอื่นยกเว้นport 63
"
"ฉันสัญญาว่าจะไม่ใช้ระบบอื่นยกเว้นlseek()
และfork()
"
มันทำให้โปรแกรมมีความปลอดภัยมากขึ้นได้อย่างไร?
มัน จำกัด การทำงานของโปรแกรม ตัวอย่าง:
- คุณเขียนโปรแกรมชื่อ
xyz
ที่ต้องการเพียงการread
เรียกระบบ
- จากนั้นคุณเพิ่ม
pledge
เพื่อใช้เท่านั้นread
แต่ไม่มีอะไรอื่น
- จากนั้นผู้ใช้ที่เป็นอันตรายพบว่าในโปรแกรมของคุณมีช่องโหว่ที่สามารถเรียก
root
เชลล์ได้
- การใช้ประโยชน์จากโปรแกรมของคุณเพื่อเปิด
root
เชลล์จะส่งผลให้เคอร์เนลจะฆ่ากระบวนการด้วยSIGABRT
(ซึ่งไม่สามารถจับ / เพิกเฉยได้) และสร้างบันทึก (ซึ่งคุณสามารถหาได้dmesg
)
มันเกิดขึ้นเพราะก่อนที่จะรันโค้ดอื่น ๆ ของโปรแกรมของคุณมันจะpledge
ไม่ใช้สิ่งอื่นใดนอกจากการread
เรียกของระบบ แต่เปิดroot
เปลือกจะเรียกหลายระบบสายอื่น ๆ ที่เป็นสิ่งต้องห้ามเพราะสัญญาอยู่แล้วที่จะไม่ใช้อื่น ๆ read
แต่
จำนำอยู่ที่ไหน
มันมักจะอยู่ในโปรแกรม การใช้งานจากOpenBSD 6.5 man page :
#include <unistd.h>
int pledge(const char *promises, const char *execpromises);
รหัสตัวอย่าง: รหัสตัวอย่างของcat
คำสั่งจากcat.c
........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
err(1, "pledge");
while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........