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