Theo de Raadt เสนอการเปลี่ยนแปลงเพื่อจำกัดการเข้าถึงระบบไฟล์ผ่านฟังก์ชัน openat

Theo de Raadt เสนอให้เพิ่มกลไกใหม่เข้าไปใน OpenBSD เพื่อลดความเสี่ยงจากการโจมตี โดยใช้วิธีการขยายการเรียกใช้ระบบ openat มีการเตรียมแพตช์สำหรับเคอร์เนล libc และแอปพลิเคชันบางตัวในระบบพื้นฐาน โดยเพิ่มแฟล็กเพิ่มเติมให้กับ openat และ open เพื่อจำกัดความสามารถในการไปยังไดเร็กทอรีระดับบนผ่าน "/." และการเข้าถึงพาธแบบสัมบูรณ์ การเปลี่ยนแปลงเหล่านี้ยังไม่ได้ถูกรวมเข้ากับ OpenBSD-current และกำลังอยู่ระหว่างการหารือในหมู่นักพัฒนา

ตระกูลการเรียกใช้ระบบ openat(2) ทำงานเหมือน open(2) ยกเว้นว่าหากพารามิเตอร์ "path" เป็นแบบสัมพัทธ์ ไฟล์ที่จะเปิดจะเป็นแบบสัมพัทธ์กับไดเร็กทอรีที่เชื่อมโยงกับตัวระบุไฟล์ "fd" แทนที่จะเป็นไดเร็กทอรีการทำงานปัจจุบัน หากคุณส่งพาธแบบสัมบูรณ์ไปยัง openat ตัวอย่างเช่น: int dirfd = open("/tmp", O_RDONLY | O_DIRECTORY); int hfd = openat(dirfd, "/etc/hosts", O_RDONLY);

ฟังก์ชัน openat() จะไม่สนใจ "dirfd" และส่งผลให้เส้นทางสัมบูรณ์จะถูกประมวลผลตามปกติ

ดังนั้น การแทนที่ open() ด้วย openat() จึงไม่ได้ช่วยเพิ่มความปลอดภัยของโปรแกรมโดยตรง การเรียกใช้ฟังก์ชันนี้อาจช่วยเร่งความเร็วในการวิเคราะห์เส้นทาง แต่ไม่ได้จำกัดการเข้าถึงระบบไฟล์ แฟล็กที่ห้ามใช้เส้นทางสัมบูรณ์ (ตัวอย่างเช่น RESOLVE_BENEATH และ/หรือ RESOLVE_IN_ROOT สำหรับ openat2 ใน Linux): โปรแกรมเมอร์ต้องเพิ่มสิ่งเหล่านี้ลงในการเรียกใช้งานที่เหมาะสมทั้งหมด และเมื่อเข้าควบคุมกระบวนการแล้ว ผู้โจมตีสามารถใช้วิธีอื่นในการเปิดไฟล์ได้

ในระหว่างการพัฒนาโปรแกรม openrsync นั้น Theo จำเป็นต้องจำกัดความสามารถในการเข้าถึงไฟล์ระบบ แต่ไม่สามารถทำได้โดยใช้ฟังก์ชัน unveil() และ pledge() เขาจึงคิดค้นกลไกที่คล้ายกับ openat() แต่มีคุณสมบัติด้านความปลอดภัยที่เสริมการทำงานของ pledge/unveil หรือแม้กระทั่งทำงานได้แม้ไม่มีฟังก์ชันเหล่านั้น

แนวคิดพื้นฐานคือการทำให้ข้อจำกัดเป็นส่วนหนึ่งของตัวอธิบายไดเร็กทอรีเอง เพื่อให้บรรลุเป้าหมายนี้ เราเสนอแฟล็ก F_BELOW ซึ่งสามารถตั้งค่าได้ผ่าน fcntl() หรือแฟล็ก O_BELOW สำหรับ open() ตัวอธิบาย "dirfd" ที่ถูกจำกัดในลักษณะนี้จะอนุญาตให้เข้าถึงได้เฉพาะทางลงล่างในโครงสร้างไดเร็กทอรีเท่านั้น การเรียกใช้ openat() ด้วยพาธสัมบูรณ์หรือการเข้าถึงทางขึ้นบนผ่าน "." จะล้มเหลวด้วยข้อผิดพลาด ENOENT ในกรณีที่มีการโจมตีโดยการเรียกใช้โค้ด ตารางตัวอธิบายไฟล์ของกระบวนการจะมี "dirfd" ที่ใช้งานได้น้อยลง ซึ่งจะจำกัดพื้นที่การโจมตี

ที่มา: opennet.ru

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster