Driller là trình concolic execution được tạo ra bởi Nick Stephens [16] và các
cộng sự, đã được sử dụng trong cuộc thi DARPA Cyber Grand Challenge và đạt
được thành tích ấn tượng ở cuộc thi này. Cốt lõi của Driller là trình symbolic
24
Interesting!
inputs |
AFL++ ——————r>
Inputs from AFL++ queue
Hình 3.2: Dong bộ đầu vao trong AFL++
execution Angr, được sử dung dé phân tích tinh chương trình thực thi nhằm
tìm ra đầu vào thỏa mãn các đường thực thi nhất định. Angr sử dụng trình
mô phỏng QEMU để có thể mô phỏng thực thi và theo déi luồng thực thi của
chương trình sau đó ghi nhận các khối cơ bản, các đường thực thi đã được bao
phủ trong quá trình symbolic execution.
Driller bắt đầu bằng việc nhận vào một đầu vào và bảng fuzz bitmap từ trình fuzzing. Đầu vào này xác định đường thực thi của chương trình, và Driller sẽ
mô phỏng chương trình theo đường thực thi này cho đến khi bắt gặp một nhánh
rẽ. Lúc này Driller thực hiện chọn nhánh rẽ ngược với nhánh rẽ đã được lựa
chọn, sau đó thử phân tích xem liệu điều kiện ràng buộc của nhánh rẽ này có
thể được thỏa mãn. Nếu có thể thỏa mãn điều kiện của nhánh rẽ này, Driller
bắt đầu symbolic execution theo đường thực thi của nhánh và khám phá thêm
các đoạn mã khác trong chương trình. Tại đây, fuzz bitmap được sử dung để
đánh giá độ phủ mã hiện tại của quá trình fuzzing, giúp Driller chọn lọc khám
phá các đường thực thi chưa được phủ. Sau khi kết thúc mô phỏng, Driller tính toán và giải các điều kiện ràng buộc của các đường thực thi tìm được thông qua
một bộ giải ràng buộc để tạo ra đầu vào mới giúp quá trình fuzzing tiến triển.
Hình 3.3 mô tả cách thức hoạt động của Driller. Các đường đứt nét đại diện
đường thực thi của đầu vào, các đường liền nét đại diện các đường thực thi được
thực hiện symbolic execution.
Hành 3.3: Cách thúc hoạt động cua Driller
3.4. Mô hình học tăng cường sâu
Mặc định, các trình phân tích tĩnh thực hiện symbolic execution trên cả hai
nhánh điều kiện ở mỗi câu lệnh rẽ nhánh. Điều này tuy tạo được nhiều đầu vào
tăng khả năng khám phá chương trình nhưng lại dé gặp vấn dé path explosion. Path explosion là hiện tượng số đường thực thi của chương trình tăng lên theo hàm mũ ở các chương trình lớn khiến quá trình symbolic execution trở nên cham
và kém hiệu quả. Chính vì vậy mô hình học tăng cường sâu được áp dụng vào
Driller nhằm lựa chọn một trong hai nhánh điều kiện có khả năng dẫn đến đường
thực thi dài hơn từ đó độ bao phủ mã cũng cao hơn. Điều này giảm thiểu được
tài nguyên tính toán, tăng tốc độ symbolic execution và hạn chế được tình trạng
path explosion trong quá trình thực thi.
Như đã đề cập ở mục 2.3.1, một mô hình học máy tăng cường cần 3 yếu tố,
26
bao gồm trạng thái, hành động, phần thưởng. Các yếu tố này được trình bày chi tiết ở mục 3.4.1.
3.4.1. Các thành phần của mô hành học tăng cường sâu
8.4.1.1. Trạng thái - State
Trong học tăng cường, trạng thái là các đặc điểm của môi trường tại một thời điểm nhất định. Đối với một chương trình thực thi, các yếu tô như bản sao chép vùng nhớ, trạng thái của bộ xử lý có thể được sử dụng làm trạng thái của môi trường. Tuy nhiên các yếu tố này thường thay đổi, không cố định ở mỗi lần
thực thi chương trình do các cơ chế của hệ điều hành, các biến môi trường, ...
Đối với một chương trình thực thi, các đoạn mã lệnh là yếu tố phù hợp để
được sử dụng làm trạng thái của môi trường. Các đoạn mã lệnh trong khối cơ bản trước điều kiện rẽ nhánh cho ta biết luồng thực thi hiện tại của chương
trình. Bằng cách học các đoạn mã lệnh này, mô hình học tăng cường có thể
dự đoán đoạn mã tiếp theo được thực thi và lựa chọn nhánh điều kiện dẫn đến đường thực thi dài nhất.
Việc sử dung mã lệnh dưới dang các opcode không phù hợp làm đầu vào
của mô hình học tăng cường sâu. Chúng tôi thực hiện chuyển đổi các byte
opcode sang dạng số tự nhiên trong khoảng từ 0 đến 255, tạo thành một vector n phan tử (n là số chiều lớp đầu vào mạng nơ-ron học sâu) với mỗi
phần tử là một số tự nhiên thể hiện cho một byte trong đoạn mã lệnh: BB; =
{int(b1), int(b2), int(by),...}. Tuy nhiên các đoạn opcode thường có độ dài khác
nhau, không thể đưa vào mạng nơ-ron học sâu với số chiều cố định. Chính vì
vậy các đoạn lệnh có số lượng byte ít hơn số nút ở lớp đầu vào của mạng học sâu
sẽ được chèn thêm các byte null về phía sau. Điều này đảm bảo được số chiều của lớp đầu vào mà không gây ảnh hưởng đến đặc tính của đoạn mã lệnh. Đối với các đoạn mã lệnh có số byte opcode nhiều hơn so với số nút của lớp đầu vào mang học sâu, một vector con với n phần tử tính từ cuối đoạn mã lệnh trở về
27
đầu sẽ được trích từ đoạn mã lệnh ban dau. Việc lựa chon các byte ở cuối đoạn
mã lệnh giúp tăng khả năng trích xuất được các đoạn mã quyết định điều kiện
nhánh rẽ của chương trình. Đoạn mã giả 3.1 thể hiện thuật toán xử lý trạng
thái đầu vào mạng nơ-ron học sâu.
"Thuật toán 3.1 Thuật toán xử lý trạng thai
BasicBlock — array of opcode bytes as integer BasicBlockSize < sizeof (BasicBlock)
if BasicBlockSize < inputDim then
for i — 1 to InputDim — BasicBlockSize do
BasicBlock.append(0) end for
else
if BasicBlockSize > InputDim then
for i © BasicBlockSize — InputDim to InputDim do
Trimmed Block.append(BasicBlock(t]) end for
end if end if=0
ơ —ơ RP —
8.4.1.2. Hành động - Action
Trong học tăng cường, tác tử sử dụng hành động để tương tác với môi trường
và nhận về phản hồi để đánh giá độ tốt của hành động được lựa chọn. Trong bài toán hiện tại, hành động tối ưu là hành động có thể giúp chương trình bao quát
được nhiều khối cơ bản nhất. Tại mỗi nhánh rẽ điều kiện mà trình symbolie execution bắt gặp, tác tử cần phải chọn được nhánh rẽ tối ưu nhất. Không gian
hành động A của mô hình học tăng cường trong Dr. CFuzz được định nghĩa dựa
theo công trình của Seungho Jeon va cộng sự [8]. Điểm khác biệt nằm ở việc loại
bỏ đi hành động tb (chọn cả hai nhánh rẽ), lúc này không gian hành động chỉ
còn lại hai hành động A = {tt,¢f} với tt là lựa chọn nhánh rẽ True và ¿ƒ là lựa
chọn nhánh rẽ False. Bất kì nhánh điều kiện nào được tác tử lựa chọn, nhánh
điều kiện ngược lại sẽ được hủy bỏ khỏi hàng đợi. Lí do cho việc này chính là để
hạn chế hiện tượng path explosion và đơn giản hóa quá trình học tăng cường,
28
không phải lưu trữ quá nhiều trạng thái ứng với từng nhánh rẽ.
3.4.2. Phan thưởng - Reward
Phan thưởng là là yếu tố giúp mô hình hoc tăng cường có thể cải thiện lựa
chọn hành động của mình. Tác tử thực hiện hành động và nhận về phần thưởng
như một sự đánh giá cho hành động đã thực hiện. Mục tiêu của học tăng cường
là tối ưu giá trị phần thưởng tích lũy qua nhiều timestep, tức là tác tử lựa chọn
được các hành động tốt nhất trong quá trình thực thi. Phần thưởng có thể là bất kì giá trị nào phản ánh được sự chuyển tiếp giữa các trạng thái của môi trường. Ví dụ, một tác tử tương tác với một trò chơi có thể sử dụng điểm số đạt được làm phần thưởng cho một hành động. Tuy nhiên ta sẽ không thể tìm được một giá trị cụ thể như vậy trong quá trình concolic execution.
Để đánh giá một nhánh điều kiện được thỏa mãn bởi concolic execution, ta
có thể sử dụng số lượng các điểm rẽ nhánh trên đường thực thi được lựa chọn làm giá trị phần thưởng. Chúng tôi thiết lập một giá trị dương cho mỗi điểm rẽ
nhánh bắt gặp trong quá trình concolic execution. Điều này đồng nghĩa với việc đường thực thi càng dài thì giá trị phần thưởng tích lũy sẽ càng cao. Ngược lại với các các đường thực thi không chứa nhánh rẽ (chỉ chứa duy nhất một khối
cơ bản) tìm được, giá trị phần thưởng trả về lúc này sẽ bằng 0.
Doan mã giả 3.2 và hình 3.4 mô tả thuật toán thiết lập phần thưởng mô hình
học tăng cường
Thuật toán 3.2 Thuật toán thiết lập phần thưởng mô hình học tăng cường
EntryState + program entry state Reward — 0
NeztState — stepping entry state
while NeztState.terminal 4 True do
if NextState.diverted == True then
Reward + Reward+1
end if NeztState — stepping current state with selected branch end while=0
29
3.4.3. Thuật toán huấn luyén m6 hành
Để có thể xử lý không gian trạng thái vô định, chúng tôi chọn thuật toán Deep Q-Learning, sử dụng mạng nơ-ron học sâu Q-network để thay thế cho Q-table.
Chúng tôi định nghĩa mang Q-network của Dr. CFuzz như sau:
e Lớp đầu vào: 64 nút mạng
e Lớp đầu ra: 2 nút mạng tương ứng với 2 nhánh rẽ điều kiện
e Các lớp an: 4 lớp mạng dày đặc với số lượng nút theo thứ tự là 32, 16, 8
và 4.
Bắt đầu quá trình huấn luyện, chương trình mục tiêu được thực thi với đầu vào ngẫu nhiên đến khi bắt gặp nhánh rẽ điều kiện đầu tiên. Lúc này khối cơ
bản của quá trình thực thi vừa qua được trả về làm trạng thái của môi trường.
Tác tử dựa trên trạng thái này, thông qua mạng Q-network ước lượng giá trị