นักวิจัยมหาวิทยาลัยสแตนฟอร์ดที่ มหาวิทยาลัยแคลิฟอร์เนีย ในซานดิเอโก y la มหาวิทยาลัยเท็กซัส ในออสติน พวกเขามีการพัฒนา ชุดเครื่องมือที่พวกเขาตั้งชื่อให้ « RLBox », นี้ สามารถใช้เป็นฉนวนเพิ่มเติมได้ เพื่อป้องกันช่องโหว่ในไลบรารีฟังก์ชัน
RLBox มีจุดมุ่งหมายเพื่อแก้ปัญหาด้านความปลอดภัยของไลบรารีของบุคคลที่สาม ไม่น่าไว้วางใจที่ไม่ได้รับการควบคุมโดยนักพัฒนา แต่มีช่องโหว่ที่โครงการหลักสามารถประนีประนอมได้
Mozilla วางแผนที่จะใช้ RLBox ใน Firefox 74 builds สำหรับ Linux และ การรวบรวมของ macOS ใน Firefox 75 เพื่อแยกการทำงานของไลบรารี Graphiteซึ่งมีหน้าที่ในการแสดงแหล่งที่มา
ในขณะเดียวกัน RLBox ไม่ได้เฉพาะเจาะจงสำหรับ Firefox และสามารถใช้เพื่อแยกไลบรารีใด ๆ ในโครงการโดยพลการ
เกี่ยวกับ RLBox
กลไกการทำงาน RLBox รวบรวมโค้ด C / C ++ จากไลบรารีที่แยกเป็นรหัส WebAssembly ระดับกลาง ระดับต่ำซึ่งจากนั้นจะออกเป็นโมดูล WebAssembly สิทธิ์ที่ถูกตั้งค่าให้ผูกกับโมดูลนี้เท่านั้น (ตัวอย่างเช่นไลบรารีสำหรับการประมวลผลสตริงไม่สามารถเปิดซ็อกเก็ตหรือไฟล์เครือข่าย) การแปลงรหัส C / C ++ WebAssembly ทำได้โดยใช้ wasi-sdk
สำหรับการดำเนินการโดยตรง โมดูล WebAssembly ถูกคอมไพล์เป็นรหัสเครื่องโดยใช้คอมไพเลอร์ Lucet และทำงานใน "กระบวนการนาโน" แยกจากหน่วยความจำที่เหลือของแอปพลิเคชัน คอมไพเลอร์ Lucet ใช้รหัสเดียวกับกลไก Cranelift JIT ที่ใช้ใน Firefox เพื่อเรียกใช้ WebAssembly
โมดูลที่ประกอบจะทำงานในพื้นที่หน่วยความจำแยกต่างหาก และไม่สามารถเข้าถึงพื้นที่ที่อยู่ที่เหลือได้ ในกรณีของการใช้ประโยชน์จากช่องโหว่ในไลบรารีผู้โจมตีจะถูก จำกัด และจะไม่สามารถเข้าถึงพื้นที่หน่วยความจำของกระบวนการหลักหรือการควบคุมการถ่ายโอนนอกแซนด์บ็อกซ์
API ระดับสูงมีไว้สำหรับนักพัฒนาซึ่งช่วยให้คุณสามารถเรียกใช้ฟังก์ชันไลบรารีในโหมดแยกได้
ลอส ตัวควบคุม WebAssembly แทบไม่ต้องใช้ทรัพยากรเพิ่มเติม และการโต้ตอบกับพวกเขานั้นไม่ช้าไปกว่าการเรียกใช้ฟังก์ชันธรรมดามากนัก (ฟังก์ชันไลบรารีทำงานในรูปแบบของโค้ดเนทีฟและโอเวอร์โหลดเกิดขึ้นเฉพาะเมื่อคัดลอกและตรวจสอบข้อมูลในกระบวนการโต้ตอบกับสภาพแวดล้อมแซนด์บ็อกซ์) .
ไม่สามารถเรียกใช้ฟังก์ชันของไลบรารีที่แยกได้โดยตรงและในการเข้าถึงคุณต้องใช้เลเยอร์ invoke_sandbox_function ()
ในทางกลับกันหากจำเป็นต้องเรียกใช้ฟังก์ชันภายนอกจากไลบรารีฟังก์ชันเหล่านี้จะต้องกำหนดไว้อย่างชัดเจนโดยใช้เมธอด register_callback (โดยค่าเริ่มต้น RLBox จะให้การเข้าถึงฟังก์ชันไลบรารีมาตรฐาน)
เพื่อให้แน่ใจว่าการทำงานของหน่วยความจำปลอดภัย การแยกการเรียกใช้รหัสไม่เพียงพอ และยัง คุณต้องให้การตรวจสอบสตรีมข้อมูลที่ส่งคืน
ค่าที่สร้างขึ้นในสภาพแวดล้อมที่แยกได้จะถูกทำเครื่องหมายว่าไม่น่าเชื่อถือถูก จำกัด ด้วยแท็กที่ปนเปื้อนและต้องมีการตรวจสอบและคัดลอกไปยังหน่วยความจำของแอปพลิเคชันสำหรับ "การล้างข้อมูล"
หากไม่มีการทำความสะอาดความพยายามที่จะใช้ข้อมูลที่เป็นมลพิษในบริบทที่ต้องใช้ข้อมูลปกติ (และในทางกลับกัน) จะนำไปสู่การสร้างข้อผิดพลาดในขั้นตอนการรวบรวม
อาร์กิวเมนต์ของฟังก์ชันขนาดเล็กค่าส่งกลับและโครงสร้างจะถูกส่งผ่านโดยการคัดลอกระหว่างหน่วยความจำกระบวนการและหน่วยความจำแซนด์บ็อกซ์ สำหรับชุดข้อมูลขนาดใหญ่หน่วยความจำจะถูกจัดสรรในสภาพแวดล้อมที่แยกต่างหากและตัวชี้ "การอ้างอิงแซนด์บ็อกซ์" โดยตรงจะถูกส่งกลับไปยังกระบวนการหลัก
การพัฒนา RLBox จัดจำหน่ายภายใต้ใบอนุญาต MIT. ปัจจุบัน RLBox รองรับ Linux และ macOS และคาดว่าจะเข้ากันได้กับ Windows ในภายหลัง
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับเทคโนโลยีใหม่นี้ที่ Mozilla มีแผนจะนำไปใช้ใน Firefox คุณสามารถปรึกษาการพัฒนาและทดสอบ API ได้ ในลิงค์ต่อไปนี้.