dịch lại mã nguồn của chương trình được fuzzing và chèn mã phụ (instru-
mentation code) vào để ghi lại độ phủ mã. Các công cụ fuzzing có thể thiết
kế trình biên dịch đặc biệt được làm lại để thêm mã phụ để ghi lại các
phần mã được thực thi, hoặc sử dụng các phương pháp khác như tạo bản
đồ trạng thái (state map) để theo dõi độ phủ. Khi tiến hành fuzzing, công
cụ chạy fuzzing với ứng dụng đã được biên dịch lại và tương tac với các mã
phụ được chèn vào để lấy độ phủ mã được ứng dụng ghi lại. Đây là phương
24
pháp mang tính ổn định và hiệu suất tốt nhất, nhưng có thể yêu cầu thời gian, công sức và đặc biệt là yêu cầu mã nguồn để thực hiện.
. Sử dụng cơ chế ảo hóa: Phương pháp này sử dụng việc tạo nên các môi trường fuzzing ảo dé theo déi và ghi lại các hoạt động của chương trình nhờ việc kiểm soát được nhân (kernel) của môi trường ảo. Các công cụ fuzzing
có thể sử dung các phần mềm ảo hóa như QEMU, Unicorn, ... để dựng môi trường fuzzing ảo ghi lại thông tin về độ phủ mã khi chạy. Ưu điểm của phương pháp này là tính linh hoạt cao (có thể kết hợp để fuzzing trên các kiến trúc khác), tuy nhiên điểm yếu lớn nhất là tốc độ chạy chậm và đòi hỏi kiến thức lớn để xử lí nếu gặp các lỗi trong quá trình dựng. Đây là phương pháp có tốc độ chạy chậm nhất trong 3 phương pháp.
. Sử dụng cơ chế móc (hook): Phương pháp này sử dụng các kĩ thuật móc (hook) để tiến hành chèn các mã phụ (instrumentation code) vào chương
trình. Phương pháp này tương tự phương pháp 1 nhưng khác là việc chèn
các mã phụ sẽ được thực hiện khi chạy chương trình, không phải khi biên
dịch. Một trong các công cụ móc phổ biến được sử dụng là frida. Day là một phương pháp khá mới và được phát triển trong thời gian gần đây. Một trong các công cụ fuzzing phổ biến có hỗ trợ phương pháp này là AFLplusplus.
Đây được xem là phương pháp trung hòa giữa 2 phương pháp trên và được
sử dụng rất phổ biến nhờ tính tiện dụng. Phương pháp này không cần mã nguồn để thực hiện biên dịch lại như phương pháp 1, tuy nhiên sẽ chạy chậm hơn phương pháp 1 và yêu cầu thời gian để chèn mã phụ vào đầu
mỗi lần chạy. N6 chạy nhanh hơn phương pháp 2 do không cần phải
dựng môi trường ảo hóa, nhưng cũng đánh đổi bằng sự linh hoạt khi không thể fuzz trên các kiến trúc khác với kiến trúc hệ thống. Tuy nhiên do có tốc
độ tốt và không cần mã nguồn, nó trở thành phương pháp ưu tiên nhất đổi
với fuzzing hộp xám.
25
2.2.5. Các thông số so sứnh của fuzzing
Ở phần này chúng tôi giải thích về ý nghĩa các thông số quan trọng thường
được sử dụng để đánh giá fuzzing, bao gồm độ phủ mã, số đường đi, thời gian thục thi, số lần thử, bảng theo dấu, số lượng hạt giống, độ sâu biến doi.
e Độ phủ ma (Coverage): Dây là số lượng phần mã mà các mau thử đã
đi đến thành công. Do lường sự phủ sóng của các mau thử trong quá trình
fuzzing. Đây là tham số quan trọng nhất trong đánh giá fuzzing hộp xám
dựa trên độ phủ mã. Mục tiêu là tăng cường độ phủ sóng này để khám phá được nhiều lỗi tiềm an hơn.
e Số đường đi (Unique Path): Số lượng các đường đi (path) khác nhau
mà các mau thử đã đi qua. Mỗi đường di đại diện cho một chuỗi các nhánh (edge) hoặc các điểm rẽ nhánh trong mã nguồn. Đếm số lượng đường đi
giúp đánh giá khả năng khám phá các đường đi khác nhau của chương trình.
e Thời gian thực thi (Time Execs): Thời gian đã trôi qua trong quá trình
fuzzing, được tính bằng đơn vị giây. Dây là thời gian thực tế đã dành cho
việc thực thi các mầu thử và tìm kiếm lỗi.
e Số lần thử (Execs Done): Đây là số lần chương trình thực thi một mẫu
thử được tạo ra sau khi biến đổi đầu vào và lấy thông tin độ phủ mã về.
Thông số này phản ảnh tốc độ thực thi của công cụ fuzzing và đồng thời là
độ hiệu quả của cơ chế lấy độ phủ mã mà công cụ sử dụng.
e Bảng theo dấu (Trace Bits): Là một mảng, hoặc một chuỗi các byte/bit
được sử dụng để dánh dấu đường đi của chương trình, mục tiêu là để tính độ
phủ mã cũng như số đường đi của chương trình sau khi chạy. Mỗi byte/bit có
thể tương ứng với một nhánh (edge), một dòng (line), một hàm (function)
hay một khối (block), tùy thuộc và cơ chế tính độ phủ mã mà công cụ sử
26
dụng. Mỗi khi mau thử đi qua một nhánh/dòng/hàm/khối, byte/bit trong
bảng theo dấu tương ứng sẽ được đánh dấu là 1, hoặc được cộng giá trị lên