พื้นฐาน Fuzzing 101
(github.com/antonio-morales)- Fuzzing-101 เป็นคอร์สที่สร้างขึ้นเพื่อให้ ผู้ที่เพิ่งเริ่มเรียนรู้การทำ fuzzing ได้ฝึกกระบวนการค้นหาช่องโหว่จากซอฟต์แวร์จริง
- คอร์สประกอบด้วย เป้าหมายจริง 10 รายการและแบบฝึกหัด 10 ชุด ครอบคลุม Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip และ Google Chrome/V8
- แบบฝึกหัดแต่ละชุดมีเป้าหมายเพื่อทำซ้ำหรือค้นหา CVE โดยใช้ช่องโหว่อย่าง CVE-2019-13288, CVE-2016-2334, CVE-2019-5847 ร่วมกับ AFL++, ASan, LCOV, WinAFL, Fuzzilli เป็นต้น
- เงื่อนไขการเรียนคือมี ระบบ Linux ที่เชื่อมต่ออินเทอร์เน็ตได้ แนะนำให้มีทักษะการใช้งาน Linux ขั้นพื้นฐาน และแบบฝึกหัดทั้งหมดผ่านการทดสอบบน Ubuntu 20.04.2 LTS
- Fuzzing คือเทคนิคการทดสอบอัตโนมัติที่ป้อนข้อมูลแบบสุ่มหรือแบบแปลงให้กับโปรแกรม แล้วเฝ้าดูข้อยกเว้นหรือการแครช โดยคอร์สนี้ใช้การทำความเข้าใจการทำงานพื้นฐานของ coverage-guided evolutionary fuzzer เป็นหัวข้อการเรียนรู้หลัก
วัตถุประสงค์และกลุ่มเป้าหมายของคอร์ส
- Fuzzing-101 เป็นคอร์สสำหรับผู้ที่อยากเรียนรู้การทำ fuzzing อย่างมืออาชีพ แต่ไม่รู้จะเริ่มต้นจากตรงไหน
- คอร์สประกอบด้วย เป้าหมายจริง 10 รายการ และ แบบฝึกหัด 10 ชุด
- ผู้อ่านเป้าหมาย ได้แก่
- ผู้ที่ต้องการเรียนรู้ พื้นฐานของ fuzzing
- ผู้ที่ต้องการเรียนรู้ วิธีค้นหาช่องโหว่ ในโครงการซอฟต์แวร์จริง
โครงสร้างแบบฝึกหัด
- แบบฝึกหัดแต่ละชุดจะแสดงซอฟต์แวร์ที่ใช้ CVE ที่จะค้นหา เวลาที่คาดว่าจะใช้ และหัวข้อหลัก
| แบบฝึกหัด | เป้าหมาย | CVE ที่จะค้นหา | เวลาที่คาดไว้ | หัวข้อหลัก |
|---|---|---|---|---|
| Exercise 1 | Xpdf | CVE-2019-13288 | 120 นาที | Afl-clang-fast, Afl-fuzz, GDB |
| Exercise 2 | libexif | CVE-2009-3895, CVE-2012-2836 | 6 ชั่วโมง | Afl-clang-lto, การทำ library fuzzing, Eclipse IDE |
| Exercise 3 | TCPdump | CVE-2017-13028 | 4 ชั่วโมง | ASan, Sanitizers |
| Exercise 4 | LibTIFF | CVE-2016-9297 | 3 ชั่วโมง | code coverage, LCOV |
| Exercise 5 | Libxml2 | CVE-2017-9048 | 3 ชั่วโมง | dictionary, parallelization ขั้นพื้นฐาน, command-line argument fuzzing |
| Exercise 6 | GIMP | CVE-2016-4994, บั๊กโบนัส | 7 ชั่วโมง | persistent fuzzing, interactive application fuzzing |
| Exercise 7 | VLC media player | CVE-2019-14776 | 6 ชั่วโมง | partial instrumentation, fuzzing harness |
| Exercise 8 | Adobe Reader | ไม่มี | 8 ชั่วโมง | การทำ fuzzing กับแอปพลิเคชันซอร์สปิด, QEMU instrumentation |
| Exercise 9 | 7-Zip | CVE-2016-2334 | 8 ชั่วโมง | WinAFL, การทำ fuzzing กับแอปพลิเคชัน Windows |
| Exercise 10 | Google Chrome / V8 | CVE-2019-5847 | 8 ชั่วโมง | Fuzzilli, การทำ fuzzing กับ JavaScript engine |
สภาพแวดล้อมการใช้งานและเครื่องมือ
- สิ่งที่ต้องมีคือ ระบบ Linux ที่เชื่อมต่ออินเทอร์เน็ตได้
- มีการจัดเตรียม VMware image สำหรับใช้งานในแบบฝึกหัด
- แนะนำอย่างยิ่งให้มี ทักษะการใช้งาน Linux ขั้นพื้นฐาน
- แบบฝึกหัดทั้งหมดผ่านการทดสอบบน Ubuntu 20.04.2 LTS
- ในคอร์สใช้ AFL++
- AFL++ ถูกอธิบายว่าเป็น fork ที่ใหม่กว่าและดีกว่าของ AFL ของ Michał “lcamtuf” Zalewski
แนวคิดพื้นฐานของ fuzzing
- การทดสอบแบบฟัซซ์ (fuzz testing) หรือ fuzzing คือเทคนิคการทดสอบซอฟต์แวร์อัตโนมัติที่ป้อนข้อมูลแบบสุ่มหรือข้อมูลที่ถูกแปลงให้กับโปรแกรม แล้วเฝ้าดูข้อยกเว้นหรือการแครช
- มีการยก AFL, libFuzzer, HonggFuzz เป็นตัวอย่างของ fuzzer ที่ประสบความสำเร็จในแอปพลิเคชันจริง
- เครื่องมือทั้งสามนี้ล้วนเป็นตัวอย่างของ coverage-guided evolutionary fuzzer
coverage-guided evolutionary fuzzer
- แนวทางแบบ evolutionary คือวิธี metaheuristic ที่ได้แรงบันดาลใจจากอัลกอริทึมเชิงวิวัฒนาการ
- มันจะทำให้ชุดข้อมูลป้อนเข้าเริ่มต้นหรือ seed ค่อย ๆ วิวัฒน์และแปลงไปตามเวลา
- ตัวอย่างของเกณฑ์การคัดเลือกคือ coverage
- fuzzer แบบ coverage-guided จะเก็บและเปรียบเทียบข้อมูล code coverage ของแต่ละอินพุต เพื่อเพิ่มโอกาสในการพบการแครชใหม่
- การเก็บ coverage โดยทั่วไปทำผ่าน instrumentation
- จะเลือกอินพุตที่นำไปสู่เส้นทางการทำงานใหม่
ประวัติการเปลี่ยนแปลง
- 2022-02-14: แก้ไขคำสะกดผิดบางส่วนของ
wgetใน Exercise 5 - 2021-11-25: Exercise 3 ได้รับการอัปเดตพร้อมการแก้ไขบางส่วน
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เกร็ดเล่าเกี่ยวกับ fuzzing: https://threadreaderapp.com/thread/1799457232607985698
เป็นบทความอ่านเล่นที่ดี หากอยาก เสียเวลาสักราว 11 นาที
ไม่ค่อยเข้าใจวัฒนธรรมที่แข่งกันหาบั๊กในผลิตภัณฑ์ของบริษัทอื่น แล้วพอเจอใน Microsoft Publisher ก็เอามาคุยโวพร้อมกด Microsoft
บางทีเราทุกคนอาจโชคดีแล้วก็ได้ ถ้ามีบริษัทที่มองว่าการอดหลับอดนอนทั้งสัปดาห์เพื่อทดสอบผลิตภัณฑ์ของเราเป็น “กระบวนการมาตรฐาน”
ลองดูผู้เขียนแล้ว อาจเป็นคนที่เคยรู้จักใน IRC ก็ได้ และคำว่า “Mantis” กับ “infosec” ก็ดูเข้ากันพอดี
สิ่งที่น่าสนใจคือแนวทางนี้ต่างจากแนวทางของ Go อย่างชัดเจน
ใน Go สามารถรัน fuzzing ได้ง่ายเหมือนรันเทสต์ ทำให้เล็งไปยังส่วนเฉพาะของแอปพลิเคชันหรือไลบรารีได้ง่ายมาก
ดังนั้นเทคนิคหลายอย่างในนี้จึงไม่จำเป็น
อยากรู้เทคนิคที่ช่วยชี้นำ fuzzing ให้ดีขึ้น แต่ตอนนี้ดูเหมือนวิธีที่ดีที่สุดคือให้ seed corpus แล้วหวังว่าจะออกมาดี
แปลกใจที่ไม่มี Heartbleed อยู่ในรายการ เพราะทำซ้ำได้ง่ายมาก