ĐẠ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
ĐẠI HỌC QUỐC GIA TP.HCM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA: KH & KT Máy tính
BỘ MÔN: KHMT
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
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 quá 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ụ hoàn chỉnh có khả năng dự đoá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ƯỚNG DẪN CHÍNH
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:______________________________
(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ười hướng dẫn)
1. Họ và tên SV: Đặng Minh Ngọc
MSSV: 1712345 (MT17KH02)
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ản vẽ:
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ị: Được bảo vệ
Bổ sung thêm để bảo vệ
Không được bảo vệ
9. Một số câu hỏi SV phải trả lời trước Hội đồng: Không có(SV sẽ được hỏi trực tiếp trên HĐ)
10. Đánh giá chung (bằng chữ: giỏi, khá, TB): Giỏi
Đ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 toá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 toá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 toá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 hoà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 quá 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 hoà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 quá 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ể hoà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 đã luôn 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 toà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ẽ luôn 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 toà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ự đoá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ự đoán tính an
toà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 toá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 quá 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 .
1
Bug bounty: chương trình cho phép các hacker bên ngoà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, https://hackerone.com
3
Web application firewall: tường lửa bảo vệ ứng dụng web
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 chuyên gia
có chuyên môn cao. Quá 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ả. Nguyên 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
toà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 ngoà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, quá 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 quá trình rà soá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 toà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ụ quá trình học máy.
• Chuẩn hóa quá 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
toà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 quá 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 toán con của quá 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 php
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ừ ngoà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 hoàn chỉnh.
Trong AST, nút trong đại diện cho các toán tử (ví dụ: toán tử cộng hoặc toán tử trừ),
nút lá tương ứng với toá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 quá 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 quá 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 toà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 bằng
hàm µ : (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à tập 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
- Xem thêm -