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

 
GN⁺ 2024-10-07
ความคิดเห็นบน Hacker News
  • เกร็ดเล่าเกี่ยวกับ fuzzing: https://threadreaderapp.com/thread/1799457232607985698
    เป็นบทความอ่านเล่นที่ดี หากอยาก เสียเวลาสักราว 11 นาที

    • ค้นใน Google แล้วเจอบทความ CNET ปี 2007 น่าจะเพราะ eEye “หว่านข่าวประชาสัมพันธ์ไปทั่ว”: https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      ไม่ค่อยเข้าใจวัฒนธรรมที่แข่งกันหาบั๊กในผลิตภัณฑ์ของบริษัทอื่น แล้วพอเจอใน Microsoft Publisher ก็เอามาคุยโวพร้อมกด Microsoft
      บางทีเราทุกคนอาจโชคดีแล้วก็ได้ ถ้ามีบริษัทที่มองว่าการอดหลับอดนอนทั้งสัปดาห์เพื่อทดสอบผลิตภัณฑ์ของเราเป็น “กระบวนการมาตรฐาน”
    • สไตล์การเขียนช่วยเพิ่มความสนุกได้ชัดเจน
      ลองดูผู้เขียนแล้ว อาจเป็นคนที่เคยรู้จักใน IRC ก็ได้ และคำว่า “Mantis” กับ “infosec” ก็ดูเข้ากันพอดี
  • สิ่งที่น่าสนใจคือแนวทางนี้ต่างจากแนวทางของ Go อย่างชัดเจน
    ใน Go สามารถรัน fuzzing ได้ง่ายเหมือนรันเทสต์ ทำให้เล็งไปยังส่วนเฉพาะของแอปพลิเคชันหรือไลบรารีได้ง่ายมาก
    ดังนั้นเทคนิคหลายอย่างในนี้จึงไม่จำเป็น
    อยากรู้เทคนิคที่ช่วยชี้นำ fuzzing ให้ดีขึ้น แต่ตอนนี้ดูเหมือนวิธีที่ดีที่สุดคือให้ seed corpus แล้วหวังว่าจะออกมาดี

    • เครื่องมือ fuzzing บางตัวอย่าง libFuzzer ใช้ LLVM intermediate representation เพื่อสร้างตัวชี้วัด code coverage แล้วป้อนกลับเข้าอัลกอริทึม fuzzing เพื่อเพิ่ม test coverage
    • เคยเสนอไอเดียใช้ reinforcement learning เพื่อชี้นำ coverage เป็นหัวข้อปริญญาเอก แต่สุดท้ายไม่ได้เดินทางนั้น และก็ไม่รู้ว่าจะใช้งานได้จริงหรือไม่
  • แปลกใจที่ไม่มี Heartbleed อยู่ในรายการ เพราะทำซ้ำได้ง่ายมาก

    • น่าจะถูกตัดออกเพราะบทเรียนที่นี่ทั้งหมดใช้ไฟล์หรือข้อมูลในเครื่อง และไม่ได้พูดถึง network-based fuzzing