ผู้พัฒนาโครงการ Chromium การศึกษาได้วิเคราะห์ช่องโหว่ร้ายแรงและวิกฤต 912 รายการที่พบใน Chrome เวอร์ชันเสถียรตั้งแต่ปี 2015 สรุปได้ว่า 70% ของช่องโหว่เหล่านี้เกิดจากความไม่ปลอดภัยของหน่วยความจำ (ข้อผิดพลาดในการจัดการตัวชี้ในโค้ด C/C++) ครึ่งหนึ่งของปัญหาเหล่านี้ (36.1%) เกิดจากการเข้าถึงบัฟเฟอร์แบบใช้หลังจากปลดปล่อยแล้ว
เมื่อโครเมียมได้รับการออกแบบมา เดิมทีนั้น เนื่องจากไม่สามารถตัดข้อผิดพลาดในโค้ดออกไปได้ จึงมีการให้ความสำคัญอย่างมากกับการแยกแซนด์บ็อกซ์เพื่อจำกัดผลกระทบของช่องโหว่ ปัจจุบัน การประยุกต์ใช้เทคโนโลยีนี้ถึงขีดจำกัดแล้ว และการแบ่งกระบวนการย่อยออกไปอีกนั้นไม่สามารถทำได้ในทางปฏิบัติในแง่ของการใช้ทรัพยากร
เพื่อรักษาความปลอดภัยของฐานรหัส Google ยังใช้ "" ซึ่งตามข้อกำหนดนี้ โค้ดที่เพิ่มเข้ามาจะต้องเป็นไปตามเงื่อนไขไม่เกินสองในสามข้อ ได้แก่ การจัดการข้อมูลอินพุตที่ไม่น่าเชื่อถือ การใช้ภาษาโปรแกรมที่ไม่ปลอดภัย (C/C++) และการรันด้วยสิทธิ์ที่สูงกว่า กฎนี้หมายความว่าโค้ดสำหรับประมวลผลข้อมูลภายนอกจะต้องถูกจำกัดสิทธิ์ให้เหลือน้อยที่สุด (แยกไว้ต่างหาก) หรือเขียนด้วยภาษาโปรแกรมที่ปลอดภัย
เพื่อเสริมสร้างความปลอดภัยของฐานโค้ดให้ดียิ่งขึ้น จึงได้มีการเปิดตัวโครงการเพื่อป้องกันข้อผิดพลาดหน่วยความจำไม่ให้ปรากฏในฐานโค้ด โดยมีแนวทางหลัก 3 ประการ ได้แก่ การสร้างไลบรารี C++ ที่มีฟังก์ชันสำหรับการจัดการหน่วยความจำอย่างปลอดภัย การขยายขอบเขตของตัวรวบรวมขยะ และการใช้กลไกการป้องกันฮาร์ดแวร์ (Memory Tagging Extension) และการเขียนส่วนประกอบในภาษาที่ให้ความปลอดภัยของหน่วยความจำ (Java, Kotlin, JavaScript, Rust, Swift)
คาดว่างานจะมุ่งเน้นไปที่สองด้าน:
- การเปลี่ยนแปลงครั้งสำคัญในกระบวนการพัฒนา C++ ซึ่งอาจส่งผลเสียต่อประสิทธิภาพ (เช่น การตรวจสอบขอบเขตเพิ่มเติมและการเก็บขยะ) แทนที่จะใช้ตัวชี้แบบดิบ แนะนำให้ใช้ประเภทในโค้ด ซึ่งช่วยให้สามารถลดลงข้อผิดพลาดจากการใช้งานหลังจากปลดปล่อยแล้วที่สามารถใช้ประโยชน์ได้ให้เหลือเพียงความผิดพลาดที่ไม่ก่อให้เกิดภัยคุกคามต่อความปลอดภัย โดยไม่มีผลกระทบด้านลบที่เห็นได้ชัดต่อประสิทธิภาพ การใช้หน่วยความจำ และความเสถียร
- การใช้ภาษาที่ออกแบบมาเพื่อดำเนินการตรวจสอบความปลอดภัยของหน่วยความจำในเวลาคอมไพล์จะช่วยขจัดผลกระทบเชิงลบต่อประสิทธิภาพที่เกิดขึ้นจากการตรวจสอบดังกล่าวในระหว่างการรันไทม์ แต่จะนำไปสู่ต้นทุนเพิ่มเติมในการจัดระเบียบการโต้ตอบระหว่างโค้ดในภาษาใหม่กับโค้ดใน C++
การใช้ไลบรารีที่ปลอดภัยต่อหน่วยความจำเป็นวิธีที่ง่ายที่สุด แต่ก็มีประสิทธิภาพน้อยที่สุดเช่นกัน การเขียนโค้ดใหม่ใน Rust ถือเป็นวิธีที่มีประสิทธิภาพมากที่สุด แต่ก็มีค่าใช้จ่ายสูงที่สุดเช่นกัน
ที่มา: opennet.ru
