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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
บทความที่ลิงก์ไว้ใช้เวลาอ่านราว 11 นาที และความแตกต่างจากแนวทางของ golang ก็น่าสนใจ
สงสัยเกี่ยวกับเทคนิคที่ช่วยชี้นำ fuzzing ให้มีประสิทธิภาพมากขึ้น
น่าแปลกใจที่ไม่มี Heartbleed อยู่ในรายการ
มีความเห็นขอบคุณที่นำมาแชร์