Chromium Chronicle #8: GWP-ASan: ตรวจหาข้อบกพร่องในธรรมชาติ

ตอนที่ 8: โดย Vlad Tsyrklevich ในซีแอตเทิล รัฐวอชิงตัน (พฤศจิกายน 2019)
ตอนก่อนหน้า

การแก้ไขข้อผิดพลาดด้านความปลอดภัยของหน่วยความจำ เช่น การใช้งานหลังช่วงใช้ฟรี (Use After Free) หรือบัฟเฟอร์ล้น (Buffer Overflow) อาจเป็นเรื่องยาก เครื่องมืออย่าง AddressSanitizer (ASan) มีประโยชน์ในการระบุ ข้อผิดพลาดของหน่วยความจําในการทดสอบหน่วยและ fuzzer แต่ข้อบกพร่องจำนวนมากเกิดขึ้นหลังจากการทำให้ใช้งานได้สำหรับผู้ใช้ซึ่งมีค่าใช้จ่ายในการดำเนินงานของ ASan สูงเกินกว่าที่กำหนด

GWP-ASan เป็นเครื่องมือตรวจจับข้อผิดพลาดของหน่วยความจําแบบฮีปเท่านั้น ซึ่งออกแบบมาเพื่อใช้งานในธรรมชาติ โดยจะตรวจจับการใช้งานหลังช่วงใช้ฟรี บัฟเฟอร์ล้น/ส่วนไหลน้อยเกินไป และปล่อย 2 ชั้น แต่จะไม่ตรวจหาข้อผิดพลาดในสแต็กหรือใน globals ซึ่งต่างจาก ASan

การสุ่มตัวอย่างการจัดสรรเพียงไม่กี่เปอร์เซ็นต์ทำให้ GWP-ASan สามารถตรวจหาข้อผิดพลาดเกี่ยวกับความน่าจะเป็นที่มีหน่วยความจำและค่าใช้จ่ายในประสิทธิภาพไม่เพียงพอ GWP-ASan จะทำให้กระบวนการขัดข้องทันทีเมื่อเกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำกับการจัดสรรที่สุ่มตัวอย่าง ซึ่งช่วยให้เห็นข้อบกพร่องได้ง่ายขึ้น เนื่องจากการขัดข้องเกิดขึ้นในที่ที่เกิดข้อผิดพลาดแทนในภายหลังเมื่อใช้หน่วยความจำที่เสียหาย

รายงานข้อขัดข้องของ GWP-ASan จะมีการติดตามสแต็กการจัดสรรและดีลตำแหน่งเช่นเดียวกับ ASan เพื่อช่วยแก้ไขข้อบกพร่องของปัญหาด้านหน่วยความจำ ลองดูตัวอย่าง (crbug/956230) ของข้อมูลเพิ่มเติมบางส่วนที่แสดงใน UI ของข้อขัดข้อง

ทั้งการใช้และ Deallocation จะเริ่มมาจาก PDFiumEngine::ExtendSelection() แหล่งที่มาแสดงข้อบกพร่องอย่างรวดเร็วคือการใช้ตัววนซ้ำ std::vector ที่ใช้งานไม่ได้

มีการเปิดใช้ GWP-ASan ในเวอร์ชันเสถียรสำหรับการจัดสรรที่ใช้ malloc/new และ PartitionAlloc ใน Windows และ macOS Android กำลังให้การสนับสนุน ที่ผ่านมามีการรายงานข้อบกพร่องของ GWP-ASan กว่า 60 รายการและได้รับการแก้ไขแล้วประมาณ 70% ข้อขัดข้องของ GWP-ASan เป็นปัญหาด้านความปลอดภัยทั้งหมดของผู้รอการพิจารณาที่อาจแสวงหาประโยชน์ได้ ดังนั้นโปรดตรวจสอบข้อขัดข้องดังกล่าวอย่างรวดเร็วและขอ Backport (เมื่อจำเป็น)