Q'=SEED_SELECTION_AND_ SCHEDULE(Q)
CHƯƠNG 4. THÍ NGHIỆM VÀ ĐÁNH GIÁ
4.1. Thiết lập thí nghiệm
4.1.1. Mục tiêu của thi nghiệm,
Dựa trên các cải tiền mà nhóm kì vọng ở mô hình được trình bày phía trên, trong phần thí nghiệm này, nhóm sẽ tiến hành tập trung trả lời các câu hỏi sau:
Câu hỏi 1: Dộ hiệu quả của mô hình so với mô hình fuzzing sử dụng học tăng cường cũ (mô hình rlfuzz, được mô tả trong 4.1.2.2)?
Câu hỏi 2: Hiệu quả của mô hình so với 1 công cụ fuzzing hiện đại là như
thé nào (AFLplusplus)?
Cau hỏi 3: Mttc độ đóng góp của mô hình hoc tăng cường được sử dung trong toàn bộ mô hình?
Câu hỏi 4: Nếu cải thiện được sự chênh lệch tốc độ giữa các ngôn ngữ, hiệu quả của mô hình sẽ như thế nào?
Để trả lời 4 câu hỏi đó, chúng tôi tiến hành thiết lập thí nghiệm để đánh giá
hiệu quả của mô hình. Với câu hỏi đầu tiên, chúng tôi tiến hành so sánh mức độ
hiệu quả của mô hình chúng tôi so với mô hình rlfuzz trong cùng khoảng thời
gian thực thi, dựa trên 2 thông số là độ phủ mã và số lượng đường dẫn thực thi, đây là 2 tham số đại diện cho tính khai thác và tính khám phá của mô hình.
Chúng tôi sử dụng cách thức tương tự đối để trả lời cho câu hỏi thứ 2, và đối tượng so sánh lần này sẽ là AFLplusplus. Dé trả lời câu hỏi thứ 3, chúng tôi so sánh CTFuzz với cơ chế ngẫu nhiên được tạo ra để tách mô hình học tăng cường
64
ra khỏi mô hình tổng và đánh giá sự chênh lệch về mặt hiệu suất của việc chọn hành động biến đổi dựa trên học tăng cường so với chọn hành động biến đổi ngẫu nhiên. Tiếp theo ở câu hỏi cuối cùng, đây là một câu hỏi khác đặc biệt mà nhóm chúng tôi đặt ra. Một vấn đề lớn là các mô hình fuzzing sử dụng học tăng
cường thường sử dụng ngôn ngữ python để triển khai vì tính dé sử dụng, trong
đó các công cụ fuzzing thực tế thường dùng các ngôn ngữ như C, điều này dẫn đến sự chênh lệch tốc độ chạy lớn giữa cả 2. Tuy nhiên, tốc độ chạy của python
có thể cải thiện nếu chúng ta chuyển sang ngôn ngữ khác như Rust (thực tế đã
có rất nhiều nghiên cứu sử dụng), việc này thường không dễ để thực hiện, tuy
nhiên vẫn là khả thi. Vì thế, câu hỏi đặt ra là nếu mô hình chúng tôi được viết
bằng các ngôn ngữ có tốc độ cao hơn, liệu nó có thể đạt được hiệu quả so với các công cụ fuzzing thực tế hay không? Để tìm câu trả lời cho điều này, chúng tôi so sánh độ phủ mã và số lượng đường dẫn tìm được ở tất cả các mô hình sau 200000 lần thử đầu, cách so sánh này có thể giúp ta bỏ qua vấn đề về tốc
độ giữa các ngôn ngữ (C, python), mà quan tâm đến hiệu suất sau mỗi lần thử. Câu hỏi cuối cùng giống như một sự đánh giá cho việc liệu có nên bỏ công sức
để triển khai mô hình trên một ngôn ngữ nhanh hơn như Rust hay không.
Tom lại, dựa trên 4 câu hỏi trên, chúng tôi tiến hành thử nghiệm so sánh giữa
4 mô hình bao gồm CTFuzz (mô hình của chúng tôi), rlfuzz (mô hình fuzzing
sử dụng học tăng cường từ nhóm tác giả Zhang, Zheng), AFLplusplus (công
cụ fuzzing hiện đại) và cơ chế ngẫu nhiên (là mô hình của chúng tôi nhưng thay phần học tăng cường bằng cách chọn ngẫu nhiên) dựa trên 3 thông số là
độ phủ mã (coverage), số đường dẫn thực thi (unique_ path) và tốc độ chạy (execution times), theo 2 ngữ cảnh: sau 6 tiếng chạy và sau 200000 lần thử đầu.
4.1.2. Cài đặt các mé hinh so sánh
Ỏ phần này chúng tôi giới thiệu về các mô hình chúng tôi sử dụng để so sánh,
cách cài đặt, các tham số được sử dung, bao gồm AFLplusplus, rifuzz, CT Fuzz,
65
và cơ chế ngẫu nhiên.
4.1.2.1. AFLplusplus
AFLplusplus là một công cụ fuzzing hiện đại, dang được sử dụng cực kì phổ biến và rộng rãi. AFLplusplus được phát triển từ AFL (American Fuzzy Lop) là một công cụ fuzzing nổi tiếng từ google nhưng đã ngưng phát triển. AFLplusplus
là công cụ fuzzing hộp xám sử dụng độ phủ mã và các thông tin khi chạy để tối
ưu hóa fuzzing. AFLplusplus tạo ra các mau thử bằng cách áp dung các hành động biến đổi lên một đầu vào ban đầu được cung cấp từ người dùng, vì vậy nó thuộc dang công cụ fuzzing dựa trên biến đổi, đặc điểm là để tránh các đầu vào tạo ra có sự khác biệt quá lớn từ đó đi sai ra khỏi cấu trúc đặc biệt của đầu vào (ví dụ: định dang PDF, định dạng tệp thực thi, ...). AFLplusplus được thiết kế hướng đến sự hiệu quả trong thực tiễn khi fuzzing thay vì một nguyên lý vận hành cụ thể và không phải là một bằng chứng cho bất kỳ lý thuyết cu thể nào, công cụ có thể được coi như một tập hợp các cách thức giải pháp đã được thử
nghiệm trong thực tế, đạt được hiệu quả tốt và được thực hiện một cách đơn giản, mạnh mẽ nhất, các nguyên tắc thực sự hướng đến chỉ là tốc độ, đáng tin cậy va dễ sử dụng. AFLplusplus còn cung cấp các cơ chế tiện dụng khác như
trình biên dịch đặc biệt (dùng để biên dịch và chèn mã phụ cho việc fuzzing), cơ
chế ảo hóa và cơ chế móc mang lại tính đa dụng và hiệu quả. Việc là một công
cụ mã nguồn mở còn cho phép các nhà nghiên cứu tùy chỉnh, cá nhân hóa cho phù hợp với từng ngữ cảnh fuzzing và dễ dàng nghiên cứu phát triển.
Trong nghiên cứu này của chúng tôi, chúng tôi sử dụng AFLplusplus như là
một đại diện cho nhóm các công cụ fuzzing được sử dụng trong thực tế, so sánh hiệu quả khi chạy của CTFuzz với AFLplusplus sẽ cho ta góc nhìn về tính thực tiễn của mô hình CTFuzz. Chúng tôi biên dịch AFLplusplus phiên bản 4.05e trên
hệ điều hành Ubuntu 20.04.1 LTS, gec/g++ 9.4.0, emake 3.26.3, make 4.2.1, ... tất cả đều là mặc định trên hệ điều hành vào lúc cài đặt. Chương trình mục tiêu được fuzz với chế độ frida và các lựa chọn còn lại là mặc định (sử dụng
66
forkserver, không sử dụng hành động Dictionary). Ngoài ra, chúng tôi thêm một
đoạn mã nhỏ vào mã nguồn AFLplusplus để giúp tính toán số lượng đường dẫn
thực thi (unique_ path).
4.1.2.2. rifuzz
Dây là mô hình fuzzing sử dụng học tăng cường được đề xuất bởi nhóm tác giả Zheng Zhang trong [18]. Trong mô hình này, tác giả sử dung mô hình học
tăng cường DDPG để chọn hành động biến đổi đầu vào khi fuzzing. Thiết kế
về trạng thái và hành động của rlfuzz so với CTFuzz là giống nhau, khác biệt ở
cơ chế điểm thưởng và cấu trúc thiết kế của môi trường tương tác, nơi CTFuzz triển khai thêm các thuật toán tối ưu và thuật toán chọn và lập lịch đầu vào.
Mô hình DDQG trong rifuzz sử dụng gồm 2 lớp mang là actor và critic. Lớp
mạng actor gồm 2 lớp mạng ẩn 1024 và 128 nút, Kích thước của lớp đầu vào
là kích thước của không gian trạng thái và kích thước của lớp đầu ra là kích thước của không gian hành động, hàm kích hoạt ở lớp cuối cùng được sử dụng
là softmax. Lớp mang critic gồm 2 lớp mạng an 1024 và 128 nút, kích thước của
lớp đầu vào là kích thước của không gian trạng thái và kích thước của lớp đầu
ra là 1, hàm kích hoạt ở lớp cuối cùng được sử dụng là sigmoid.
Phương thức lấy độ phủ mã của rlfuzz cũng gần tương tự với CTFuzz nhưng
được triển khai ở phiên ban cũ hơn là AFL, tuy nhiên độ phủ mã được sử dụng van là độ phủ mã theo cạnh và cách tính độ phủ mã vẫn tương tự. Cơ chế điểm thưởng ở mô hình rlfuzz được tính bằng công thức:
N(SHM) L(SHM) reward =
Trong đó:
e SHM: Bảng theo dấu các cạnh đã thực thi từ AFL
eô N(SHM): Số vị trớ trong bảng cú giỏ trị khỏc khụng (số cạnh đó thực thi,
67
không quan trong số lần di qua)
e L(SHM): Tổng số byte trong mang theo dấu (mặc định 65536)
Công thức này chỉ phụ thuộc vào số lượng độ phủ mã mà mẩu thử đó đạt được, điểm số dành cho các độ phủ mã cũ và mới tìm được là như nhau, sự tăng hay giảm so với đầu vào được biến đổi cũng không được đề cập, nói cách khác, rlfuzz chấm điểm chỉ hướng đến việc đạt được độ phủ mã cao nhất đối với từng đầu vào sau khi được biến đổi, không quan trọng là độ phủ mã mới hay không. Các tham số khác của mô hình DDQG được sứ dụng bao gồm 10000 cho kích thước của bộ đệm vòng (ring buffer) dùng để lưu trữ dữ liệu tương tác, nhiễu ngẫu nhiên để khám phá hành động với kích thước được đặt là kích
thước khụng gian hành động với 0 = 0.15, „ = 0 và ứ = 0.3. DDPG cập nhật
mang dự đoán giá trị hành động (critic network) với 7 = 0,99 và cập nhật mềm mạng mục tiêu (target network) với một biên độ nhỏ tai mỗi bước thời gian
09 = 792 + (1 — z)09”. Hàm tối ưu hóa được chọn là hàm tối uu hóa Adam với
tỉ lệ học là 0.001.
Rlfuzz cũng sử dụng một phương pháp để cân bằng tính khai thác và khám phá, bằng cách duy trì một tập các đầu vào "tốt" từng tạo ra độ phủ mới, nếu như mau thử đang được thử nghiệm tìm ra độ phủ mã mới, nó sẽ tiếp tục là trạng thái tiếp theo của mô hình, nếu không, chương trình chọn ngẫu nhiên một đầu vào trong tập "tốt" để tiến hành biến đổi tiếp. Mỗi đầu vào và hành động được chọn tương ứng chỉ biến đổi một lần duy nhất, không có cơ chế phân bổ
số lần thử khác nhau như CTFuzz.
4.1.2.8. CTFuzz
Chúng tôi triển khai mô hình chúng tôi đề xuất ở chương 3 trên ngôn ngữ python, kèm với 1 phần mô hình được viết bằng C để lấy độ phủ mã.
Đối với mô hình học tăng cường, chúng tôi sử dụng DQNAgent từ thư viện keras-rl2 để tạo ra mô hình deep-q-learning, thư viện tensorflow.keras để tạo lớp
68
mạng deep-q-network và tương tác với môi trường fuzzing sử dụng thư viện gym.
Mô hình mạng deep-q-network của chúng tôi sẽ triển khai voi 3 lớp mạng an (hidden layer) với lần lượt là 1024, 128 và 64 nút. Kích thước của lớp mạng đầu
vào (input layer) chính là kích thước của không gian trạng thái (state space) và
kích thước của lớp mạng đầu ra chính là kích thước của không gian hành động (action space). Hàm kích hoạt của lớp cuối cùng là linear. Chúng tôi sử dụng chính sách chọn hành động là EpsGreedyQPolicy và hàm tối ưu (optimizer)
chúng tôi sử dụng là Adam. Chúng tôi đặt kích thước của bộ experience replay
là 1000000 để lưu trữ các trạng thái, hành động và phần thưởng, chúng tôi
chọn giá trị c = 0.7 cho chính sách chọn hành động EpsGreedyQPolicy. Giá trị
+ = 0.9 và tỉ lệ học (learning rate) Ir = 0.001. Đối với các thuật toán còn lại trong mô hình, chúng tôi đặt giá trị cho các hằng số được sử dụng lần lượt là
total_ energy = 1000000 và min_ energy = 50 trong thuật toán chọn và lập lịch
đầu vào, C = 10 cho thuật toán biến đổi đầu vào nhiều cấp và M = 5000 cho cơ chế chống lãng phí. Các thông số trên được tham khảo từ các nghiên cứu khác
và dựa vào thử nghiệm thực tế trên ứng dụng readelf để chọn thông số cho kết quả tốt nhất.
4.1.2.4. Cơ chế ngẫu nhiên
Dé đánh giá được mức độ hiệu qua của mô hình học tăng cường đóng góp trong mô hình của chúng tôi, chúng tôi tiến hành so sánh CTFuzz với co chế ngẫu nhiên. Chúng tôi xây dựng mô hình fuzzing bao gồm toàn bộ cầu trúc mô hình CTEuzz trước đó nhưng sẽ thay mô hình học tăng cường bằng cơ chế chọn hành động biến đổi một cách ngẫu nhiên. Tất cả các tham số sử dụng sẽ giống như được mô tả ở phần CTFuzz. Với việc so sánh này, hiệu quả của mô hình
học tăng cường sẽ được tách ra so với các thuật toán còn lại, và hiệu quả của
mô hình học tăng cường trong việc chọn hành động biến đổi sẽ được so sánh với
việc chọn các hành động một cách ngẫu nhiên.
69 4.1.3. Các ứng dung thử nghiệm,
Dựa vào sự tham khảo của các bài báo khoa học khác, nhóm tiến hành thống
kê và chọn fuzzing trên 2 bộ công cụ là Binutils-2.34 và Poppler-0.86. 1. Day là 2
bộ công cụ thường được sử dụng để thử nghiệm trong các nghiên cứu về fuzzing thuộc nhóm phần mềm thực tế, khác với các ứng dụng thuộc nhóm tập dữ liệu (dataset), hay đánh giá hiệu suất (benchmark). 2 bộ công cụ này được sử dụng
nhiều vì nó là 2 bộ công cụ mã nguồn mở (có thể thử nghiệm các phương pháp cần mã nguồn), có tiềm năng lỗi cao do xử lí các công việc phức tạp (định dạng PDF, ELF), nhưng không quá lớn, quá phức tạp để hiểu và dé sử dung.
e Binutils là một bộ công cu quan trọng trong việc phát triển phần mềm và
làm việc với file nhị phân, cung cấp các tính năng cần thiết để biên dịch, liên kết, gỡ lỗi và quản lý file nhị phân trên nhiều hệ điều hành và kiến trúc khác nhau. Binutils hỗ trợ nhiều kiến trúc vi xử lý và định dang file khác nhau, bao gồm các kiến trúc như x86, ARM, MIPS, PowerPC và các định dang file như ELF (Executable and Linkable Format) và COFF (Common Object File Format).
e Poppler là một thư viện mã nguồn mở mạnh mẽ cho việc làm việc với file
PDE, cung cấp các tính năng như trích xuất nội dung, hiển thị, gỡ lỗi và
chỉnh sửa, và đã được tích hợp vào nhiều ứng dụng và dự án khác nhau. Poppler được xây dựng trên nền tảng Xpdf, một trình doc PDF được phát triển ban đầu bởi Derek B. Noonburg. Poppler đã được tích hợp vào nhiều ứng dụng và du án phổ biến, bao gồm các trình đọc PDF như Evince và
Okular, trình duyệt web như Firefox và Chrome, và các công cu xử lý PDF khác.
Chỉ tiết thông tin về các ứng dụng được thử nghiệm và các tham số sử dụng được ghi trong bảng 4.1, kí tự "@@" biểu thị cho việc đưa mẩu thử vào ứng dụng dưới dạng một tệp. Đối với đầu vào ban đầu, chúng tôi sử 2 tệp đầu vào
70 Bang 4.1: Thông tin các ứng dung thử nghiệm
ID | Target Program Parameters Version Seed Type
1 readelf -a @@ Binutils-2.34 ELF
2 strings -a @@ Binutils-2.34 ELF
3 size -A -x -t @@ Binutils-2.34 ELF
4 objdump -a -f -x -d @@ Binutils-2.34 ELF
5 nm -C @@ Binutils-2.34 ELF
6 pdfinfo -box @@ Poppler-0.86. PDF
7 pdfimages -list -j @@ Poppler-0.86. PDF
8 pdfdetach -list @@ Poppler-0.86. PDF
9 pdftotext -htmlmeta @@ | Poppler-0.86. PDF
10 pdftohtml -stdout @@ Poppler-0.86. PDF
11 pdftoppm -mono @@ Poppler-0.86. PDE
tương ứng với 2 loại dữ liệu được sử dung cho 2 bộ công cụ. Đối với bộ công cu
Binutils làm việc với tệp ELF, chúng tôi sử dụng chính ứng dụng size trong bộ
công cụ làm đầu vào ban đầu, đây là ứng dụng có độ lớn thấp nhất (31kb) trong
bộ công cụ, đồng thời cũng có độ phức tạp vừa phải đủ để chạm vào các nhánh sâu trong các bộ ứng dụng. Một số nghiên cứu khác sử dụng đầu vào rỗng để làm đầu vào ban đầu nhằm mang lại nhằm mang lại mức độ khám phá cao hơn, tuy nhiên nó cũng khiến cho quá trình fuzzing mất nhều thời gian hơn để chạm
sâu hơn vào mô hình. Tương tự phía tệp PDF, chúng tôi sử dụng một tệp mẫu PDF nhỏ, chỉ gồm 1 trang duy nhất chứa chữ, 1 hình ảnh có mau và bảng, gồm
26 object và nặng 31kb.
4.1.4. Các tiêu chi danh giá
Chúng tôi thực hiện đánh giá trên 3 tiêu chí là độ phủ mã (coverage), số đường dẫn thực thi (unique_ path) và tốc độ chạy (execution tỉmes)
và theo 2 ngữ cảnh: Sau 6 tiếng fuzzing và sai 200000 lần thử đầu.
Tiêu chí đầu tiên là độ phủ mã sẽ được tính theo tổng số cạnh tìm được của
từng mô hình (theo phương pháp tính độ phủ mã theo cạnh), mỗi cạnh đi qua
chỉ tính 1 mà không đếm số lần lặp qua các cạnh, đây là phương thức đánh giá
71
cơ bản nhất của 1 công cụ fuzzing sử dụng độ phủ mã. Độ phủ mã sẽ cho thay
mức độ bao phủ của các mẩu thử tạo ra trên các đoạn mã của chương trình.
Phương thức lấy độ phủ mã của chúng tôi sử dụng cho phép duy trì một bảng
theo dấu tổng quát để lưu lại các cạnh đã tìm thấy từ bảng theo dấu trả về sau
các lần thử.
Chúng tôi định nghĩa số đường dẫn thực thi của một mau thử dựa trên tập
các cạnh mà chúng đi qua (không tính đến số lần lặp của từng cạnh), đây cũng
là một phương thức thông dụng được sử dụng để đánh giá hiệu suất fuzzing,
phương thức này giúp đánh giá được mức độ khám phá của mô hình, tức là độ
đa dạng các đường dẫn đã được thực thi. Đối với CTPFuzz, rlfuzz và cơ chế ngẫu nhiên, chúng tôi sử dụng bảng theo dấu được trả về sau khi thực thi chương
trình, lưu nó dưới dạng hash 64-bit vào cấu trúc dit liệu set của python để đếm
số đường dẫn không trùng lặp, thuật toán hash chúng tôi sử dung là zzhổ từ thư viện z#hash. Đối với công cu AFLplusplus, chúng tôi sử dụng hàm hash64
cung cấp sẵn dé và lưu lại bảng theo dấu trong cấu trúc dữ liệu set tương tự.
Cuối cùng là tốc độ thực thi của chương trình, là thông số đánh giá tốc độ chạy giữa các mô hình. Tốc độ chạy ở đây được đo bằng số lần thử chương trình mục tiêu với đầu vào được tạo ra, fuzzing là một công việc mang tính may rủi
khá cao nên việc được thử nhiều cũng sẽ tăng tỉ lệ tìm được lỗi hay tìm ra các
nhanh mới. Ở ngữ cảnh đầu, chúng tôi đếm tổng số lần thực thi của các mô
hình sau 6 tiếng, ở ngữ cảnh sau, chúng tôi đo thời gian mô hình mất để thực
thi 200000 lần thử đầu. Cả 2 thông số đều cho phép tính toán được tốc độ thực thi đơn vị (số lần thử/s).
Để tinh mức độ tăng/giảm của CTFuzz so với các mô hình khác, chúng tôi sử
dụng tham số tỉ lệ gia tang (Enhancing Rate - ER), được tính bằng công thức:
— CT Fuzz_value — Compare _model_value
ER + 100(%)
Compare_model_ value Trong do: