1 điểm bởi GN⁺ 2024-10-07 | 1 bình luận | Chia sẻ qua WhatsApp
  • Fuzzing-101 là khóa học được tạo ra để người mới bắt đầu học fuzzing luyện tập quá trình tìm lỗ hổng trên các mục tiêu phần mềm thực tế
  • Khóa học gồm 10 mục tiêu thực tế và 10 bài thực hành, bao gồm Xpdf, libexif, TCPdump, LibTIFF, Libxml2, GIMP, VLC media player, Adobe Reader, 7-Zip, Google Chrome/V8
  • Mỗi bài thực hành hướng tới việc tái hiện hoặc phát hiện CVE, và sử dụng AFL++, ASan, LCOV, WinAFL, Fuzzilli cùng các lỗ hổng như CVE-2019-13288, CVE-2016-2334, CVE-2019-5847
  • Điều kiện tham gia là một hệ thống Linux có kết nối Internet, khuyến nghị có kỹ năng sử dụng Linux cơ bản, và mọi bài thực hành đều đã được kiểm thử trên Ubuntu 20.04.2 LTS
  • Fuzzing là kỹ thuật kiểm thử tự động đưa dữ liệu ngẫu nhiên hoặc đã biến đổi vào chương trình và theo dõi ngoại lệ hay crash, và khóa học này lấy hoạt động cơ bản của coverage-guided evolutionary fuzzer làm đối tượng học tập

Mục đích và đối tượng của khóa học

  • Fuzzing-101 là khóa học dành cho những ai muốn học fuzzing một cách bài bản nhưng chưa biết bắt đầu từ đâu
  • Khóa học gồm 10 mục tiêu thực tế10 bài thực hành
  • Độc giả mục tiêu gồm:
    • Những người muốn học kiến thức cơ bản về fuzzing
    • Những người muốn học cách tìm lỗ hổng trong các dự án phần mềm thực tế

Cấu trúc bài thực hành

  • Mỗi bài thực hành trình bày phần mềm cụ thể, CVE cần tìm, thời gian dự kiến và chủ đề chính
Bài thực hành Mục tiêu CVE cần tìm Thời gian dự kiến Chủ đề chính
Exercise 1 Xpdf CVE-2019-13288 120 phút Afl-clang-fast, Afl-fuzz, GDB
Exercise 2 libexif CVE-2009-3895, CVE-2012-2836 6 giờ Afl-clang-lto, fuzzing thư viện, Eclipse IDE
Exercise 3 TCPdump CVE-2017-13028 4 giờ ASan, Sanitizers
Exercise 4 LibTIFF CVE-2016-9297 3 giờ độ bao phủ mã, LCOV
Exercise 5 Libxml2 CVE-2017-9048 3 giờ dictionary, song song hóa cơ bản, fuzzing đối số dòng lệnh
Exercise 6 GIMP CVE-2016-4994, lỗi bonus 7 giờ fuzzing liên tục, fuzzing ứng dụng tương tác
Exercise 7 VLC media player CVE-2019-14776 6 giờ partial instrumentation, harness fuzzing
Exercise 8 Adobe Reader không có 8 giờ fuzzing ứng dụng mã nguồn đóng, QEMU instrumentation
Exercise 9 7-Zip CVE-2016-2334 8 giờ WinAFL, fuzzing ứng dụng Windows
Exercise 10 Google Chrome / V8 CVE-2019-5847 8 giờ Fuzzilli, fuzzing engine JavaScript

Môi trường chạy và công cụ

  • Yêu cầu là một hệ thống Linux có thể kết nối Internet
  • Có cung cấp image VMware để sử dụng trong bài thực hành
  • Rất khuyến nghị có kỹ năng sử dụng Linux cơ bản
  • Tất cả bài thực hành đều được kiểm thử trên Ubuntu 20.04.2 LTS
  • Khóa học sử dụng AFL++
    • AFL++ được giới thiệu là một bản fork mới hơn và tốt hơn từ AFL của Michał “lcamtuf” Zalewski

Khái niệm cơ bản về fuzzing

  • Fuzz testing hay fuzzing là kỹ thuật kiểm thử phần mềm tự động đưa đầu vào ngẫu nhiên hoặc đã biến đổi vào chương trình và theo dõi ngoại lệ hoặc crash
  • Các ví dụ về fuzzer thành công trên ứng dụng thực tế gồm AFL, libFuzzer, HonggFuzz
  • Cả ba công cụ này đều là ví dụ của coverage-guided evolutionary fuzzer

Coverage-guided evolutionary fuzzer

  • Cách tiếp cận evolutionary là một phương pháp metaheuristic lấy cảm hứng từ thuật toán tiến hóa
    • Tập đầu vào ban đầu là seed sẽ được tiến hóa và biến đổi theo thời gian
    • Coverage được dùng làm một ví dụ về tiêu chí lựa chọn
  • Coverage-guided fuzzer thu thập và so sánh dữ liệu độ bao phủ mã theo từng đầu vào để tăng khả năng tìm ra crash mới
    • Việc thu thập coverage thường được thực hiện thông qua instrumentation
    • Các đầu vào dẫn đến đường thực thi mới sẽ được chọn

Lịch sử thay đổi

  • 2022-02-14: Đã sửa một số lỗi gõ nhầm wget trong Exercise 5
  • 2021-11-25: Exercise 3 được cập nhật cùng một số chỉnh sửa

1 bình luận

 
GN⁺ 2024-10-07
Ý kiến trên Hacker News
  • Một giai thoại liên quan đến fuzzing: https://threadreaderapp.com/thread/1799457232607985698
    Đây là bài đọc rất đáng xem nếu bạn muốn phí khoảng 11 phút

    • Google trả về một bài CNET năm 2007, có lẽ là vì eEye đã “rải thông cáo báo chí khắp nơi”: https://www.cnet.com/news/privacy/flaw-found-in-office-2007/
      Tôi không hiểu lắm văn hóa thi nhau tìm lỗi trong sản phẩm của công ty khác, rồi tình cờ tìm được một lỗi trong Microsoft Publisher và khoe khoang để hạ thấp Microsoft
      Có lẽ tất cả chúng ta đều may mắn nếu có một công ty mà việc thức trắng cả tuần để kiểm thử sản phẩm của mình là “quy trình tiêu chuẩn”
    • Phong cách viết chắc chắn làm câu chuyện thú vị hơn
      Kiểm tra tác giả thì có thể là người tôi từng biết trên IRC, và “Mantis” với “infosec” khớp vừa đúng
  • Điều thú vị là cách tiếp cận này khác biệt rõ rệt với cách của Go
    Trong Go, bạn có thể chạy fuzzing đơn giản như chạy test, nên rất dễ nhắm vào các phần cụ thể của ứng dụng hoặc thư viện
    Vì vậy khá nhiều kỹ thuật trong số này trở nên không cần thiết
    Tôi tò mò về các kỹ thuật dẫn hướng fuzzing tốt hơn, nhưng hiện tại có vẻ cách tốt nhất là cung cấp seed corpus rồi hy vọng mọi chuyện ổn

    • Một số công cụ fuzzing như libFuzzer tận dụng biểu diễn trung gian LLVM để tạo chỉ số code coverage, rồi phản hồi chỉ số đó vào thuật toán fuzzing nhằm tăng test coverage
    • Tôi từng đề xuất ý tưởng dùng học tăng cường để dẫn hướng coverage làm đề tài tiến sĩ, nhưng rốt cuộc không đi theo hướng đó và cũng không biết liệu nó có hoạt động hay không
  • Tôi khá ngạc nhiên khi Heartbleed không có trong danh sách. Nó rất dễ tái hiện

    • Có lẽ bị bỏ qua vì các tutorial ở đây đều dùng file cục bộ hoặc dữ liệu cục bộ và không đề cập đến fuzzing dựa trên mạng