การฟัซซิง Ladybird ด้วยเครื่องมือของ Google Project Zero
- Domato คือ DOM fuzzer ที่พัฒนาโดย Google Project Zero ซึ่งสร้างเว็บเพจจำนวนมากที่ส่วนใหญ่ถูกต้องแต่มีความแปลกอยู่ โดยประกอบด้วย HTML, CSS และ JavaScript
- เว็บเพจที่สร้างขึ้นมีขนาดราว 500 KiB และเต็มไปด้วย JS, CSS, HTML ที่ “น่าสนใจ” พอจะทำให้เอนจินเบราว์เซอร์สะดุดได้
- มีการระบุว่า Domato ค้นพบบั๊กจำนวนมากในเบราว์เซอร์หลัก ๆ และเมื่อนำมาใช้กับ Ladybird ก็พบปัญหาและแก้ไขได้
Issue #1: เมื่อแท็ก <th> อยู่ภายใน <mfrac>
- จากเอาต์พุตที่ Domato สร้างขึ้น พบปัญหาการใส่
<th> ไว้ภายใน <mfrac>
- ใน Ladybird ที่คอมไพล์ด้วย UBSAN (Undefined Behavior SANitizer) เกิดข้อผิดพลาด dereference ของ null pointer
- เดิมมีการ implement โดยสมมติว่า element
<th> และ <td> จะมี <table> อยู่ใน DOM tree ด้านบนเสมอ แต่กฎนี้สามารถถูกละเมิดได้เมื่อสร้าง DOM node ด้วยตนเองผ่าน JavaScript API
- เพื่อแก้ปัญหา จึงเลิกสมมติว่า
<th> และ <td> มี <table> รวมอยู่เสมอ และแก้ไขโดยใช้ first_ancestor_of_type<HTMLTableElement>()
Issue #2: การกำหนด window event handler ใน DOM ที่ถูกแยกออกมา
- ระหว่างรัน fuzzer ก็เจออีกปัญหาหนึ่งอย่างรวดเร็ว
- เอกสารที่สร้างผ่าน
DOMParser ไม่มี window object และทำให้เกิดปัญหานี้
- มีการแก้ไขให้
Document::window() คืนค่าแบบ nullable และจัดการกรณี null ในหลายจุด
- และแก้ให้การกำหนด
document.body.onblur ในเอกสารที่ไม่มี window ไม่ทำอะไรเลย
Issue #3: การเรียกซ้ำไม่สิ้นสุดใน SVG <linearGradient>
- SVG สามารถประกาศ gradient ที่อ้างอิง gradient อื่นเพื่อสืบทอดค่าสีได้
- ไม่ได้คำนึงถึงกรณีที่ gradient อ้างอิงตัวเอง จึงทำให้เกิดลูปไม่สิ้นสุด
- เพื่อรองรับกรณีที่วงจรการอ้างอิงมีหลายขั้น จึงติดตาม gradient ทั้งหมดที่เคยเยี่ยมชมไว้ และหยุดตาม chain เมื่อพบ gradient ที่เคยเยี่ยมชมแล้ว
Issue #4: การเข้าถึงพร็อพเพอร์ตีของ window ใน iframe ที่ถูกลบออก
- เมื่อ iframe ถูกลบออกจาก DOM เอกสารเนื้อหาของมันจะถูกแยกออกจาก browsing context
- พบข้อบกพร่องใน HTML spec ที่สมมติว่ามี browsing context อยู่เสมอเมื่อเข้าถึงพร็อพเพอร์ตีของ window object
- มีการเปิด issue ต่อ HTML spec และใน Ladybird ก็แก้ปัญหาด้วยการเพิ่มการตรวจสอบ null
Issue #5: ลูปไม่สิ้นสุดใน Element.before()
- หน้าเว็บไม่โหลดและการใช้งาน CPU ค้างอยู่ที่ 100%
- เกิดลูปไม่สิ้นสุดจากข้อผิดพลาดใน implementation ของ
before()
- แก้ไขโดยให้ไล่ตาม sibling chain ผ่าน
previous_sibling->previous_sibling แทน node->previous_sibling
บทสรุป
- ภายในหนึ่งวัน พบและแก้ไขบั๊กจริงได้ 5 รายการ
- เครื่องมืออย่าง fuzzer เป็นทรัพยากรที่ยอดเยี่ยมสำหรับผู้ที่ต้องการทำให้ซอฟต์แวร์มีความทนทานมากขึ้น
- เมื่อ Ladybird เสถียรพอที่จะรองรับอินพุตจากการฟัซซิงอย่างต่อเนื่องได้ ก็น่าจะสามารถรันอัตโนมัติบนคลาวด์เพื่อค้นหาปัญหาเพิ่มเติมได้
ความเห็นของ GN⁺
- บทความนี้อธิบายกระบวนการที่เอนจินเบราว์เซอร์ Ladybird ใช้ Domato fuzzer ของ Google Project Zero เพื่อค้นหาและแก้ไขบั๊กที่พบ
- การฟัซซิงเป็นเทคนิคที่มีประสิทธิภาพมากในการค้นหาช่องโหว่ด้านความปลอดภัยของซอฟต์แวร์ และนักพัฒนาสามารถใช้เพื่อทำให้โค้ดของตนแข็งแรงขึ้นได้
- บทความนี้ช่วยย้ำเตือนนักพัฒนาให้เห็นความสำคัญของการฟัซซิง และให้มุมมองเชิงลึกว่ามีการนำไปใช้จริงอย่างไร
- ในมุมวิพากษ์ การฟัซซิงคือการทดสอบปฏิกิริยาของซอฟต์แวร์ต่ออินพุตที่ไม่คาดคิด จึงอาจไม่ได้สะท้อนรูปแบบการใช้งานของผู้ใช้จริงทั้งหมด
- เครื่องมือฟัซซิงอื่นที่มีความสามารถคล้ายกัน ได้แก่ AFL (American Fuzzy Lop) และ LibFuzzer ซึ่งนักพัฒนาสามารถใช้ทดสอบโปรเจ็กต์ของตนได้
- ด้วยการนำเทคนิคนี้มาใช้ นักพัฒนา Ladybird สามารถแก้ไขบั๊กที่ค้นพบและเพิ่มเสถียรภาพของเบราว์เซอร์ได้ ซึ่งจะช่วยปรับปรุงประสบการณ์ผู้ใช้และเสริมความปลอดภัย
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
คุณค่าของสเปกได้รับการพิสูจน์ผ่านการมีหลายอิมพลีเมนเทชัน
ความเป็นไปได้ที่กลุ่มเล็ก ๆ ก็สามารถสร้างสิ่งที่น่าทึ่งได้
ประหลาดใจกับความคืบหน้าอันรวดเร็วของโปรเจ็กต์ผ่านการทำ SVG
ความจำเป็นของการเข้าถึงปัญหาอย่างลึกซึ้งในการพัฒนาซอฟต์แวร์
ความสงสัยว่า Ladybird จะเข้าร่วม web engine hackfest หรือไม่
ข้อสงสัยเกี่ยวกับการหายไปของวิดีโอ YouTube ที่เกี่ยวกับการแฮ็ก
ปฏิกิริยาขำขันต่อการจับคู่คำว่า "fuzzing ladybird"
แอบหวังว่า Ladybird จะครองโลกได้สักวัน
[ความคิดเห็นถูกลบ]