Trình concolic execution Driller

Một phần của tài liệu Khóa luận tốt nghiệp An toàn thông tin: Nghiên cứu phương pháp fuzzing trong tự động hóa phát hiện lỗ hổng phần mềm dựa trên học tăng cường (Trang 31 - 37)

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ị

Một phần của tài liệu Khóa luận tốt nghiệp An toàn thông tin: Nghiên cứu phương pháp fuzzing trong tự động hóa phát hiện lỗ hổng phần mềm dựa trên học tăng cường (Trang 31 - 37)

Tải bản đầy đủ (PDF)

(61 trang)