มีการวางแผนที่จะย้ายกลไกการแยกจำนำไปยัง Linux

เมื่อไม่นานมานี้ผู้เขียนไลบรารีมาตรฐาน Cosmopolitan Cและแพลตฟอร์ม Redbean ได้ประกาศการนำกลไกการแยกการทำงาน pledge() มาใช้กับ Linux

pledge ซึ่ง พัฒนาขึ้นโดยโครงการ OpenBSD นั้น ช่วยให้คุณสามารถห้ามแอปพลิเคชันเข้าถึงการเรียกใช้ระบบที่ไม่ใช้งานได้อย่างเลือกสรร (โดยการสร้างรายการอนุญาตการเรียกใช้ระบบสำหรับแอปพลิเคชันและห้ามการเรียกใช้ระบบอื่นๆ) แตกต่างจากกลไกการควบคุมการเข้าถึงการเรียกใช้ระบบที่มีอยู่ใน Linux เช่น seccomp pledge ได้รับการออกแบบมาตั้งแต่เริ่มต้นให้ใช้งานง่ายที่สุดเท่าที่จะเป็นไปได้

ความคิดริเริ่มที่ล้มเหลวในการแยกแอปพลิเคชันในสภาพแวดล้อมพื้นฐาน OpenBSD โดยใช้กลไก systrace แสดงให้เห็นว่าการแยกที่ระดับของการเรียกแต่ละระบบนั้นซับซ้อนเกินไปและใช้เวลานาน

อีกทางเลือกหนึ่งคือ มีการเสนอให้ใช้ pledge ซึ่งช่วยให้สามารถสร้างกฎการแยกโดยไม่ต้องลงรายละเอียดและจัดการคลาสการเข้าถึงที่เตรียมไว้ล่วงหน้า

ตัวอย่างเช่น คลาสที่นำเสนอคือ stdio (อินพุต/เอาต์พุต), rpath (ไฟล์แบบอ่านอย่างเดียว), wpath (ไฟล์เขียน), cpath (สร้างไฟล์), tmppath (ทำงานกับไฟล์ชั่วคราว), inet (เครือข่ายซ็อกเก็ต), unix (ซ็อกเก็ตยูนิกซ์) ), DNS (ความละเอียด DNS), getpw (สิทธิ์ในการอ่านฐานข้อมูลผู้ใช้), ioctl (การเรียก ioctl), proc (การควบคุมกระบวนการ), exec (กระบวนการเริ่มต้น) และ id (การควบคุมการอนุญาต)

กฎสำหรับการทำงานกับระบบเรียกใช้ (system calls) นั้นระบุไว้ในรูปแบบของคำอธิบายประกอบ ซึ่งประกอบด้วยรายการของคลาสระบบเรียกใช้ที่อนุญาตและอาร์เรย์ของเส้นทางไฟล์ที่อนุญาตให้เข้าถึงได้ หลังจากคอมไพล์และเรียกใช้แอปพลิเคชันที่แก้ไขแล้ว เคอร์เนลจะรับหน้าที่ตรวจสอบการปฏิบัติตามกฎที่ระบุไว้ต่อไป

นอกจากนี้ ยังมีการพัฒนาการนำคำมั่นสัญญาไปใช้สำหรับ FreeBSD ซึ่งโดดเด่นด้วยความสามารถในการแยกแอปพลิเคชันโดยไม่ต้องทำการเปลี่ยนแปลงโค้ด ขณะที่ใน OpenBSD การเรียกจำนำมุ่งเป้าไปที่การรวมเข้ากับสภาพแวดล้อมพื้นฐานอย่างแน่นหนาและการเพิ่มคำอธิบายประกอบลงในโค้ด ของแต่ละคน

คำมั่นสัญญาเป็นเหมือนผลไม้ต้องห้ามที่เราทุกคนอยากได้เมื่อเจ้านายบอกว่าเราควรใช้สิ่งต่าง ๆ เช่น Linux ทำไมมันถึงสำคัญ? เป็นเพราะ pledge() ทำให้เข้าใจการรักษาความปลอดภัยได้อย่างแท้จริง ลินุกซ์ไม่เคยมีชั้นความปลอดภัยที่มนุษย์ปุถุชนสามารถเข้าใจได้จริงๆ

ผู้พัฒนาพอร์ต Linux pledge ได้ทำตามแนวทางของ FreeBSDและแทนที่จะแก้ไขโค้ด พวกเขาได้เตรียมยูทิลิตี้เพิ่มเติมจาก pledge.com ที่ช่วยให้คุณสามารถกำหนดข้อจำกัดได้โดยไม่ต้องแก้ไขโค้ดแอปพลิเคชันของคุณ ตัวอย่างเช่น หากต้องการเรียกใช้ยูทิลิตี้ curl โดยเข้าถึงได้เฉพาะคลาสการเรียกใช้ระบบ stdio, rpath, inet และ threadstdio เท่านั้น ให้เรียกใช้คำสั่ง `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`

ยูทิลิตีนี้ใช้งานได้กับระบบปฏิบัติการ Linux ทุกเวอร์ชันตั้งแต่ RHEL6 ขึ้นไปและไม่จำเป็นต้องใช้สิทธิ์ root นอกจากนี้ ยังมี API ที่พัฒนาขึ้นจากไลบรารี cosmopolitan สำหรับจัดการข้อจำกัดในโค้ดโปรแกรมภาษา C ซึ่งช่วยให้สามารถสร้าง enclave เพื่อจำกัดการเข้าถึงฟังก์ชันเฉพาะของแอปพลิเคชันได้

ในอดีตมีนักพัฒนาไม่กี่คนที่พยายามทำเช่นนี้ ฉันจะไม่เอ่ยชื่อเพราะโครงการเหล่านี้ส่วนใหญ่ยังไม่เสร็จสมบูรณ์ เมื่อพูดถึง SECOMP บทช่วยสอนออนไลน์จะอธิบายเฉพาะวิธีการไวท์ลิสต์การโทรของระบบ ดังนั้นคนส่วนใหญ่จึงหมดความสนใจก่อนที่จะหาวิธีกรองอาร์กิวเมนต์ โครงการที่ก้าวไปข้างหน้ายังมีการกำกับดูแลเช่นอนุญาตให้เปลี่ยน setuid/setgid/sticky bits ดังนั้นจึงไม่ควรใช้ทางเลือกอื่นในปัจจุบัน ฉันคิดว่าความพยายามนี้ทำให้เราเข้าใกล้การจำนำ () มากขึ้นกว่าเดิม

การใช้งานไม่จำเป็นต้องเปลี่ยนแปลงเคอร์เนล: ข้อจำกัดของยูทิลิตี้จะถูกแปลเป็นกฎ SECCOMP BPF และประมวลผลโดยใช้กลไกการแยกการเรียกระบบดั้งเดิมของ Linux ตัวอย่างเช่น การเรียกสัญญา ("stdio rpath", 0) จะแปลงเป็นตัวกรอง BPF

สุดท้ายนี้ หากคุณสนใจเรียนรู้เพิ่มเติม สามารถดูรายละเอียดได้ที่ลิงก์ต่อไปนี้


เพิ่มเป็นแหล่งข้อมูลที่ต้องการใน Google