Tải bản đầy đủ (.pdf) (71 trang)

Nghiên cứu và phát triển công cụ sử dụng học máy tìm kiếm lỗ hổng bảo mật trong ứng dụng web

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.48 MB, 71 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

LUẬN VĂN TỐT NGHIỆP
Nghiên cứu và phát triển công cụ sử dụng học máy
tìm kiếm lỗ hổng bảo mật trong ứng dụng web
Hội đồng luận văn:

Khoa học Máy tính

Tập thể hướng dẫn:
Thầy Nguyễn An Khương Khoa KH & KT Máy tính, ĐHBK
Anh Nguyễn Văn Hịa

Verichains Lab

Anh Trần Ngọc Tín

Verichains Lab

Giảng viên phản biện:
Thầy Trần Hồng Tài

Khoa KH & KT Máy tính, ĐHBK

Sinh viên thực hiện:
Đặng Minh Ngọc

1712345


Ngày 17 tháng 10 năm 2021


TR

I H C QU C GIA TP.HCM
NG
I H C BÁCH KHOA

C NG HÒA XÃ H I CH NGH A VI T NAM
c l p - T do - H nh phúc

NHI M V LU N ÁN T T NGHI P

KHOA: KH & KT Máy tính
B MƠN: KHMT

Chú ý: Sinh viên ph i dán t này vào trang nh t c a b n thuy t trình

H VÀ TÊN: ng Minh Ng c
NGÀNH: Khoa h c Máy tính

MSSV: 1712345
L P: MT17KH02

1. u đ lu n v n: Nghiên C u Và Phát Tri n Công C S D ng H c Máy Tìm Ki m L
H ng B o M t Trong ng D ng Web (Detecting Web Vulnerabilities using Machine Learning
Techniques)
2. Nhi m v (yêu c u v n i dung và s li u ban đ u):
- Nghiên c u, tìm hi u các l i b o m t web c b n.

- Nghiên c u ph ng pháp bi u di n thơng tin trích xu t t mã ngu n v d ng các vector đ c
tr ng phù h p cho quá trình h c máy.
- Chu n hóa q trình tìm ki m l i b o m t trong ng d ng nh m t bài toán phân lo i c a h c
máy.
- Hi n th c cơng c hồn ch nh có kh n ng d đốn l h ng b o m t b ng h c máy t mã
ngu n c a ng d ng web.
3. Ngày giao nhi m v lu n v n: 22/02/2021
4. Ngày hoàn thành nhi m v : 14/06/2021
5. H tên gi ng viên h ng d n:
Ph n h ng d n:
- TS. Nguy n An Kh ng
G i ý h ng đ tài, h ng d n chung.
- KS. Nguy n V n Hòa
G i ý đ tài c th , phân tích l h ng b o m t trên
mã ngu n, các k thu t h c máy.
- KS. Tr n Ng c Tín
Các lo i l h ng b o m t c th c a ng d ng web.
N i dung và yêu c u LVTN đã đ

c thông qua B môn.

Ngày 03 tháng 08 n m 2021
CH NHI M B

MÔN

(Ký và ghi rõ h tên)

GI NG VIÊN H


PH N DÀNH CHO KHOA, B MÔN:
Ng

i duy t (ch m s b ):________________________

n v :________________________________________
Ngày b o v :___________________________________
i m t ng k t:__________________________________
N i l u tr lu n án:______________________________

NG D N CHÍNH

(Ký và ghi rõ h tên)


TR
NG
I H C BÁCH KHOA
KHOA KH & KT MÁY TÍNH

C NG HÒA XÃ H I CH NGH A VI T NAM
c l p - T do - H nh phúc
---------------------------Ngày 6 tháng 7 n m 2021

PHI U CH M B O V LVTN
(Dành cho ng

1. H và tên SV: ng Minh Ng c
MSSV: 1712345 (MT17KH02)


ih

ng d n)

Ngành (chuyên ngành): KHMT

2.
tài: Nghiên c u và phát tri n công c s d ng h c máy tìm ki m l h ng b o m t
trong ng d ng web (Detecting Web Vulnerabilities using Machine Learning Techniques)
3. H tên ng i h ng d n:
 Nguy n An Kh ng, Khoa KH&KT Máy tính, HBK
 Nguy n V n Hịa, Verichains Lab
 Tr n Ng c Tín, Verichains Lab
4. T ng quát v b n thuy t minh:
S trang: 59
S b ng s li u: 11
S tài li u tham kh o: 35
Hi n v t (s n ph m):

S ch ng: 07
S hình v : 25
Ph n m m tính toán:

5. T ng quát v các b n v :
-S b nv :
B n A1:
- S b n v v tay

B n A2:
Kh khác:

S b n v trên máy tính:

6. Nh ng u đi m chính c a LVTN:
 LV có b c c h p lí, trình bày đ y đ , đúng quy cách. N i dung LV phân tích đ c
m t s h ng ti p c n khác nhau đ i v i l nh v c nghiên c u v phân tích phát hi n l
h ng b o m t trên mã ngu n cho m t lo i ngôn ng c th (PHP).

tài LV có ý ngh a th c t .
 K t qu LV phù h p v i m c tiêu và gi i h n ph m vi đ tài đ t ra ban đ u.
 Công c đ c hi n th c v i giao di n ng i dùng thân thi n, d s d ng.
7. Nh ng thi u sót chính c a LVTN:
 B d li u đ c s d ng trong nghiên c u còn thi u s đa d ng và ch a sát v i th c
ti n.
 S l ng l h ng b o m t đ c nghiên c u còn h n ch , c n th nghi m v i nhi u
lo i l i b o m t h n đ làm rõ tính hi u qu c a cơng c .
 Các mơ hình h c máy đ c s d ng ch a đ c trình bày chi ti t.
8.

ngh :

cb ov 

9. M t s câu h i SV ph i tr l i tr

B sung thêm đ b o v 
c H i đ ng: Khơng có(SV s đ

10. ánh giá chung (b ng ch : gi i, khá, TB): Gi i

Không đ


cb ov 

c h i tr c ti p trên H )
i m:

9.5/10

Ký tên (ghi rõ h tên)

Nguy n An Kh

ng


TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA KH & KT MÁY TÍNH

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
---------------------------Ngày 5 tháng 08 năm 2021

PHIẾU CHẤM BẢO VỆ LVTN
(Dành cho người hướng dẫn/phản biện)
1. Họ và tên SV: Đặng Minh Ngọc
MSSV: 1712345
Ngành (chuyên ngành): Khoa Học Máy Tính
2. Đề tài: Nghiên cứu và phát triển cơng cụ có sử dụng học máy để tìm kiếm, phát hiện lỗi bảo mật
trong ứng dụng web
3. Họ tên người hướng dẫn/phản biện: /Trần Hồng Tài

4. Tổng quát về bản thuyết minh:
Số trang:
Số chương:
Số bảng số liệu:
Số hình vẽ:
Số tài liệu tham khảo:
Phần mềm tính tốn:
Hiện vật (sản phẩm)
5. Tổng quát về các bản vẽ:
- Số bản vẽ:
Bản A1:
Bản A2:
Khổ khác:
- Số bản vẽ vẽ tay
Số bản vẽ trên máy tính:
6. Những ưu điểm chính của LVTN:
- Luận văn tìm hiểu ưu điểm, nhược điểm của một số hướng tiếp cận khác trong lĩnh vực tìm hiểu lỗ
hổng của mã nguồn cho 1 loại ngơn ngữ cụ thể.
- Bài tốn đề xuất có ý nghĩa thực tiễn.
- Luận văn áp dụng mơ hình học decision tree và random forest cho dữ liệu đã được đưa về dạng đồ
thị
- Tạo dựng interface cho việc kiểm tra, đánh giá dữ liệu mới.
7. Những thiếu sót chính của LVTN:
- Chỉ khai thác được một bộ dữ liệu public.
- Chưa thí nghiệm các phương pháp học phổ biến khác.
- Cần trình bày các thơng số khi áp dụng random forest chi tiết hơn
8. Đề nghị: Được bảo vệ 
Bổ sung thêm để bảo vệ 
Không được bảo vệ 
9. 3 câu hỏi SV phải trả lời trước Hội đồng:

- Đề xuất hướng tăng cường dữ liệu cho bài tốn, tự gán nhãn thì có khả thi khơng?
- Có tìm hiểu thêm các mơ hình sử dụng data tốt hơn như học sâu không?
10. Đánh giá chung (bằng chữ: giỏi, khá, TB): Giỏi

Điểm: 9.1/10
Ký tên (ghi rõ họ tên)

Trần Hồng Tài


Lời cam đoan

Tôi xin cam đoan Luận văn Tốt nghiệp “Nghiên cứu và phát triển công cụ sử dụng học
máy tìm kiếm lỗ hổng bảo mật trong ứng dụng web” là cơng trình nghiên cứu khoa học
độc lập của tơi dưới sự hướng dẫn của TS. Nguyễn An Khương, KS. Nguyễn Văn Hịa và
KS. Trần Ngọc Tín. Các số liệu nghiên cứu khoa học và kết quả nghiên cứu của luận văn
là trung thực và tài liệu tham khảo đã được ghi rõ nguồn trích dẫn.
Nếu phát hiện bất kỳ sự sao chép nào từ kết quả nghiên cứu khác hoặc sai sót về số
liệu nghiên cứu, tơi xin hồn toàn chịu trách nhiệm. Trường Đại học Bách khoa Thành
phố Hồ Chí Minh và tập thể hướng dẫn khơng liên quan đến những vi phạm tác quyền
và bản quyền do tơi gây ra trong q trình thực hiện luận văn.
KÝ TÊN: ................................................................... NGÀY: ..........................................

i


Lời cảm ơn

Với sự biết ơn sâu sắc dành cho những người đã cho tơi những lời chỉ dẫn, góp ý chân
thành cùng sự động viên và khích lệ khơng ngừng để giúp tơi hồn thành luận văn này,

tơi xin được gửi gắm lời cảm ơn tới họ tại đây.
Đầu tiên, em xin được bày tỏ lịng kính trọng và biết ơn sâu sắc đến thầy Nguyễn An
Khương. Những đánh giá chi tiết cùng định hướng nền tảng thầy đặt ra vơ cùng thực tế
và hữu ích cho em trong q trình nghiên cứu đề tài. Khơng chỉ dừng lại ở sự dẫn dắt,
chỉ bảo về kiến thức, sự quan tâm sát sao và kĩ lưỡng của thầy cũng là nguồn cổ vũ to lớn
để em có thể hồn thành luân văn này. Tiếp đến em xin chân thành cảm ơn anh Nguyễn
Văn Hịa và anh Trần Ngọc Tín, những người đã ln nhiệt tình giúp đỡ và truyền đạt
cho em những kiến thức và kinh nghiệm cần thiết. Em thật sự cảm thấy may mắn khi
được hướng dẫn những bởi những thầy, người anh tận tâm và chu đáo như vậy.
Tiếp đến, tôi xin gửi lời cảm ơn đến những người anh trong công ty Verichains và những
người bạn trong câu lạc bộ An tồn thơng tin EFIENS. Lời nhận xét, góp ý cũng như sự
động viên của họ đã góp phần khơng nhỏ giúp luận văn của tơi được hoàn thiện hơn rất
nhiều.
Đặc biệt, xin dành sự biết ơn từ tận đáy lịng cho gia đình, những người luôn yêu thương
và đặt niềm tin tuyệt đối vào con trong mọi quyết định. Con sẽ không thể vượt qua những
khó khăn và kiên trì đến cùng nếu khơng có mọi người ở bên an ủi và tiếp thêm nghị lực
cho con.
Quá trình học tập trong bốn năm tại Trường Đại học Bách Khoa Thành phố hồ Chí
Minh và đặc biệt là thời gian làm luận văn mang nhiều ý nghĩa đặc biệt đối với tơi.
Nhìn lại những ngày tháng đã qua, tôi chân thành biết ơn những người thầy, người cô
đã truyền đạt cho tôi bao kiến thức bổ ích, những người bạn đã luôn sát cánh bên tôi để
cùng tạo ra nhiều kỉ niệm vui vẻ, đáng nhớ. Những tình cảm đẹp đẽ ấy sẽ ln gắn liền
với hình ảnh đại học Bách Khoa và trở thành một phần trong tôi. Xin cảm ơn Bách Khoa!
Thành phố Hồ Chí Minh, tháng 7 năm 2021

ii


Tóm tắt luận văn


Khi vai trị của cơng nghệ thơng tin và truyền thông ngày càng gia tăng, cùng với đó là
sự xuất hiện của các ứng dụng web ở khắp mọi nơi trong cuộc sống, yếu tố bảo mật trở
thành một vấn đề quan trọng được đặt lên hàng đầu. Với mỗi ứng dụng tương tác, xử lí
thơng tin của hàng ngàn khách hàng, sự tồn tại của dù chỉ một lỗ hổng cũng có thể tạo
nên hiệu ứng dây chuyền và gây thiệt hại đáng kể đối với các cá nhân, tổ chức. Để giảm
thiểu tối đa khả năng phát sinh những hậu quả nghiêm trọng như vậy, nhu cầu về các
công cụ, kĩ thuật hỗ trợ việc kiểm tra và phát hiện lỗ hổng ngày càng tăng. Bên cạnh
đó, với sự ra đời của các kỹ thuật hướng dữ liệu, ý tưởng về việc tận dụng học máy như
một phương pháp hỗ trợ trong phát hiện lỗ hổng và kiểm tra tính an tồn của phần mềm
đang thu hút rất nhiều sự quan tâm.
Trong nghiên cứu này, chúng tơi kiểm tra khả năng dự đốn các lỗ hổng bảo mật trong
mã nguồn bằng cách sử dụng phối hợp các kỹ thuật khai thác dữ liệu và kỹ thuật học
máy. Để đạt được mục tiêu này, chúng tôi phát triển một phương pháp ánh xạ thông tin
mã nguồn khi được biểu diễn ở dạng cấu trúc đồ thị thành các đặc trưng có giá trị phân
loại. Sau đó, chúng tơi thực hiện kiểm tra xem mơ hình học máy có thể dự đốn tính an
tồn hay khơng an toàn của các đoạn mã dựa trên các đặc trưng này hay không. Để thực
hiện các bước trên, chúng tôi sử dụng một bộ dữ liệu công khai chứa một lượng lớn các
file mã nguồn đi kèm với thông tin chi tiết và đã được gắn nhãn theo loại lỗ hổng bảo
mật mà nó chứa.

iii


Mục lục

1 Giới thiệu đề tài
1.1 Đặt vấn đề . . . . . . . . . .
1.2 Mục tiêu và phạm vi đề tài
1.2.1 Mục tiêu . . . . . . .
1.2.2 Phạm vi đề tài . . .

1.3 Ý nghĩa thực tiễn . . . . . .
1.4 Bố cục của luận văn . . . .

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.


.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.

.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

1
1
3
3
3
3
4

2 Kiến thức và công nghệ nền tảng
2.1 Code Property Graph . . . . . . . . . . . . . . . .
2.1.1 Các thành phần của Code Property Graph
2.1.2 Các bước xây dựng Code Property Graph

2.2 Khai phá dữ liệu đồ thị . . . . . . . . . . . . . . .
2.2.1 Giới thiệu . . . . . . . . . . . . . . . . . .
2.2.2 Khai thác mẫu đồ thị . . . . . . . . . . . .
2.2.3 Giải thuật gSpan . . . . . . . . . . . . . .
2.2.4 Giải thuật MMRFS . . . . . . . . . . . . .
2.3 Học máy . . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Decision Trees . . . . . . . . . . . . . . . .
2.3.2 Random Forest . . . . . . . . . . . . . . .
2.3.3 Support Vector Machine . . . . . . . . . .
2.4 Lỗ hổng bảo mật trên ứng dụng web . . . . . . .
2.4.1 Sự phức tạp của ngôn ngữ PHP . . . . . .
2.4.2 Lỗ hổng kiểu Taint-style . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.


.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

5
5
6

8
10
10
11
12
14
16
16
17
18
19
20
21

.
.
.
.
.
.
.

23
23
23
24
25
30
30
30


.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

3 Những nghiên cứu liên quan
3.1 Cơng cụ tìm kiếm lỗ hổng . . . . . . . .
3.1.1 Công cụ sử dụng kỹ thuật cơ bản
3.1.2 Công cụ áp dụng kỹ thuật mới .
3.2 Biểu diễn mã nguồn . . . . . . . . . . .
3.3 Ứng dụng các kĩ thuật hướng dữ liệu . .
3.3.1 Phương pháp học sâu . . . . . . .
3.3.2 Phương pháp học máy . . . . . .
iv


.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.


.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.


.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.


4 Phương pháp đề xuất
4.1 Phát biểu bài toán . . . . . . . . . . . . . . . . .
4.2 Mô tả Tập dữ liệu . . . . . . . . . . . . . . . . . .
4.2.1 SARD . . . . . . . . . . . . . . . . . . . .
4.2.2 Xử lí Tập dữ liệu . . . . . . . . . . . . . .
4.3 Biểu diễn thông tin mã nguồn . . . . . . . . . . .
4.3.1 Mức độ chi tiết trong phân tích mã nguồn

4.3.2 Tạo đồ thị CPG từ mã nguồn . . . . . . .
4.4 Trích xuất đặc trưng . . . . . . . . . . . . . . . .
4.4.1 Khai thác mẫu đồ thị phổ biến . . . . . .
4.4.2 Khai thác tập các mẫu đồ thị phổ biến . .
4.5 Huấn luyện mơ hình học máy . . . . . . . . . . .
4.5.1 Mơ tả bài tốn . . . . . . . . . . . . . . .
4.5.2 Mô tả dữ liệu đầu vào . . . . . . . . . . .
4.5.3 Các mơ hình dự đoán . . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.

31
31
31
31
32
32
32
33
37
37
38
39
39
39
40

5 Hiện thực công cụ
5.1 Các công cụ hỗ trợ . . . . . . . . . .
5.2 Thiết kế cơ sở dữ liệu . . . . . . . . .
5.3 Hiện thực các thành phần . . . . . .
5.3.1 Tạo đồ thị CPG . . . . . . . .

5.3.2 Vector hóa đồ thị . . . . . .
5.3.3 Xây dựng mơ hình phân loại.
5.4 Thiết kế giao diện . . . . . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.


.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.

.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.

.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.

.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

41
42
43
44
44
44
44
45


6 Đánh giá
6.1 Tạo đồ thị CPG . . . . . . . . .
6.2 Vector hóa đồ thị . . . . . . . .
6.3 Hiệu suất của các bộ phân loại
6.3.1 Các chỉ số đánh giá . . .
6.4 Kiểm thử giao diện hệ thống . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.

.

.
.
.
.
.

.
.
.
.
.

48
48
50
50
51
53

.
.
.
.
.

54
54
54

54
55
56

7 Tổng kết
7.1 Kết quả đạt được . . . . . . .
7.2 Hạn chế . . . . . . . . . . . .
7.2.1 Tập dữ liệu . . . . . .
7.2.2 Phương pháp thực hiện
7.3 Phương hướng phát triển . . .

.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.

.
.
.
.
.
.
.
.

v

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.

.
.

.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.

.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.

.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.

.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.


Danh sách hình vẽ

2.1
2.2
2.3
2.4
2.5

2.6
2.7
2.8
2.9
2.10

Minh họa mã nguồn PHP . . . .
Minh họa cây AST . . . . . . . .
Minh họa đồ thị CFG . . . . . .
Minh họa đồ thị PDG . . . . . .
Minh họa đồ thị CPG . . . . . .
Minh họa một số đồ thị đẳng cấu
Mẫu dữ liệu được sử dụng cho bài
Minh họa cây quyết định . . . . .
Minh họa Random Forest . . . .
Minh họa SVM . . . . . . . . . .

. . .
. . .
. . .
. . .
. . .
. . .
toán
. . .
. . .
. . .

3.1
3.2

3.3
3.4
3.5

Các bước của q trình phân tích tĩnh1 .
Sơ đồ khai thác mẫu đồ thị . . . . . . .
Mã nguồn biểu diễn bằng AST và mảng
Biểu diễn dữ liệu bằng cây AST . . . . .
Lưu dữ liệu cây AST vào mảng . . . . .

4.1
4.2

Minh họa đồ thị CPG tạo bởi PHPJoern . . . . . . . . . . . . . . . . . . . 34
Sơ đồ khai thác mẫu đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . 37

5.1
5.2
5.3
5.4
5.5
5.6

Sơ đồ cấu trúc của công cụ . . . . . . . . . .
Thiết kế cơ sở dữ liệu . . . . . . . . . . . . .
Giao diện bảng tùy chỉnh của công cụ . . . .
Giao diện hiển thị kết quả . . . . . . . . . .
Giao diện hiển thị thông tin ở chế độ Editor
Giao diện hiển thị thông tin ở chế độ Graph


6.1
6.2

Kích thước các biểu đồ được tạo so với kích thước của mã nguồn . . . . . . 48
Thời gian tạo đồ thị CPG so với kích thước của mã nguồn . . . . . . . . . 49

vi

. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
khai thác mẫu
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
.
.
.
.
.

.
.
.
.
.


.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.

.

.
.
.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.

.
.

.
.
.
.

.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

5
6
7
8
10
11
12
17
18
19


.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.


.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.


.
.
.
.
.

24
26
26
27
27

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.

.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.


.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

.
.
.
.
.
.

41

43
45
46
46
47


Danh sách bảng

2.1

Thành phần của đồ thị . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.1

Bộ thuộc tính cần xác định của mã nguồn . . . . . . . . . . . . . . . . . . 29

4.1
4.2

Phân bố file theo loại lỗ hổng trong bộ dữ liệu . . . . . . . . . . . . . . . . 32
Bảng thống nhất nhãn cho hàm . . . . . . . . . . . . . . . . . . . . . . . . 36

5.1
5.2

Danh sách các công cụ được sử dụng . . . . . . . . . . . . . . . . . . . . . 42
Thời gian tạo đồ thị CPG cho bộ dữ liệu . . . . . . . . . . . . . . . . . . . 44

6.1

6.2
6.3
6.4
6.5

Tập giá trị thử nghiệm cho hyperparameter của bước Vector hóa đồ thị
Giá trị được chọn cho hyperparameter của bước Vector hóa đồ thị . . .
Giá trị được chọn cho hyperparameter của mơ hình phân loại . . . . .
Các chỉ số đánh giá độ hiệu quả của mơ hình phân loại . . . . . . . . .
Các chỉ số đánh giá độ hiệu quả của mô hình phân loại . . . . . . . . .

vii

.
.
.
.
.

.
.
.
.
.

50
50
51
52
53



Danh sách thuật ngữ viết tắt

SQLi
XSS
CPG
AST
CFG
PDG
SDG
AI
ML
DFS
MMRFS
LSTM

SQL injection
Cross-site Scripting
Code Property Graph
Abstract Syntax Tree
Control Flow Graph
Program Dependence Graph
System Dependence Graph
Artificial Inteligent
Machine Learning
Depth First Search
Maximal Marginal Relevance Feature Selection
Long Short Term Memory


viii


1
Giới thiệu đề tài

1.1

Đặt vấn đề

Ứng dụng web ngày càng trở nên phổ biến khi trở thành phương tiện trung gian giúp
cung cấp nhanh chóng và thuận tiện các dịch vụ đến người dùng. Hầu hết các dịch vụ này
(mạng xã hội, mua sắm trực tuyến, giao dịch tài chính,...) đều tương tác với một lượng
lớn các thông tin và dữ liệu quan trọng của các doanh nghiệp và người dùng. Chính vì
điều này mà các ứng dụng web trở thành mục tiêu bị tấn công thường xuyên bởi tin tặc.
Các cuộc tấn công với tần suất và công nghệ, kĩ thuật ngày càng cao đặt ra một yêu cầu
cấp thiết đối với các công ty, tổ chức về việc thực hiện những biện pháp kiểm tra bảo mật
cho ứng dụng web của mình. Tuy nhiên, quá trình tìm kiếm và vá các lỗi bảo mật thường
đòi hỏi thời gian và chuyên môn cao cũng như cần sự đầu tư khơng nhỏ về tài chính. Một
số giải pháp thường được sử dụng để củng cố tính bảo mật cho ứng dụng web.
• Thực hiện các quy trình kiểm tra lỗ hổng bảo mật trong mã nguồn của ứng dụng.
Đây cũng là phương pháp được nghiên cứu trong đề tài này.
• Tham gia vào các chương trình bug bounty 1 . Thiết lập các cơ chế trao thưởng dựa
vào mức độ nguy hiểm của lỗ hổng và công bố phạm vi cần được kiểm tra trực tiếp
trên trang thông tin của doanh nghiệp hoặc thông qua các trang như HackerOne 2 ,
để các chuyên gia bảo mật từ bên ngoài tham gia, tìm kiếm và thơng báo về lỗ hổng
bảo mật của ứng dụng.
• Sử dụng dịch vụ firewall của các doanh nghiệp chuyên về bảo mật, trong đó các
ứng dụng web thông thường được đặt dưới sự bảo vệ của một lớp proxy gọi là Web
Application Firewall (WAF) 3 .


Bug bounty: chương trình cho phép các hacker bên ngồi tham gia tìm kiếm lỗ hổng bảo mật, mỗi
lỗ hổng bảo mật sẽ được trả tiền dựa vào mức độ nguy hiểm và mức độ lan rộng
2
HackerOne: nền tảng bug bounty phổ biến nhất hiện nay,
3
Web application firewall: tường lửa bảo vệ ứng dụng web
1

1


Chương 1
Các giải pháp nêu trên đều rất phổ biến và được áp dụng cho nhiều ứng dụng web nhằm
giảm thiểu khả năng bị tấn công bởi các tin tặc, nhưng đồng thời cũng tồn tại rất nhiều
hạn chế. Giải pháp tham gia vào các chương trình bug bounty địi hỏi cơng ty đưa ra
chính sách trao thưởng phù hợp, hấp dẫn để thu hút được sự tham gia của các chun gia
có chun mơn cao. Q trình xác nhận lỗ hổng, kiểm tra tính hợp lệ và trao thưởng cũng
cần nhiều thời gian và nhân lực để thực hiện. Trong khi đó, một số lượng lớn các ứng dụng
web hiện nay thuộc sở hữu của các công ty, doanh nghiệp vừa và nhỏ, việc duy trì kinh phí
và đội ngũ hỗ trợ cho chương trình bug bounty là khơng thể. Xét về phương pháp dùng
WAF từ các doanh nghiệp chuyên về bảo mật cũng chưa thực sự hiệu quả. Ngun nhân
chính là vì phương pháp này chỉ đơn giản tạo ra thêm một lớp bảo vệ bên ngoài cho ứng
dụng chứ không giúp phát hiện và vá các lỗ hổng bảo mật để tạo ra một ứng dụng web an
tồn hơn. Bên cạnh đó, WAF hoạt động dựa trên các quy tắc theo mơ hình danh sách đen
(black-list), nghĩa là các truy cập tới ứng dụng bị nghi ngờ là độc hại sẽ bị chặn. Cách tiếp
cận này không hiệu quả và kết quả là các WAF thường phân loại nhầm các truy cập hợp
pháp là độc hại (false-possitive), gây ra tác động tiêu cực đến trải nghiệm của người dùng.
Ngoài hai phương pháp trên, với giải pháp đầu tiên, quy trình kiểm tra thường được
thực hiện trong nội bộ công ty trên mã nguồn của ứng dụng, giúp tiết kiệm được chi phí

sử dụng dịch vụ bên ngồi và sửa chữa được ngay các lỗi bảo mật được phát hiện. Do đó,
đây là phương pháp khả thi nhất, có thể áp dụng cho hầu hết các cơng ty.
Mã nguồn cung cấp được đầy đủ các thông tin về cấu trúc, chức năng, luồng thực thi,...
của ứng dụng. Để thu thập các thơng tin này, phân tích ứng dụng được tiến hành, trong
đó hai phương pháp thường sử dụng là phân tích tĩnh và phân tích động. Trong phân tích
tĩnh, q trình kiểm tra được thực hiện bằng cách xem xét mã nguồn mà không thực sự
thực thi chương trình. Điều này có thể giúp phát hiện lỗi ở giai đoạn đầu trong quá trình
phát triển chương trình. Phân tích động là việc kiểm tra và đánh giá chương trình bằng
cách thực thi trong thời gian thực. Mục tiêu là để tìm lỗi trong một chương trình khi nó
đang chạy, thay vì chỉ thuần túy kiểm tra mã nguồn. Tuy nhiên, một ứng dụng web hoàn
chỉnh thường được xây dựng từ mã nguồn với kích thước lớn, khiến cho q trình rà sốt
mã nguồn tốn nhiều thời gian. Chính vì vậy, nhiều cơng cụ hỗ trợ việc phân tích kiểm tra
lỗ hổng bảo mật đã được xây dựng. Tuy nhiên, các công cụ hiện nay vẫn tồn tại những
điểm yếu nhất định như không thể phát hiện được các lỗ hổng phức tạp, phát hiện nhầm
các các đoạn mã an tồn và thiếu tính linh hoạt trong việc cập nhật các loại lỗ hổng mới.
Học máy (ML) là một nhánh của Trí tuệ nhân tạo (AI), tập trung vào việc xây dựng các
ứng dụng có khả năng học (trích xuất và sử dụng được thơng tin có giá trị) từ dữ liệu
và cải thiện độ chính xác của chúng theo thời gian mà khơng cần phải được lập trình
cụ thể để làm như vậy. Sự xuất hiện kỹ thuật mới như học máy mở ra nhiều hướng giải
quyết mới mẻ cho các bài toán phức tạp. Với ưu điểm là khả năng học từ một lương lớn
dữ liệu của kỹ thuật này, việc ứng dụng học máy để xây dựng các mơ hình nhận diện và
phát hiện lỗ hổng trong mã nguồn có thể giúp cải thiện đáng kể thời gian và hỗ trợ hiệu
quả cho quá trình tìm kiếm [17, 26]. Trong đề tài luận văn này, sinh viên sẽ thực hiện
nghiên cứu và phát triển mơ hình ứng dụng các kỹ thuật học máy vào quá trình kiểm tra
mã nguồn để tự động nhận diện sự tồn tại của một số lỗ hổng bảo mật trong ứng dụng web.

2


Chương 1


1.2
1.2.1

Mục tiêu và phạm vi đề tài
Mục tiêu

Đề tài này được thực hiện nhằm nghiên cứu phương pháp phân tích mã nguồn có sự hỗ
trợ của kỹ thuật học máy, giúp tìm kiếm lỗ hổng bảo mật ứng dụng web hiệu quả. Cụ
thể, đề tài cần giải quyết được ba nhiệm vụ cơ bản sau
• Biểu diễn được đầy đủ nhất có thể các thơng tin trích xuất được từ mã nguồn.
• Ánh xạ các thơng tin từ mã nguồn về dạng các vector đặc trưng phù hợp để phục
vụ q trình học máy.
• Chuẩn hóa q trình tìm kiếm lỗi bảo mật trong ứng dụng như một bài toán phân
loại nhị phân của học máy.

1.2.2

Phạm vi đề tài

Hiện nay, các ứng dụng web được phát triển bằng nhiều loại công nghệ khác nhau. Mỗi
ngôn ngữ, kỹ thuật được sử dụng trong mã nguồn và mỗi loại lỗ hổng bảo mật đều có cấu
trúc, thuộc tính,... khác nhau mà người thực hiện kiểm tra bảo mật cần xem xét đến. Để
đảm bảo nội dung nghiên cứu phù hợp với thời gian và khả năng hiện tại, trong đề tài
này, sinh viên sẽ tập trung vào phân tích và xử lí trên mã nguồn với các đặc điểm chính
sau
• Ngơn ngữ lập trình của mã nguồn - PHP: PHP là ngơn ngữ lập trình phía máy
chủ được sử dụng rộng rãi và là nền tảng cho nhiều ứng dụng web như Facebook,
Wordpress, Tumblr. PHP hoạt động tốt với HTML và nhiều cơ sở dữ liệu khác
nhau, khiến nó trở thành một ngôn ngữ phổ biến được dùng khi xây dựng các ứng

dụng web động. Đề tài này sẽ nghiên cứu phương pháp tìm kiếm lỗ hổng trên mã
nguồn PHP.
• Lỗ hổng bảo mật dạng taint-style: Lỗ hổng kiểu taint-style là loại lỗ hổng bảo
mật phổ biến, với đặc điểm dữ liệu đầu vào có thể bị điều khiển bởi tin tặc được đưa
đến một hàm thực thi chức năng quan trọng thơng qua một con đường khơng an
tồn. Điển hình là các lỗ hổng bảo mật như SQL Injection, Code Injection, XSS,...
Loại lỗ hổng này sẽ được sử dụng làm mục tiêu nghiên cứu trong đề tài này.

1.3

Ý nghĩa thực tiễn

Đề tài được nghiên cứu với mục tiêu khai thác tiềm năng của các kỹ thuật học máy trong
lĩnh vực bảo mật phần mềm. Điều này có ý nghĩa quan trọng trong việc đáp ứng yêu cầu
về tính riêng tư và bảo mật của xã hội hiện đại, nơi mọi thứ được vận hành bằng công
nghệ và thông tin dữ liệu là tài nguyên quý giá.
Bên cạnh đó, đề tài còn là sự tiếp nối và mở rộng các nghiên cứu hướng đến phát triển
một cơng cụ vừa có khả năng tự động hóa q trình tìm kiếm lỗ hổng bảo mật và vừa
hỗ trợ linh hoạt cho người thực hiện kiểm tra mã nguồn. Các phương pháp được đề xuất
trong đề tài sẽ đóng góp thêm hướng giải quyết cho các bài tốn con của q trình xây
dựng cơng cụ này.
3


Chương 1

1.4

Bố cục của luận văn


Chương 1 - Giới thiệu đề tài
Trình bày tổng quan về vấn đề cần giải quyết, mục tiêu, phạm vi của đề tài, đồng thời
nêu ý nghĩa thực tiễn của luận văn.
Chương 2 - Kiến thức và công nghệ nền tảng
Giới thiệu một số kiến thức nền tảng quan trọng phục vụ cho đề tài.
Chương 3 - Những nghiên cứu liên quan
Phân tích một số hướng tiếp cận các vấn đề chính cần giải quyết đã được nghiên cứu
trong các tài liệu khác.
Chương 4 - Phương pháp đề xuất
Trình bày chi phương pháp đề xuất để hiện thực công cụ.
Chương 5 - Hiện thực công cụ
Trình bày chi tiết các bước hiện thực cơng cụ theo phương pháp đã đề xuất.
Chương 6 - Đánh giá
Thực hiện phân tích và đánh giá cơng cụ đã xây dựng.
Chương 7 - Tổng kết
Đánh giá các điểm đạt được và các khuyết điểm còn tồn tại của luận văn. Trình bày
hướng phát triển tiếp theo của đề tài.

4


2
Kiến thức và công nghệ nền tảng

2.1

Code Property Graph

Code property graph (CPG) là một hình thức biểu diễn thơng tin của mã nguồn dưới
dạng đồ thị, được giới thiệu lần đầu bởi nhóm nghiên cứu của tác giả Fabian Yamaguchi

[32]. Trong đó, nội dung mà CPG thể hiện là sự kết hợp từ các thuộc tính của cây cú
pháp trừu tượng (AST), đồ thị luồng điều khiển (CFG) và đồ thị phụ thuộc chương trình
(PDG). Ý tưởng chính trong việc kết hợp 3 loại đồ thị biểu diễn mã nguồn đã nêu vào
trong một cấu trúc dữ liệu chung là việc thông tin về mã nguồn được khai thác đầy đủ
trên nhiều khía cạnh (thuộc tính cú pháp, luồng điều khiển, luồng dữ liệu, ...) sẽ cho phép
tìm kiếm được các mẫu dữ liệu có giá trị phục vụ cho quá trình tìm kiếm lỗ hổng bảo
mật tồn tại trong mã nguồn.
1 2 function func () {
3
if ( isset ( $_POST [ ’ code ’ ]) ) {
4
$code = $_POST [ ’ code ’ ];
5
eval ( $code ) ;
6
}
7 }
8 ?>

Hình 2.1: Mã nguồn PHP chứa lỗi Command Injection
Trong phần này, chúng tơi sẽ trình bày tóm tắt các khái niệm liên quan tới việc xây
dựng CPG từ mã nguồn PHP để người đọc nắm được vai trò của các thành phần cấu
tạo nên cấu trúc đồ thị này. Đoạn mã PHP ở Hình 2.1 sẽ được sử dụng làm ví dụ minh
họa cho các khái niệm được trình bày tiếp theo đây. Đoạn mã minh họa hiện thực một
hàm tên func với chức năng kiểm tra sự xuất hiện của tham số code được gửi tới bằng
phương thức POST trong phần thân (body) của request (tham số này được chứa trong
biến $_POST[code]) và sử dụng hàm eval() để thực thi câu lệnh hoặc biểu thức chứa
trong biến $_POST[code] nếu có. Lỗi Command Injection của đoạn mã này tồn tại do
hàm eval() trực tiếp thực thi câu lệnh trong biến có giá trị truyền từ ngồi vào mà

khơng thực hiện kiểm tra sàng lọc, dẫn đến kẻ tấn công có thể truyền vào câu lệnh gây
hại đến ứng dụng hoặc làm lộ thông tin quan trọng.
5


Chương 2

2.1.1

Các thành phần của Code Property Graph

Abstract Syntax Tree - AST. Cây cú pháp trừu tượng (AST) là biểu diễn dạng cây
cho cấu trúc cú pháp trừu tượng của mã nguồn được viết bằng ngơn ngữ lập trình. Tính
trừu tượng của cây AST được thể hiện ở chỗ nó khơng có sự ràng buộc biểu diễn theo
một ngơn ngữ lập trình cụ thể nào mà tập trung vào việc thể hiện cách các cấu trúc lập
trình được lồng vào nhau và tạo thành chương trình hồn chỉnh.
Trong AST, nút trong đại diện cho các tốn tử (ví dụ: tốn tử cộng hoặc toán tử trừ),
nút lá tương ứng với tốn hạng (ví dụ: hằng số hoặc định danh). Cây AST sinh ra từ
đoạn mã PHP minh họa được thể hiện ở Hình 2.2.
Mặc dù AST cũng được sử dụng trong q trình phân tích các đoạn mã chương trình [5]
[31] nhưng do không thể hiện được những thông tin quan trọng như luồng điều khiển hay
sự phụ thuộc các biến dữ liệu nên không cung cấp được đầy đủ thơng tin cho việc tìm
kiếm lỗ hổng bảo mật có thể tồn tại.

FUNC

IF

PRED


STMT

CALL

isset

STMT

=

ARG

$_POST[’c’]

$code

$_POST[’c’]

CALL

eval

ARG

$code

Hình 2.2: Cây cú pháp trừu tượng AST cho đoạn mã ở Hình 2.1

6



Chương 2
Control Flow Graph - CFG. Đồ thị luồng điều khiển (CFG) sử dụng các ký hiệu
của đồ thị, biểu diễn tất cả các luồng điều khiển có thể được duyệt qua trong một chương
trình. Một đồ thị luồng điều khiển có các đặc điểm chính sau:
• Là đồ thị có hướng.
• Mơ tả các đường dẫn luồng điều khiển và các nút trong CFG mô tả các khối lệnh
điều khiển cơ bản.
• Hiển thị tất cả các đường dẫn có thể được duyệt qua trong q trình thực thi chương
trình.
Đồ thị luồng điều khiển chủ yếu được sử dụng trong phân tích tĩnh cũng như được ứng
dụng trong các trình biên dịch, vì nó thể hiện được chính xác dịng thực thi bên trong
của một đơn vị chương trình. Tuy nhiên, đối với phân tích lỗ hổng, CFG khơng cung cấp
được thông tin về luồng dữ liệu, điều này có nghĩa là khơng thể sử dụng đồ thị này để
xác định dữ liệu khơng an tồn truyền vào bởi kẻ tấn công được xử lý qua những câu
lệnh nào. Hình 2.3 minh họa đồ thị luồng điều khiển cho đoạn mã ví dụ ban đầu.

Start

if(isset($_POST[’code’]))
yes
$code = $_POST[’code’]
no
eval($code)

Stop

Hình 2.3: Đồ thị luồng điều khiển CFG cho đoạn mã ở Hình 2.1
Program Dependence Graphs - PDG. Đồ thị phụ thuộc chương trình (PDG) được
giới thiệu trong nghiên cứu của nhóm tác giả Jeanne Ferrante [11], sử dụng cho quá trình

phân đoạn chương trình (program slicing) [30]. Thành phần tạo nên PDG bao gồm:
• Các node thể hiện câu lệnh hoặc biểu thức có trong hàm.
• Cạnh biểu diễn sự phụ thuộc dữ liệu giữa các biến, từ khi được khai báo, khởi
tạo đến khi được sử dụng trong chương trình và lan truyền dữ liệu nó chứa sang
một biến khác. Để xác định được các cạnh này, cần giải quyết bài toán reaching
definitions 1 .
1
Reaching definitions: một bài toán thường gặp trong phân tích luồng dữ liệu. https://en.
wikipedia.org/wiki/Reaching_definition

7


Chương 2
• Cạnh biểu diễn sự phụ thuộc điều khiển luồng thực thi của các câu lệnh trong
chương trình vào các biểu thức vị từ. Các cạnh này có thể được xác định dựa vào
biểu đồ luồng thực thi.
Cần lưu ý, các cạnh phụ thuộc điều khiển trong PDG không giống với cạnh biểu diễn
luồng thực thi trong CFG. Trên thực tế, trong PDG, thứ tự thực thi của các câu lệnh
khơng thể được xác định, nó chỉ tập trung vào thể hiện sự phụ thuộc của việc câu lệnh
có được thực thi hay không vào giá trị của biểu thức vị từ.
Đồ thị PDF ở Hình 2.4 được tạo từ đoạn mã PHP minh họa. Trong đó, cạnh gán nhãn
Cf biểu diễn sự phụ thuộc điều khiển giữa các câu lệnh và cạnh gán nhãn D$code biểu diễn
sự phụ thuộc dữ liệu trong biến $code.
if(isset($_POST[’code’]))
Cf
Cf

$code = $_POST[’code’]
D$code

eval($code)

Hình 2.4: Đồ thị phụ thuộc chương trình PDG cho đoạn mã ở Hình 2.1

2.1.2

Các bước xây dựng Code Property Graph

Để sử dụng hiệu quả thơng tin có được từ AST, CFG và PDG, ta kết hợp cả 3 đồ thị này
vào một cấu trúc chung. Để thực hiện điều này, trước hết ta cần biến đổi AST, CFG, PDG
thành các php-static-analysis. Property graph [property-graph] là một loại mơ hình đồ
thị bao gồm các nút, quan hệ (biểu diễn bởi các cạnh có hướng), thuộc tính và nhãn. Cả
nút dữ liệu và quan hệ trong đồ thị đều được đặt tên và chứa các thuộc tính được biểu
diễn dưới dạng cặp khóa - giá trị. Đây là kiểu biểu diễn dữ liệu cơ bản trong các cơ sở dữ
liệu đồ thị như Neo4J, OrientDB.
Một property graph được định nghĩa [32] như sau:
Định nghĩa 1 Một property graph được kí hiệu G = (V, E, λ, µ) là một đa đồ thị có
hướng, có thuộc tính, có cạnh được gán nhãn. Trong đó, V là tập các nút, E ⊆ (V × V )
là tập các cạnh có hướng, và λ : E → Σ là một hàm gán nhãn thực hiện gán các nhãn từ
tập Σ cho mỗi cạnh trong đồ thị. Các thuộc tính được gán cho các cạnh và các nút bng
hm à : (V E) ì K S với K là tập các khóa của thuộc tính và S là tập các giá trị
của thuộc tính.
Biến đổi AST. Cây cú pháp trừu tượng AST biến đổi thành một property graph, được
kí hiệu GA = (VA , EA , A , àA ). Trong ú:
ã VA l tp cỏc nút của đồ thị, tương ứng với các nút có trong cây ban đầu.
• EA là tập hợp các cạnh tương ứng được gắn nhãn cạnh của AST thông qua hàm
gán nhãn λA .
8



Chng 2
ã àA gỏn cỏc cp thuc tớnh KA = {code, order} cho các nút và cạnh sao cho thuộc
tính code tương ứng với toán tử hoặc toán hạng mà nút đó thể hiện, thuộc tính
order tương ứng với thứ tự của nút tương ứng trong cây AST.
Biến đổi CFG. Tương tự như AST, đồ thị luồng điều khiển CFG cũng được biểu diễn
˙ Trong đó:
dưới dạng property graph GC = (VC , EC , λC , ).
• Các nút trong VC tương ứng với các câu lệnh và biểu thức vị từ trong AST, cũng
chính là các nút trong VA có giá trị thuộc tính code là STMT và PRED.
• EC là tập hợp các cạnh tương ứng được gắn nhãn. Hàm gán nhãn λC được định
nghĩa để gán các nhãn trong tập ΣC = {true, f alse, ǫ} vào các cạnh trong GC , ứng
với các luồng thực thi khi điều kiện là true, false, khơng có điều kiện trong CFG.
Biến đổi PDG. Đồ thị phụ thuộc chương trình PDG biểu diễn sự phụ thuộc vào dữ liệu
và luồng điều khiển giữa các câu lệnh và biểu thức vị từ. Do các nút trong đồ thị PDG giống
với các nút trong CFG, PDG sẽ được chuyển thành property graph GP = (VC , EP , λP , µP )
với:
• VC là tập các đỉnh trong property graph của đồ thị PDG.
• EP là tập hợp các cạnh trong đồ thị. Nhãn của cạnh trong EP được gán bởi hàm
λP : EP → ΣP với ΣP = {C, D} tương ứng lần lượt biểu diễn cho trạng thái phụ
thuộc d liu v ph thuc lung iu khin.
ã Hm àP gán thêm một thuộc tính symbol cho cạnh biểu diễn sự phụ thuộc dữ liệu
để xác định dữ liệu phụ thuộc tương ứng, và gán thêm thuộc tính condition cho
cạnh biểu diễn sự phụ thuộc luồng điều khiển để xác định trạng thái tương ứng của
biểu thức vị từ mà luồng điều khiển phụ thuộc vào là true hay f alse.
Kết hợp các đồ thị. Nhận thấy ở cả ba đồ thị, các câu lệnh và biểu thức vị từ trong
chương trình đều có nút tương ứng thể hiện, riêng đối với AST, ngồi các nút chung cịn
xuất hiện thêm các nút con để mô tả cú pháp trong câu lệnh, biểu thức. Dựa vào nhận
xét này, code property graph được định nghĩa [32] như sau:
Định nghĩa 2 Một code property graph là một property graph G = (V, E, λ, µ) được
xây dựng từ AST, CFG và PDG của mã nguồn với

• V = VA ,
• E = EA ∪ EC ∪ EP ,
• λ = λA ∪ λC P v
ã à = àA àP

9


Chương 2

false
Ctrue
true

ǫ
START

PRED

ǫ
CALL

=

CALL
ARG

$code

END


D$code

Ctrue

isset

ǫ

STMT

$_POST[’c’]

eval

ARG
$code

$_POST[’c’]

Hình 2.5: Code Property Graph biểu diễn đoạn mã ở Hình 2.1

2.2
2.2.1

Khai phá dữ liệu đồ thị
Giới thiệu

Đồ thị là một dạng biểu diễn thông tin trực quan và hữu ích. Các thành phần của đồ thị
khơng chỉ biểu diễn được tương ứng các thông tin của dữ liệu dạng bảng (3.1) mà cịn có

thể biểu diễn những thơng tin phức tạp trong thế giới thực. Tương tự, nhiều vấn đề trong
thế giới thực thông qua biểu diễn bằng đồ thị có thể được giải quyết bằng cách áp dụng
các phương pháp học máy phù hợp. Khai phá dữ liệu đồ thị (graph mining) chính là lĩnh
vực nghiên cứu về cách thực hiện khai phá dữ liệu và học máy trên dữ liệu được biểu diễn
bằng đồ thị [6] [23]. Một trong những nhiệm vụ thách thức nhất trong khai phá dữ liệu
đồ thị là khai thác mẫu trong đồ thị. Điều này đòi hỏi việc sử dụng các thuật toán khai
phá dữ liệu để khám phá các mẫu có giá trị và hữu ích trong một số lượng lớn dữ liệu.
Bảng 2.1: Các thành phần tương ứng trong dữ liệu bảng và dữ liệu đồ thị
Data Instance
Graph Instance
Element
Vertex
Element’s Attributes
Vertex Labels
Relation between two elements Edge
Type of relation
Edge Labels otherwise

10


Chương 2

2.2.2

Khai thác mẫu đồ thị

Trong phần này, chúng tôi sẽ trình bày khái niệm của một số thuật ngữ quan trọng và
nội dung giải thuật được sử dụng cho bước khai thác mẫu đồ thị ở Mục 4.4.
Đồ thị có gán nhãn. Một đồ thị có gán nhãn được kí hiệu G = {V, E, L, ℓ}, trong

đó:
• V là tập các đỉnh trong đồ thị.
• E ⊆ V × V là tập các cạnh.
• L là tập các nhãn.
• ℓ : V ∪ E → L là hàm gán nhãn cho các cạnh và các đỉnh.
Phép đẳng cấu. Phép đẳng cấu (isomorphism) là một hàm song ánh f : V (G) → V (H)
với:
• ℓG (u) = ℓH (f (u)), với u ∈ V (G)


(f (u), f (v)) ∈ E(H)
ℓG (u, v) = ℓH (f (u), f (v))

, với (u, v) ∈ E(G)

Giữa hai đồ thị đẳng cấu tồn tại một phép đẳng cấu.
A

C

B

A

C

A

B


C

C

C

A

B

C

A

A

Hình 2.6: Minh họa một số đồ thị đẳng cấu
Mẫu đồ thị phổ biến. Các mẫu đồ thị phổ biến (frequent graph pattern) là các đồ thị
con được tìm thấy từ tập dữ liệu đồ thị hoặc một đồ thị lớn duy nhất, có tần suất xuất
hiện không thấp hơn ngưỡng do người dùng chỉ định. Các đồ thị con này thường có ích
trong việc mơ tả các tập đồ thị, phân biệt các nhóm đồ thị khác nhau, phân loại và phân
nhóm đồ thị.
Mức hỗ trợ. Hỗ trợ (support) là thước đo tần suất mẫu xuất hiện trong bộ dữ liệu
đồ thị. Một mẫu được coi là phổ biến nếu hỗ trợ của nó không nhỏ hơn giá trị hỗ trợ tối
thiểu được đặt ra. Một thuộc tính quạn trọng của hỗ trợ là tính chống đơn điệu (antimonotonicity). Điều này có nghĩa là nếu một mẫu được coi là phổ biến thì tất cả các mẫu
con (sub-pattern) của nó cũng được coi là phổ biến.
Khai thác mẫu đồ thị. Bài toán khai thác mẫu phổ biến (frequent items) là lớp bài
11



Chương 2
toán quan trọng trong lĩnh vực khai phá dữ liệu, mục tiêu là tìm tất cả các tập mẫu, liên
kết, tương quan hoặc cấu trúc xuất hiện thường xuyên trong các cơ sở dữ liệu và các kho
thông tin dữ liệu. So với bài toán khai thác mẫu phổ biến trên giao dịch (transaction)
thường thấy, việc tìm kiếm mẫu đồ thị con phổ biến gặp những khó khăn liên quan tới
tính chất của đẳng cấu đồ thị cũng như việc định nghĩa thứ tự các đỉnh và cạnh.
Date
1
3
7
9
1
4
6
...

CustomerID
01
01
01
01
02
02
02
...

Item Purchased
A
B
FG

C
B
FG
C
...

A

(a) Minh họa dữ liệu dạng giao dịch phẳng

B

C

C

A

(b) Minh họa dữ liệu dạng đồ thị

Hình 2.7: Mẫu dữ liệu được sử dụng cho bài toán khai thác mẫu
Cụ thể, xét dữ liệu minh họa trong hình 2.7, đối với dữ giao dịch tuần tự (sequential
transaction) trong bảng 2.7a, mẫu khai thác có thể được biểu diễn ở dạng < B(F G)C >.
Cách biểu diễn này thể hiện được một thứ tự về thời gian giữa các thành phần: đầu tiên
là B, sau đó F và G, cuối cùng là D. Tuy nhiên, đối với dữ liệu đồ thị ở hình 2.7b, nếu
muốn biểu diễn thứ tự và sự kết nối giữa các thành phần trong đồ thị chỉ bằng cách đánh
số các đỉnh, ta sẽ có vơ vàn cách đánh số khiến cho một đồ thị có nhiều hơn một cách
biểu diễn thứ tự. Những gì chúng ta cần là một bộ quy tắc giúp cho việc đánh số các nút
/ đỉnh của đồ thị luôn tuân theo cùng một loại thứ tự và do đó khơng làm lãng phí thời
gian để xử lý các biểu diễn với cách đánh số khác nhau, nhưng lại đại diện cho cùng một

đồ thị tương tự đã có. Trong luận văn này, chúng tơi sử dụng thuật tốn gSpan để khai
thác mẫu dữ liệu và do đó sẽ sử dụng DFS Code để giải quyết vấn đề trên.

2.2.3

Giải thuật gSpan

DFS Code. Xét đồ thị G và một cây duyệt đồ thị theo chiều sâu T, một chuỗi cạnh (ei )
được xây dựng dựa trên quan hệ thứ tự tuyến tính (linear order) ≺T sao cho ei ≺T ei+1 ,
với i = 0, . . . , E − 1. (ei ) được gọi là DFS code, kí hiệu code(G, T ).
Thuật tốn gSpan được đề cập sau đây sử dụng quan hệ thứ tự tuyến tính DFS lexicographic order được định nghĩa chi tiết trong nghiên cứu [33].
Thuật toán gSpan: Một trong những thuật toán được sử dụng để khai thác mẫu
đồ thị phổ biến từ tập dữ liệu đồ thị là gSpan [33]. Thuật toán sử dụng biểu diễn dạng
danh sách kề để lưu các đồ thị. Ta xét D đại diện cho tập dữ liệu đồ thị, S chứa kết quả
khai thác. Giả sử ta có tập các nhãn của đỉnh {A, B, C, · · · } và tập nhãn của các cạnh
{a, b, c, · · · }. Chi tiết các bước của thuật tốn (Algorithm 1) như sau:
• Dòng 1-6: Thực hiện bước loại bỏ các đỉnh và cạnh không phổ biến trong tập dữ
liệu đồ thị D. Sau đó thực hiện gán nhãn lại cho các đỉnh và cạnh còn lại theo thứ
12


Chương 2
tự giảm dần của tần xuất xuất hiện. Sau đó, thêm tất cả các đồ thị một cạnh phổ
biến vào tập S và sắp xếp thứ tự của chúng theo DFS lexicographic order.
• Dịng 8-9: Với mỗi đồ thị con một cạnh, giải thuật Subgraph_M ining (Algorithm 2)
thực hiện mở rộng trên một cạnh lấy từ s (s là một DFS code). Subgraph_M ining
được gọi đệ quy để mở rộng đồ thị và tìm tất cả đồ thị con phổ biến trong đó.
• Dịng 10: Thu giảm mỗi đồ thị trong tập đồ thị D bằng cách loại bỏ cạnh sau khi tất
cả các đồ thị kế thừa (descendants) của đồ thị một cạnh này đã được tìm thấy. Ví
dụ, ở vịng lặp đầu tiên tìm kiếm tất cả các đồ thị con phổ biến chứa cạnh A−a−A.

Vòng lặp thứ 2 tìm kiếm các đồ thị con phổ biến chứa A − a − B mà không chứa
A − a − A. Bước này được lặp lại giúp thu giảm tập đồ thị ban đầu thành các đồ
thị nhỏ với ít đỉnh và cạnh hơn, giúp q trình khai thác mẫu trở nên nhanh hơn.
• Dịng 7,11: Dừng tìm kiếm khi tất cả các đồ thị phổ biến một cạnh và các đồ thị kế
thừa được tìm ra hết.
Algorithm 1: GraphSet_Projection(D, S)
1 Sort the labels in D by their frequency;
2 Remove infrequent vertices and edges;
3 Relabel the remaining vertices and edges;
4 S ← all frequent 1-edge graphs in D;
5 Sort S in DFS lexicographic order;
6 S ← S ;
7 foreach edge e ∈ S do
8
Initialize s with e, set s.D by graphs which contains e;
9
Subgraph_Mining(D, S, s);
10
D ← D − e;
11
if D ≤ minSup then
12
break;
13
end
14 end

13



×