Đăng ký Đăng nhập
Trang chủ 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 ...

Tài liệu 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

.PDF
71
1
114

Mô tả:

ĐẠ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 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 -

Tài liệu liên quan