Bộ dữ liệu và phương pháp trích xuất

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 phát hiện lỗ hổng bảo mật phần mềm bằng phương pháp học sâu (Trang 60 - 66)

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.

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.

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 phát hiện lỗ hổng bảo mật phần mềm bằng phương pháp học sâu (Trang 60 - 66)

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

(85 trang)