THỰC NGHIEM VA DANH GIA

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 39 - 44)

O chương nay chúng tôi kiến tao môi trường, cài đặt và đưa ra các tiêu chí đánh giá về mức độ hiệu quả của mô hình.

4.1. Thiết lập thí nghiệm

Mô hình fuzzing của chúng tôi được thực hiện trên môi trường hệ điều hành

Ubuntu 22.04 với vi xử lý 32 nhân và 64GB RAM. Trình fuzzing chính được

sử dụng là AFL++ 4.07e được vá với phiên bản QEMU có thể thực thi các

chương trình Cyber Grand Challenge. Mô hình học tăng cường sâu được tích

hợp trên trình concolic execution Driller v1.0 và được huấn luyện sử dụng thư

viện Keras với môi trường được định nghĩa dựa trên quá trình concolic execution của Driller.

4.1.1. Thiết lập môi trường huấn luyện

Môi trường huấn luyện mô hình học máy tăng cường sâu được định nghĩa ở đoạn mã nguồn 4.1

Mã nguồn 4.1: Môi trường huấn luyện mô hành học tăng cường sâu

def reset(self):

self._episode_ended = False

while True:

if self.core_ended == False:

self .core_simgr_step()

while self.core_ended == True:

# Reinitiate simgr with new input if not seeded

def

32

if self.input is None:

self.input = self.input_generator (4) .encode

QO

self.core_simgr_init ()

div_state = self.core_simgr.diverted. pop (0) self.sym_state_init (div_state)

if self._episode_ended == False:

break

# Return new state

bbl = list(self.sym_project.factory.block(self.

sym_states[0].history.bbl_addrs[-1]).bytes) self._state = self.bbl_process(bbl)

return np.array(self._state, dtype=np.int32)

step(self, action):

# Perform action and get return observation and reward state = self.sym_states.pop(action)

self.sym_states.clear()

self.sym_state_step (state)

if self._episode_ended != True:

bbl = list(self.sym_project.factory.block(self.

sym_states[0].history.bbl_addrs[-1]).bytes) self._state = self.bbl_process (bbl)

reward = 1

return np.array(self._state, dtype=np.int32),

reward, self._episode_ended else:

self._state = [0] * 64

reward = 0

33

return np.array(self._state, dtype=np.int32),

reward, self._episode_ended

Ham reset tạo một đầu vào ngẫu nhiên và thực thi chương trình nay cho đến khi gặp nhánh rẽ đầu tiên. Khi ấy, Driller sẽ phân tích nhánh rẽ ngược với

nhánh mà đầu vào lựa chọn. Nếu có thể thỏa mãn điều kiện rẽ nhánh của nhánh

nay, Driller sẽ thực hiện symbolic execution trên nhánh vừa chọn nhằm khám

phá các đường thực thi khác của chương trình.

Trong quá trình symbolic execution, nếu Driller bắt gặp nhánh rẽ điều kiện, khối co bản vừa được thực thi sẽ được trả về và xử lý thông qua hàm bbl_ process nhằm chuyển khối cơ bản này sang dạng list cũng như thực hiện thay đổi thay đổi số lượng phần tử để phù hợp với lớp đầu vào của mạng Q-network như đã

được đề cập ở mục 3.4.1.1. Sau đó giá trị phần thưởng được gán bằng 1 và được trả về cho tác tử học máy tăng cường. Sau đó chương trình tiếp tục được thực thi cho đến khi bắt gặp nhánh rẽ khác thông qua hàm sym_ state_ step. Biến _episode_ ended được sử dung để theo dõi và báo hiệu sự kết thúc của một

episode.

MG nguồn 4.2: Hàm bbl_ process

def bbl_process(self, bbl_bytes):

bbl = list (bbl_bytes) bbl_len = len(bbl)

if bbl_len < 64:

bbl.extend([0] * (64 - bbl_len))

elif bbl_len > 64:

bbl = bbl[-64:-1]

return bbl

4.1.2. Thử nghiệm mô hành hoc tăng cường sâu

Mô hình học tăng cường sâu được chèn thêm vào tại phương thức symbolic

execution của Driller và được thiết lập với trọng số cập nhật được từ quá trình

34

huấn luyện. Doan mã 4.3 áp dung mô hình hoc tăng cường sâu vào Driller.

Mã nguồn 4.3: Ấp dụng mô hành học tăng cường sâu uào Driller

while len(simgr.active) and accumulated < 1024:

self.agent.main_network = self.agent.get_nn() self.agent.main_network.load_weights(self.weight_path)

if len(simgr.active) > 1:

bbl = list(p.factory.block(simgr.active[0].history.

bbl_addrs[-1]).bytes)

state = self.bbl_process (bbl)

action = self.agent.make_max_decision(np.array (

state, dtype=np.int32)) selected_state = simgr.active[action]

simgr.stashes["active"].clear() simgr.stashes["active"].append(selected_state)

simgr.step()

steps += 1

Với ham bbl_ process và make_ max_ decision được định nghĩa tai 4.2 và 4.4

Ma nguon 4.4: Hàm make_mazx_ decision

def make_max_decision(self, state):

state = state.reshape(1, self.state_size) q_values = self.main_network. predict (state, verbose=0) return np.argmax(q_values [0] )

Tại mỗi nhánh rẽ điều kiện, Driller sẽ trả về một chuỗi byte opcode thé hiện

khối cơ bản vừa được thực thi. Khối cơ bản này sẽ được xử lý Khối cơ bản

này sau đó được sử dụng để lựa chọn nhánh rẽ với Q-value lớn nhất tại hàm

make_ max_ decision. Các nhánh rẽ không được lựa chon sẽ được loại bỏ khỏi hàng chờ trạng thái active.

39

4.1.3. Tập dữ liệu huấn luyện

Tập dữ liệu Cyber Grand Challenge (CGC) [4] là một tap dữ liệu chương

trình thực thi với các lỗ hong đa dang được sử dụng trong DARPA Cyber Grand Challenge, là cuộc thi phát triển các hệ thống phát hiện và khai thác lỗ hồng tự động. Các chương trình này được thiết kế đặc biệt với các lỗi đại diện cho các lỗ hổng phần mềm, có khả năng đánh giá hiệu năng của một giải pháp

đò tìm khai thác lỗ hong tự động. Chính vi vậy, ta có thể sử dụng tập dữ liệu này để huấn luyện và đánh giá mô hình học tăng cường sâu của mình. Cần lưu

ý rằng tap dữ liệu CGC được biên dịch ở định dang chỉ có thể được thực thi bởi các máy ảo DECREE. Để có thể thực hiện fuzzing tập dữ liệu này, ta cần

sử dụng một trình mô phỏng để mô phỏng lại môi trường máy ảo DECREE.

Chúng tôi thực hiện chọn ra 6 chương trình từ tập dữ liệu CGC và thực hiện

fuzzing trong 5 tiếng. Bang 4.1 mô tả các chương trình được sử dụng trong quá

trình fuzzing:

Chương trình | Lỗ hong

CADET 00001 | CWE-121: Stack-based Buffer Overflow

CADET _ 00003 | CWE-121: Stack-based Buffer Overflow

CROMU _ 00016 | CWE-131: Incorrect Calculation of Buffer Size

CWE-120: Buffer Copy without Checking Size of Input KPRCA_ 00032 | CWE-122: Heap-based Buffer Overflow

CWE-755: Improper Handling of Exceptional Conditions YANO1_ 00001 | CWE-121: Stack-based Buffer Overflow

YANO1 00016 | CWE-121: Stack-baed Buffer Overflow

Bang 4.1: Các chương trình được lua chọn thực nghiệm

4.1.4. Các trinh fuzzing được thử nghiệm,

Bảng 4.2 miêu tả tổng quan về các trình fuzzing được sử dụng trong quá trình

thực nghiệm.

Các trình fuzzing được thử nghiệm nhằm đánh giá mức độ hiệu quả của Dr.

36

Trinh fuzzing Mô ta

AFL++ Trình fuzzing sử dung độ phủ mã để chi dẫn biến doi dau

vào (coverage-guided fuzzing)

Driller-AFL Trinh fuzzing áp dung concolic execution dé cải thiện kha

năng bao phủ mã thông qua việc tạo ra các đầu vào thỏa mãn các điều kiện ràng buộc phức tạp

Dr. CFuzz (Giải | Trình fuzzing kết hợp concolic execution và phương pháp pháp đề xuất) học máy tăng cường sâu nhằm lựa chọn nhánh rẽ hướng

đến đường thực thi dài hơn, hạn chế path explosion

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 39 - 44)

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

(61 trang)