1 คะแนน โดย GN⁺ 2024-03-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การฟัซซิง 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 ความคิดเห็น

 
GN⁺ 2024-03-17
ความคิดเห็นจาก Hacker News
  • คุณค่าของสเปกได้รับการพิสูจน์ผ่านการมีหลายอิมพลีเมนเทชัน

    บทความนี้แสดงให้เห็นว่าทำไมการมีอิมพลีเมนเทชันของสเปกที่หลากหลายจึงสำคัญ พบปัญหาแล้วหนึ่งอย่าง และคาดว่าน่าจะมีอีก

  • ความเป็นไปได้ที่กลุ่มเล็ก ๆ ก็สามารถสร้างสิ่งที่น่าทึ่งได้

    แสดงความชื่นชมต่อการที่กลุ่มขนาดเล็กทำโปรเจ็กต์ที่น่าทึ่งได้ ซึ่งเป็นสิ่งที่ทำได้ยากในบริษัทที่มีผู้มีส่วนได้ส่วนเสีย

  • ประหลาดใจกับความคืบหน้าอันรวดเร็วของโปรเจ็กต์ผ่านการทำ SVG

    แสดงความประทับใจว่าโปรเจ็กต์ดำเนินไปเร็วกว่าที่คาด และหลงใหลกับข่าวที่ว่าการทำ SVG เสร็จแล้ว

  • ความจำเป็นของการเข้าถึงปัญหาอย่างลึกซึ้งในการพัฒนาซอฟต์แวร์

    โต้แย้งว่านักพัฒนาไม่ควรหยุดแค่การค้นหาและแก้ไขปัญหา แต่ควรเข้าใจสาเหตุรากเหง้าของปัญหาและค้นหาข้อผิดพลาดที่คล้ายกันทั่วทั้งโค้ดเบส พร้อมทั้งเน้นย้ำว่าแม้ความไม่เสถียรและปัญหาบั๊กของซอฟต์แวร์สมัยใหม่จะเกิดจากข้อจำกัดของทุนนิยม แต่การพัฒนาซอฟต์แวร์ที่ดีกว่านี้เป็นไปได้

  • ความสงสัยว่า Ladybird จะเข้าร่วม web engine hackfest หรือไม่

    แสดงความสนใจว่า Ladybird จะเข้าร่วม web engine hackfest ในปีนี้หรือไม่

  • ข้อสงสัยเกี่ยวกับการหายไปของวิดีโอ YouTube ที่เกี่ยวกับการแฮ็ก

    แสดงความเสียดายที่วิดีโอ YouTube เกี่ยวกับการแฮ็กไม่มีการอัปเดตอีกต่อไป

  • ปฏิกิริยาขำขันต่อการจับคู่คำว่า "fuzzing ladybird"

    แสดงความคิดเห็นว่าคำว่า "fuzzing ladybird" ฟังดูตลกและป่าเถื่อนดี

  • แอบหวังว่า Ladybird จะครองโลกได้สักวัน

    แอบหวังอย่างลับ ๆ ว่า Ladybird จะครองโลกได้ในสักวัน และกำชับว่าอย่าไปบอกใคร

  • [ความคิดเห็นถูกลบ]

    แจ้งว่ามีความคิดเห็นหนึ่งถูกลบไปแล้ว