Microsoft เปิดตัว CHERIoT โซลูชันฮาร์ดแวร์เพื่อปรับปรุงความปลอดภัยของโค้ด C

Microsoft ได้ค้นพบการพัฒนาที่เกี่ยวข้องกับโครงการ CHERIoT (Capability Hardware Extension to RISC-V for Internet of Things) ซึ่งมีวัตถุประสงค์เพื่อป้องกันปัญหาด้านความปลอดภัยในโค้ดที่มีอยู่ใน C และ C++ CHERIoT นำเสนอโซลูชันที่ช่วยให้คุณสามารถปกป้องฐานโค้ด C/C++ ที่มีอยู่ได้โดยไม่จำเป็นต้องแก้ไขฐานโค้ดเหล่านั้น การป้องกันจะดำเนินการผ่านการใช้คอมไพเลอร์ที่ได้รับการดัดแปลงซึ่งใช้ชุดคำสั่งโปรเซสเซอร์เพิ่มเติมพิเศษ (ISA) ซึ่งจัดทำโดยโปรเซสเซอร์และที่ระดับฮาร์ดแวร์ การตรวจสอบการเข้าถึงหน่วยความจำ ตรวจสอบความถูกต้องของการทำงานกับพอยน์เตอร์และรับรองการแยกบล็อกโค้ด

โปรเจ็กต์นี้สร้างขึ้นโดยคำนึงถึงความจริงที่ว่าธรรมชาติระดับต่ำของภาษา C กลายเป็นแหล่งที่มาของข้อผิดพลาดเมื่อทำงานกับหน่วยความจำ ซึ่งนำไปสู่ปัญหาต่างๆ เช่น บัฟเฟอร์ล้น การเข้าถึงหน่วยความจำที่ว่างแล้ว การหยุดชะงักของพอยน์เตอร์ หรือการว่างสองครั้ง . การปฏิบัติแสดงให้เห็นว่าแม้แต่องค์กรขนาดใหญ่เช่น Google และ Microsoft ซึ่งมีนโยบายการตรวจสอบการเปลี่ยนแปลงที่เข้มงวดและใช้วิธีการพัฒนาที่ทันสมัยและเครื่องมือวิเคราะห์แบบคงที่ก็ไม่สามารถรับประกันได้ว่าจะไม่มีข้อผิดพลาดเมื่อทำงานกับหน่วยความจำ (เช่น ประมาณ 70% ของช่องโหว่ใน Microsoft และ Google เกิดจากการจัดการหน่วยความจำที่ไม่ปลอดภัย)

ปัญหาสามารถแก้ไขได้โดยใช้ภาษาการเขียนโปรแกรมที่รับประกันการทำงานอย่างปลอดภัยด้วยหน่วยความจำ หรือการผูกด้วยการตรวจสอบเพิ่มเติม เช่น การใช้แทนพอยน์เตอร์ธรรมดาอย่าง MiraclePtr (raw_ptr) ซึ่งทำการตรวจสอบเพิ่มเติมสำหรับการเข้าถึงพื้นที่หน่วยความจำที่ว่าง แต่วิธีการดังกล่าวเหมาะสำหรับโค้ดใหม่มากกว่า และการนำโปรเจ็กต์ C/C++ ที่มีอยู่กลับมาทำใหม่นั้นค่อนข้างเป็นปัญหา โดยเฉพาะอย่างยิ่งหากได้รับการออกแบบมาให้ทำงานในสภาพแวดล้อมที่จำกัดทรัพยากร เช่น ระบบฝังตัว และอุปกรณ์ Internet of Things

ส่วนประกอบฮาร์ดแวร์ CHERIoT ได้รับการออกแบบให้เป็นไมโครคอนโทรลเลอร์โดยใช้สถาปัตยกรรม RISC-V โดยใช้สถาปัตยกรรมตัวประมวลผล CHERI (Capability Hardware Extension to RISC-V) ที่ได้รับการป้องกัน ซึ่งให้รูปแบบการเข้าถึงหน่วยความจำที่ควบคุมตาม "ความสามารถ" (การอ่านและเขียนแต่ละครั้ง อนุญาตให้ดำเนินการกับหน่วยความจำได้) ตามสถาปัตยกรรมชุดคำสั่ง (ISA) ที่ให้ไว้ใน CHERIoT รุ่นซอฟต์แวร์ถูกสร้างขึ้นเพื่อรับประกันความปลอดภัยในการทำงานกับหน่วยความจำในระดับของวัตถุแต่ละรายการ ให้การป้องกันการเข้าถึงหน่วยความจำที่ว่างแล้ว และใช้ระบบแยกการเข้าถึงหน่วยความจำน้ำหนักเบา . โมเดลการป้องกันซอฟต์แวร์ที่ระบุจะสะท้อนโดยตรงในโมเดลภาษา C/C++ ซึ่งช่วยให้สามารถใช้เพื่อปกป้องแอปพลิเคชันที่มีอยู่ได้ (จำเป็นต้องมีการคอมไพล์ใหม่และรันบนอุปกรณ์ที่รองรับ ISA CHERIoT เท่านั้น)

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

โปรเจ็กต์นี้ประกอบด้วยข้อกำหนดของสถาปัตยกรรมชุดคำสั่ง CHERIoT แบบขยาย การใช้งานอ้างอิงของ CPU RISC-V 32 บิตพร้อมการรองรับ CHERIoT ISA และชุดเครื่องมือ LLVM ที่ได้รับการดัดแปลง ไดอะแกรมต้นแบบ CPU และคำอธิบายบล็อกฮาร์ดแวร์ใน Verilog ได้รับการเผยแพร่ภายใต้ลิขสิทธิ์ Apache 2.0 แกน Ibex จากโครงการ lowRISC ถูกใช้เป็นพื้นฐานสำหรับ CPU โมเดลรหัส CHERIoT ISA ถูกกำหนดในภาษา Sail และได้รับอนุญาตภายใต้ใบอนุญาต BSD

นอกจากนี้ ยังมีการเสนอต้นแบบของระบบปฏิบัติการแบบเรียลไทม์ CHERIoT RTOS ซึ่งช่วยให้สามารถแยกส่วนต่าง ๆ ได้ แม้ในระบบฝังตัวที่มี RAM ขนาด 256 MB รหัส CHERIoT RTOS เขียนด้วยภาษา C++ และเผยแพร่ภายใต้ใบอนุญาต MIT ส่วนประกอบพื้นฐานของระบบปฏิบัติการ เช่น บูตโหลดเดอร์ ตัวกำหนดเวลา และระบบกระจายหน่วยความจำ ได้รับการออกแบบในรูปแบบของส่วนต่างๆ

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

ที่มา: opennet.ru

เพิ่มความคิดเห็น