BAO MAT PHAN MEM BANG HOC
CHƯƠNG 4. THÍ NGHIEM VA DANH GIA
4.2. Bộ dữ liệu và phương pháp trích xuất
Chúng tôi thực hiện việc huấn luyện mô hình học sâu với hai bộ dữ liệu được
sử dung bao gồm bộ dit liệu trong các bài báo SySeVR [15] và Vuldeepecker [14]. Cả hai bộ dữ liệu này được thu thập từ hai nguồn chính: Bộ dữ liệu NVD
(National Vulnerability Database) và bộ dữ liệu SARD (Software Assurance Reference Dataset).
Trong đó, bộ dữ liệu NVD cung cấp các đoạn chương trình lỗ hồng từ các sản phẩm phần mềm, bao gồm các đoạn mã bị lỗ hồng và các bản vá của chúng. Bộ
dữ liệu SARD cung cấp các chương trình thử nghiệm, tổng hợp và học thuật, các chương trình này được gán nhãn "good" (không chứa lỗ hổng), "bad" (chứa
lỗ hổng) và "mixed" (chứa lỗ hổng và đã có bản vá).
52
4.2.1. Bộ dữ liệu SySeVR
4.2.1.1. Thông tin vé bộ dữ liệu
Bộ dữ liệu SySeVR [15] được chúng tôi sử dụng trong bài thực nghiệm này bao gồm 1,591 đoạn chương trình C/C++ thu thập từ bộ dữ liệu NVD, trong đó
có 874 đoạn chương trình có chứa lỗ hong và 14,000 đoạn chương trình C/C++
thu thập từ bộ dữ liệu SARD, trong đó có 13,906 đoạn chương trình có chứa lỗ
hổng (được dán nhãn là "bad" hoặc "mixed"). Tổng cộng bộ dữ liệu thu thập
bao gồm 15,591 đoạn chương trình, các đoạn chương trình này chứa 126 loại lỗ hong khác nhau, tập trung vào 4 nhóm lỗ hong chính như sau:
e Library/API Function Call: Các 16 hong liên quan đến lời gọi ham thư viện
hoặc API.
e Array Usage: Các 16 hồng liên quan đến sử dụng mang (Vi dụ: truy cập
phần tử mảng không đúng cách, sử dụng sai cú pháp hoặc thực hiện các
phép tính địa chỉ không đúng trên mảng).
e Pointer Usage: Các lỗ hong liên quan đến sử dụng con trỏ (Ví dụ: tham
chiếu con trỏ không đúng cách, sử dụng sai cú pháp hoặc thực hiện các
phép tính con trỏ không đúng).
e Arithmetic Expression: Các lỗ hong liên quan đến sử dung sai phép toán số
học (Ví dụ: lỗ hồng integer overflow).
Các đoạn chương trình này cho phép chúng tôi tạo ra 547.347 SeVC, bao gồm
495.126 SeVC không chứa lỗ hồng và 52.227 SeVC có chứa lỗ hồng.
4.2.1.2. Trích xuất SyVC từ mã nguồn
Như đã trình bày trong Chương 3, chúng tôi sử dụng phương pháp dựa trên
ý tưởng nghiên cứu của Li [15], chuyển đổi các đoạn mã nguồn chương trình
thành các đoạn SyVC và SeVC.
53
Đầu tiên ta cần trích xuất được SyVC từ mã nguồn, ta phải trích xuất các
dòng mã có chứa lỗ hổng từ các đoạn chương trình và phân tích đặc điểm cú pháp của chúng. Dé sử dụng thuật toán 3.1 trích xuất SyVC, chúng ta cần xác
định xem phan tử e¡;;, nằm trên cây AST 7; của hàm ƒ; trong chương trình P,
có khớp với đặc điểm cú pháp chứa lỗ hong hay không. Ta tao ra cây T; bằng
cách sử dụng công cu Joern |6].
Ta sử dụng thuật toán 3.1 để trích xuất SyVC, sau khi trích xuất chúng tôi thu thập được số lượng SyVC của bốn nhóm lỗ hồng như sau:
e SyVC loại Library/API Function Call: trích xuất được 6.356 SyVC từ bộ
dữ liệu NVD và 58.047 SyVC từ bộ dữ liệu SARD, tổng cộng 64.403 SyVC.
e SyVC loại Array Usage: trích xuất được 9.812 SyVC từ bộ dữ liệu NVD và
32.417 SyVC từ bộ dữ liệu SARD, tổng cộng 42.229 SyVC.
e SyVC loại Pointer Usage: trích xuất được 73.890 SyVC từ bộ dữ liệu NVD
và 217.951 SyVC từ bộ dữ liệu SARD, tổng cộng 291.841 SyVC.
e SyVC loại Arithmetic Expression: trích xuất được 5.295 SyVC từ bộ dữ liệu
NVD và 16.859 SyVC từ bộ dữ liệu SARD, tổng cộng 22.154 SyVC.
Tổng cộng, chúng ta trích xuất được 547.347 SyVC từ các đoạn chương trình
trong bộ dữ liệu.
4.2.1.8. Chuyển đổi SyVC thành SeVC
Chúng ta sử dụng thuật toán 3.1 để chuyển đổi SyVC thành SeVC, ta trích
xuất các đồ thị PDG va CFG bang cách sử dụng công cụ Joern [6]. Sau khi
thực hiện chuyển đổi SyVC thành SeVC, chúng ta tạo ra được 547.347 SeVC từ
547.347 SyVC.
54
P Số lượng SeVC
Loại SeVC Số lượng SeVC SỐ lượng SeVC không chứa lỗ
có chứa lỗ hong | , 2
hong
Library/API Function Call 141.023 17.005 124.018
Array Usage 59.772 7.996 47.776 Pointer Usage 340.324 25.377 314.946
Arithmetic Expression 10.234 1.848 8.386
Tong cong 547.347 52.227 495.126 Bang 4.1: Bang thống kê số lượng SeVC sau khi được gan nhãn
4.2.1.4. Gán nhãn cho SeVC
Chúng tôi thực hiện gán nhãn cho các mẫu SeVC đã được chuyển đổi, với các
mẫu SeVC có chứa 16 hong được gán nhãn là "1", và các mẫu không chứa lỗ
hổng được gán nhãn "0". Tong cộng chúng tôi đã gan nhãn "1" cho 52.227 SeVC
(chiếm 9,5% trên tổng số mau) và 495.126 mẫu được gán nhãn là "0" (chiếm
90,5% trên tổng số mau). Bảng 4.1 và hình 4.1 thống kê số lượng SeVC đã được
chúng tôi gán nhãn và tỷ lệ phân phối của chúng.
4.2.2. Bộ dữ liệu Vuldeepecker
4.2.2.1. Thông tin vé bộ dit liệu
Chúng tôi sử dụng bộ dữ liệu của Vuldeepecker [14] thu thập được bao gồm
840 đoạn chương trình C/C++ với 9,851 trường hợp kiểm thử. Các đoạn chương
trình này chủ yếu liên quan đến các lỗ hổng Library/API Function Call, bao
gồm hai loại lỗ hổng chính như sau:
e Buffer Error: Các lỗ hồng liên quan đến lỗi xử lý bộ đệm.
e Resource Management Error: Các 16 hỗng liên quan lỗi quan lý tài nguyên.
59
Hình 4.1: Biéu đồ phân bố ty lệ gan nhãn cho bộ đữ liệu SeVC
Các đoạn chương trình này cho phép chúng tôi tạo ra 61.637 code gadget, bao
gồm 43.913 code gadget không chứa lỗ hổng và 17.725 code gadget có chứa lỗ hổng.
4.2.2.2. Trích xuất lời gọi hàm API/thu tiện từ mã nguồn
Đây là bước đầu tiên của phương pháp trích xuất code gadget từ bộ dữ liệu
mã nguồn. Trong bước này, chúng tôi sử dụng công cụ Checkmarx trích xuất các lời gọi ham API và gọi thư viện từ các chương trình. Tổng cộng, chúng tôi trích xuất 56.902 cuộc gọi hàm API/thư viện từ các chương trình, bao gồm 7.255
forward slice và 49.647 backward slice.
4.2.2.8. Tao các code gadget từ slice trích xuất
Trong bước này, các code gadget được tạo ra từ các slice đã được trích xuất.
Tổng cộng chúng tôi đã tạo ra được 61.637 code gadget từ bộ dữ liệu.
56
Số lượng code] S6 lượng code Loại code gadget | Số lượng code gadget | gadget có chứa | gadget khong
16 hong chita 16 hong
CWE 119 39.753 10.440 29.313
CWE 399 21.885 7.285 14.600
Tong cong 61.637 17.725 43.913 Bảng 4.2: Bang thống kê số lượng code gadget sau khi được gan nhãn
4.2.2.4. Gán nhãn cho code gadget
Chúng tôi thực hiện gán nhãn cho các code gadget đã được chuyển đổi, với các code gadget có chứa lỗ hồng được gán nhãn là "1", và các mẫu không chứa
lỗ hồng được gán nhãn "0". Tổng cộng chúng tôi đã gan nhãn "1" cho 17.725 SeVC (chiếm 28,8% trên tổng số mẫu) va 43.913 mẫu được gan nhãn là "0" (chiếm 71,2% trên tổng số mẫu). Bảng 4.2 và hình 4.2 thống kê số lượng code
gadget đã được chúng tôi gán nhãn và tỷ lệ phân phối của chúng.
4.3. Xây dựng mô hình nhúng vector
Sau khi thu được các đoạn mã trích xuất SeVC và code gadget, chúng ta sẽ
sử dụng chúng làm input đưa vào mô hình embedding để tạo ra các vector biểu
diễn có ý nghĩa và giàu thông tin hơn. Trong phần thực nghiệm của đề tài này,
chúng tôi sử dung mô hình CodeBERT [8] để nhúng các vector.
Cấu trúc được sử dụng trong mô hình nhúng vector của chúng tôi như sau:
e Lớp input - Nhận đầu vào là các vector tokenizer có chiều dài 768.
e Mô hình nhúng - Mô hình CodeBERT gồm 12 lớp Transformer, có kích
thước lớp an là 768.
9í
Hình 4.2: Biểu do phân bố ty lệ gan nhãn cho bộ đữ liệu Vuldeepecker
e Lớp output - Có kích thước 768, tương ứng với kích thước các vector được
nhúng.
Từ đầu vào là các code gadget và SeVC, chúng tôi thu được kết quả bao gồm
61.637 vector nhúng từ bộ dữ liệu Vuldeepecker và 547.347 vector nhúng từ bộ
dữ liệu SySeVR. Các vector này có kích thước là 768 và sẽ được sử dụng là đầu vào cho các mô hình học sâu nhằm huấn luyện phân loại và phát hiện lỗ hổng
trên bộ dữ liệu.