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

เมื่อเร็ว ๆ นี้ ผู้เขียนห้องสมุดมาตรฐาน Cosmopolitan C และแพลตฟอร์ม Redbean ประกาศผ่าน a ประกาศ การดำเนินการตามกลไกการแยก pledge() สำหรับ Linux

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

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

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

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

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

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

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

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

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

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

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

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


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา