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

Fuzzing-101

โครงสร้าง

  • แบบฝึกหัด 1: Xpdf, CVE-2019-13288, 120 นาที, Afl-clang-fast, Afl-fuzz, GDB
  • แบบฝึกหัด 2: libexif, CVE-2009-3895, CVE-2012-2836, 6 ชั่วโมง, Afl-clang-lto, การ fuzz ไลบรารี, Eclipse IDE
  • แบบฝึกหัด 3: TCPdump, CVE-2017-13028, 4 ชั่วโมง, ASan, Sanitizers
  • แบบฝึกหัด 4: LibTIFF, CVE-2016-9297, 3 ชั่วโมง, code coverage, LCOV
  • แบบฝึกหัด 5: Libxml2, CVE-2017-9048, 3 ชั่วโมง, พจนานุกรม, การทำงานขนานพื้นฐาน, การ fuzz อาร์กิวเมนต์บรรทัดคำสั่ง
  • แบบฝึกหัด 6: GIMP, CVE-2016-4994, บั๊กโบนัส, 7 ชั่วโมง, การ fuzz แบบต่อเนื่อง, การ fuzz แอปพลิเคชันแบบโต้ตอบ
  • แบบฝึกหัด 7: VLC Media Player, CVE-2019-14776, 6 ชั่วโมง, partial instrumentation, fuzzing harness
  • แบบฝึกหัด 8: Adobe Reader, 8 ชั่วโมง, การ fuzz แอปพลิเคชันแบบ closed-source, QEMU instrumentation
  • แบบฝึกหัด 9: 7-Zip, CVE-2016-2334, 8 ชั่วโมง, WinAFL, การ fuzz แอปพลิเคชันบน Windows
  • แบบฝึกหัด 10 (ความท้าทายสุดท้าย): Google Chrome / V8, CVE-2019-5847, 8 ชั่วโมง, Fuzzilli, การ fuzz JavaScript engine

บันทึกการเปลี่ยนแปลง

  • 14 กุมภาพันธ์ 2022: แก้ไขคำสะกดผิดของ wget ในแบบฝึกหัด 5
  • 25 พฤศจิกายน 2021: อัปเดตและแก้ไขแบบฝึกหัด 3

คอร์สนี้เหมาะสำหรับใคร?

  • ผู้ที่ต้องการเรียนรู้พื้นฐานของการ fuzz
  • ผู้ที่ต้องการค้นหาช่องโหว่ในโครงการซอฟต์แวร์จริง

ข้อกำหนด

  • ต้องมีระบบ Linux และการเชื่อมต่ออินเทอร์เน็ต
  • แนะนำให้มีทักษะ Linux พื้นฐาน
  • แบบฝึกหัดทั้งหมดได้รับการทดสอบบน Ubuntu 20.04.2 LTS
  • คอร์สนี้ใช้ AFL++ ซึ่งเป็น fork ใหม่ของ AFL โดย Michał "lcamtuf" Zalewski

Fuzzing คืออะไร?

  • Fuzz testing (หรือ fuzzing): เทคนิคการทดสอบซอฟต์แวร์แบบอัตโนมัติที่ป้อนข้อมูลแบบสุ่ม/ที่ถูกกลายพันธุ์ให้โปรแกรม และเฝ้าติดตามข้อยกเว้น/การแครช
  • AFL, libFuzzer, HonggFuzz เป็นตัวอย่างของ fuzzer ที่ประสบความสำเร็จในแอปพลิเคชันจริง
  • Coverage-guided evolutionary fuzzer: เลือกอินพุตที่ค้นหาเส้นทางการทำงานใหม่โดยรวบรวมและเปรียบเทียบข้อมูล code coverage

Coverage-guided evolutionary fuzzer

  • Evolutionary: แนวทางแบบ metaheuristic ที่ได้รับแรงบันดาลใจจาก evolutionary algorithm โดยค้นหาการแครชใหม่ผ่านการพัฒนาและการกลายพันธุ์ของชุดย่อยเริ่มต้น (seed)
  • Coverage-guided: เลือกอินพุตที่ค้นหาเส้นทางการทำงานใหม่โดยรวบรวมและเปรียบเทียบข้อมูล code coverage

คำขอบคุณ

  • ผู้ที่ให้ความช่วยเหลือ: Xavier RENE-CORAIL, Alan Vivona, Jason White, Octavio Gianatiempo, van Hauser, Marc Poulhiès, Xu Hanyu, tclan126, epi052, Jeremias Gomes

ช่องทางติดต่อ

  • หากต้องการความช่วยเหลือหรือมีข้อเสนอแนะ โปรดเข้าร่วมช่อง #fuzzing ใน GitHub Security Lab Slack

สรุปของ GN⁺

  • คอร์สนี้มีประโยชน์สำหรับการเรียนรู้แนวคิดพื้นฐานของ fuzzing และการค้นหาช่องโหว่ในซอฟต์แวร์จริง
  • สามารถเรียนรู้เทคนิคการ fuzz ผ่านกรณีศึกษาจริงที่หลากหลายโดยใช้เครื่องมืออย่าง AFL++
  • Fuzzing มีบทบาทสำคัญในการเสริมความเสถียรและความปลอดภัยของซอฟต์แวร์ และคอร์สนี้มอบแนวทางเชิงปฏิบัติสำหรับเรื่องนี้
  • เครื่องมือที่มีความสามารถคล้ายกันได้แก่ libFuzzer และ HonggFuzz

1 ความคิดเห็น

 
GN⁺ 2024-10-07
ความคิดเห็นจาก Hacker News
  • บทความที่ลิงก์ไว้ใช้เวลาอ่านราว 11 นาที และความแตกต่างจากแนวทางของ golang ก็น่าสนใจ

    • ใน golang สามารถรัน fuzzing ได้อย่างง่ายดายเหมือนรันการทดสอบ จึงสามารถกำหนดเป้าหมายไปยังบางส่วนของแอปพลิเคชันหรือไลบรารีได้สะดวก
    • วิธีแบบนี้ทำให้เทคนิคเดิมหลายอย่างไม่จำเป็นอีกต่อไป
  • สงสัยเกี่ยวกับเทคนิคที่ช่วยชี้นำ fuzzing ให้มีประสิทธิภาพมากขึ้น

    • วิธีที่ดีที่สุดดูเหมือนจะเป็นการเตรียม seed corpus ไว้ให้ แล้วคาดหวังผลลัพธ์ที่ดีที่สุด
  • น่าแปลกใจที่ไม่มี Heartbleed อยู่ในรายการ

    • Heartbleed เป็นสิ่งที่ทำซ้ำเพื่อทดสอบได้ง่ายมาก
  • มีความเห็นขอบคุณที่นำมาแชร์

    • คิดว่ามีประโยชน์มาก