Lỗ hổng phần mềm là lỗ hổng hoặc khuyết điểm trong quá trình xây dựng phần mềm có thể bị khai thác bởi một kẻ tấn công để có được một số đặc quyền trong hệ thống.. Một số loại mô hình dự
Trang 2Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
MỤC LỤC
MỤC LỤC 2
LỜI CAM ĐOAN 4
LỜI CẢM ƠN 5
DANH MỤC HÌNH VẼ 6
DANH MỤC BẢNG 7
DANH MỤC TỪ VIẾT TẮT 8
MỞ ĐẦU 9
CHƯƠNG 1: GIỚI THIỆU 12
1.1 Bảo mật phần mềm 12
1.2 Lỗ hổng phần mềm 12
1.3 Dự đoán lỗ hổng phần mềm 19
1.4 Các phương pháp dự đoán lỗ hổng phần mềm đã có 19
1.5 Mục tiêu của luận văn 23
1.6 Kết luận Chương 1 24
CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 25
2.1 Tổng quan về học máy (Machine Learning - ML) 25
2.2 Bài toán phân lớp 32
2.3 Một số phương pháp (mô hình) phân lớp 34
2.4 Đánh giá các mô hình phân lớp 43
2.5 Bài toán giảm chiều dữ liệu 45
2.6 Một số phương pháp giảm chiều dữ liệu 46
2.7 Kết luận Chương 2 47
CHƯƠNG 3: MÔ HÌNH DỰ ĐOÁN LỖ HỔNG PHẦN MỀM SỬ DỤNG PHƯƠNG PHÁP PHÂN LỚP DỮ LIỆU 48
3.1 Giới thiệu bài toán 48
Trang 3Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
3.2 Mô hình đề xuất 48
3.3 Dữ liệu và tiền xử lý dữ liệu 51
3.4 Áp dụng mô hình và dữ liệu vào thực nghiệm 53
3.5 Kết quả thực nghiệm 55
3.6 Thảo luận 56
3.7 Kết luận Chương 3 58
KẾT LUẬN 59
TÀI LIỆU THAM KHẢO 60
Trang 4Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
LỜI CAM ĐOAN
Tôi xin cam đoan bản luận án này là kết quả nghiên cứu của cá nhân tôi Các số liệu và tài liệu được trích dẫn trong luận án là trung thực Kết quả nghiên cứu này không trùng với bất cứ công trình nào đã được công bố trước đó
Tôi chịu trách nhiệm với lời cam đoan của mình
Hà Nội, tháng 05 năm 2017
Lê Hà Minh
Trang 5Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
LỜI CẢM ƠN
Để hoàn thành chương trình cao học và luận văn này, tôi đã nhận được sự hướng dẫn, giúp đỡ và góp ý nhiệt tình của quý thầy cô Khoa Công nghệ thông tin, Trường Đại học Sư phạm Hà Nội
Trước hết, tôi xin chân thành cảm ơn đến quý thầy cô Khoa Công nghệ thông tin trường Đại học Sư phạm Hà Nội, đặc biệt là những thầy cô đã tận tình dạy bảo tôi suốt thời gian học tập
Tôi xin gửi lời biết ơn sâu sắc và chân thành nhất đến PGS.TS Trần Đăng Hưng đã dành rất nhiều thời gian và tâm huyết hướng dẫn nghiên cứu và giúp tôi hoàn thành luận văn tốt nghiệp
Cuối cùng, tôi xin gửi lời cảm ơn tới những người thân trong gia đình tôi, bố
mẹ, chị gái cùng bạn bè đã luôn động viên tôi trong quá trình học tập và hoàn thành khóa luận của mình
Mặc dù có nhiều cố gắng hoàn thiện luận văn bằng tất cả sự nhiệt tình và năng lực của mình, tuy nhiên không thể tránh khỏi những thiếu sót, rất mong nhận được những đóng góp quý báu của quý thầy cô và các bạn
Trang 6Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
DANH MỤC HÌNH VẼ
Hình 2.1 Ý tưởng của học máy 25
Hình 2.2 Độ dốc của một đường thẳng 27
Hình 2.3 Tính biến thiên của đồ thị 27
Hình 2.4 Độ dốc giữa 2 điểm trên đồ thị 28
Hình 2.5 Độ dốc của một điểm trên đồ thị 28
Hình 2.6 Giá trị J(θ) tại một điểm 29
Hình 2.7 Thay đổi J(θ) 29
Hình 2.8 Thay đổi J(θ) đạt cực tiểu địa phương 30
Hình 2.9 J(θ) thay đổi thất thường 30
Hình 2.10 Nhược điểm của giải thuật gradient descent 31
Hình 2.11 Đồ thị có thể tìm cực tiểu 31
Hình 2.12 Đồ thị lý tưởng để tìm cực tiểu 31
Hình 2.13 Siêu mặt phẳng một chiều và hai chiều 38
Hình 2.14 Siêu mặt phẳng phân cách tối ưu 38
Hình 2.15 Siêu mặt phẳng với biên cực đại 39
Hình 2.16 Thêm dữ liệu mới làm thay đổi siêu mặt phẳng với biên cực đại 40
Hình 2.17 Các điểm dữ liệu phân lớp sai theo biên và siêu mặt phẳng 40
Hình 2.18 Dữ liệu không thể phân tách tuyến tính 41
Hình 2.19 Ví dụ phân tách phi tuyến tính 42
Trang 7Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
DANH MỤC BẢNG
Bảng 1.1 Các nghiên cứu về dự đoán lỗ hổng phần mềm đã có 22
Bảng 2.1 Các hàm nhân thông dụng 43
Bảng 2.2 Ma trận nhầm lẫn 44
Bảng 3.1 Dữ liệu thực nghiệm 51
Bảng 3.2 Các bước tiền xử lý dữ liệu 52
Bảng 3.3 Ví dụ về vector đặc trưng của một ứng dụng 53
Bảng 3.4 Kết quả thực nghiệm 1 55
Bảng 3.5 Kết quả thực nghiệm 2 56
Trang 8Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
DANH MỤC TỪ VIẾT TẮT
V & V Verification & Validation
HTTP HyperText Transfer Protocol
SAG Security Activity Graphs
Trang 9Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
MỞ ĐẦU
Phần mềm là thành phần phổ biến của các thiết bị hoặc hệ thống chúng ta vẫn sử dụng hàng ngày trên máy tính Những hệ thống này thường phức tạp và được phát triển bởi các lập trình viên khác nhau Thông thường các lập trình viên mắc lỗi trong quá trình xây dựng mã nguồn có thể tạo ra các lỗ hổng phần mềm Lỗ hổng phần mềm là lỗ hổng hoặc khuyết điểm trong quá trình xây dựng phần mềm
có thể bị khai thác bởi một kẻ tấn công để có được một số đặc quyền trong hệ thống Hay nói một cách khác lỗ hổng phần mềm cung cấp một điểm có thể vào hệ thống Số lượng các lỗ hổng phần mềm được báo cáo ngày nay đang tăng lên đáng
kể đã trở thành lý do mà bảo mật phần mềm trở thành một lĩnh vực nghiên cứu quan trọng Sự có mặt của các lỗ hổng trong sản xuất phần mềm dẫn đến cần thiết phải có các công cụ có thể giúp nhà phát triển tránh hoặc phát hiện lỗ hổng trong quá trình xây dựng phần mềm
Xây dựng phần mềm an toàn là một vấn đề khó khăn, tốn nhiều thời gian, công sức và tiền bạc Việc sử dụng các kĩ thuật Verification và Validation (V&V) như Security Testing, Code Review, Formal Verification đã trở thành một phương tiện hiệu quả để giảm số lượng các lỗ hổng trong các sản phẩm phần mềm Đây là một thành tựu quan trọng bởi việc sửa chữa một lỗi sau khi phần mềm đã được phát hành tốn chi phí nhiều hơn so với việc giải quyết lỗi đó tại thời điểm phát triển Tuy nhiên, V&V cũng là một cách khá tốn kém Ước tính ban đầu đã đánh giá rằng V&V tốn thêm đến 30% cho chi phí phát triển Vì vậy, trong những năm gần đây người ta đưa ra ý tưởng xây dựng các mô hình dự đoán các lỗ hổng phần mềm Công việc này đưa ra một cơ sở định hướng cho các hoạt động V&V Từ đó giúp giảm thời gian và nỗ lực chi phí cần thiết để bảo đảm phần mềm
Một số loại mô hình dự đoán lỗ hổng phần mềm đã được đề xuất trong suốt thập kỷ qua, trong đó kỹ thuật học máy đã được sử dụng như là phương tiện để xây dựng mô hình dự đoán Một số nghiên cứu chủ yếu tập trung vào việc tìm kiếm các mối quan hệ giữa các lỗ hổng phần mềm và các thuộc tính của mã nguồn Trong
Trang 10Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
trường hợp này, một mô hình được xây dựng dựa trên hiểu biết trực giác rằng: một thành phần phức tạp hoặc được sửa đổi thường xuyên có nhiều khả năng chứa các vấn đề về bảo mật, hay một phần mềm có lỗ hổng thì có liên quan đến việc sử dụng một số thư viện khi phát triển nó Vì vậy, việc lựa chọn các thuộc tính để dự đoán được được xác định bởi những dự đoán của hiểu biết mang tính cá nhân
Một phương pháp dự đoán khác được đề xuất dựa trên kĩ thuật khai phá văn bản Bắt đầu từ việc quan sát thấy một ngôn ngữ lập trình là một ngôn ngữ với thẻ
cú pháp tương đương với từ, các nhà nghiên cứu đã đưa kỹ thuật khai thác văn bản vào phân tích mã nguồn Các tập thuộc tính được sử dụng để mô hình hóa là không cố định hay xác định trước mà chúng phụ thuộc vào các từ vựng được sử dụng bởi các nhà phát triển Vì vậy phương pháp này giảm thiểu sự phụ thuộc vào
lý thuyết cơ bản của việc dự đoán điều gì sẽ xảy ra Tuy nhiên, việc tập thuộc tính phụ thuộc vào các từ vựng của nhà phát triển dẫn đến việc dữ liệu sử dụng cho mô hình học máy là có số chiều lớn và không đồng bộ giữa các tệp mã nguồn Do đó
em chọn nghiên cứu đề tài "Một phương pháp mới dự đoán lỗ hổng phần mềm" với
mong muốn đưa ra một phương pháp mới kết hợp kĩ thuật khai phá văn bản vào phân tích mã nguồn của phần mềm và phương pháp giảm chiều dữ liệu trước khi áp dụng các kĩ thuật học máy để xây dựng mô hình dự đoán lỗ hổng phần mềm nhằm đưa định hướng tốt hơn cho kiểm thử phần mềm
Ngoài phần mở đầu và kết luận, luận văn được chia thành 3 chương, cụ thể nội dung mỗi chương như sau:
Chương 1: Giới thiệu
Trình bày các khái niệm cơ bản về bảo mật phần mềm, lỗ hổng phần mềm Giới thiệu nội dung bài toán dự đoán lỗ hổng phần mềm và các phương pháp, mô hình hiện nay đã có để giải quyết bài toán này
Chương 2: Cơ sở lý thuyết
Trình bày các cơ sở lý thuyết phục vụ cho việc xây dựng mô hình thực nghiệm thông qua việc giới thiệu về bài toán phân lớp, bài toán giảm chiều dữ liệu
Trang 11Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
cũng như một số phương pháp giải quyết 2 bài toán này Đồng thời nêu ra các phương pháp được dùng để đánh giá độ chính xác của mô hình thực nghiệm
Chương 3: Mô hình dự đoán lỗ hổng phần mềm sử dụng phương pháp phân lớp
Trình bày về mô hình đưa ra để giải quyết bài toán dự đoán lỗ hổng phần mềm, cách thức thu thập, xử lý dữ liệu, tiến hành thực nghiệm và đưa ra các nhận xét, đánh giá dựa vào kết quả thực nghiệm đã tiến hành
Trang 12Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Trong chương đầu tiên này, chúng tôi sẽ trình bày các khái niệm cơ bản về bảo mật phần mềm và lỗ hổng phần mềm Đồng thời, giới thiệu nội dung bài toán
dự đoán lỗ hổng phần mềm và một số phương pháp, mô hình hiện nay đã có để giải quyết bài toán này
1.1 Bảo mật phần mềm
Phần mềm là một phần không thể tách rời của hệ thống máy tính Nó là phương tiện để người dùng kiểm soát những gì họ đang làm trên hệ thống máy tính Phần mềm ứng dụng ảnh hưởng đến tất cả lĩnh vực tính toán Do đó, bảo mật phần mềm là điều thiết yếu đối với bảo mật thông tin cũng như hệ thống của bạn
Bất kỳ phần mềm nào đều có khả năng có lỗi lập trình Vì vậy phần mềm cần được kiểm tra kĩ lưỡng, chẩn đoán những vấn đề này trước khi đưa vào hoạt động
để tránh phát sinh các lỗi làm hỏng hệ thống hoặc thông tin của tổ chức
1.2 Lỗ hổng phần mềm
1.2.1 Khái niệm lỗ hổng phần mềm
Hiện nay, có nhiều tổ chức đưa ra các khái niệm khác nhau về lỗ hổng
- Theo ISO 27005: Một điểm yếu của một hoặc một nhóm tài sản có thể bị khai thác bởi một hoặc nhiều mối đe doạ Trong đó tài sản được hiểu là bất cứ thứ gì
có giá trị cho tổ chức, cho các hoạt động kinh doanh của tổ chức bao gồm cả các
nguồn thông tin hỗ trợ cho hoạt động của tổ chức [1]
- Theo IETF RFC 2828: Lỗ hổng hoặc điểm yếu trong thiết kế, triển khai, vận hành, quản lý hệ thống có thể bị khai thác vi phạm chính sách bảo mật của hệ
Trang 13Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
- Theo The Open Group: Lỗ hổng là nơi có xác suất khả năng đe dọa vượt quá
khả năng chống lại các mối đe dọa [4]
Như vậy, một cách tổng quát, lỗ hổng là điểm yếu hay thiếu xót trong ứng dụng, hệ thống hay quy trình cho phép kẻ tấn công có thể khai thác để truy cập trái phép vào các tài nguyên của hệ thống, làm tổn hại tới các bên tham gia hệ thống
Lỗ hổng có thể nằm trong khâu thiết kế hay việc thực thi, cài đặt, triển khai ứng dụng, hệ thống Ví dụ một ứng dụng website có một lỗ hổng như SQL Injection cho phép kẻ tấn công lấy được các thông tin từ CSDL, thay đổi dữ liệu hoặc ghi các tệp tin nhằm chiếm quyền kiểm soát hoàn toàn hệ thống Một số loại lỗ hổng ta thường nghe như: SQL Injection, Buffer Overflow, Cross Site Scripting…
Từ khái niệm chung về lỗ hổng, chúng ta có thể hiểu, lỗ hổng phần mềm là một điểm yếu của phần mềm, cho phép kẻ tấn công có thể khai thác làm thay đổi hành vi thông thường của phần mềm Thông thường, mục tiêu của kẻ tấn công là
đạt được một số đặc quyền trong hệ thống để kiểm soát hoặc phá huỷ hệ thống, đánh cắp thông tin có giá trị vì lợi ích riêng (như mã hoá thông tin cá nhân người dùng đòi tiền chuộc, ăn cắp thông tin tài khoản ) Vì vậy điều quan trọng là các nhà phát triển và công chúng phải biết về các lỗ hổng phần mềm để phòng ngừa và phát hiện các lỗ hổng để sửa chữa
1.2.2 Nguyên nhân gây ra lỗ hổng phần mềm
Một số nguyên nhân gây ra lỗ hổng phần mềm có thể kể đến như:
- Tính phức tạp: Các hệ thống lớn, phức tạp làm tăng khả năng sai sót cũng như các điểm truy cập không mong muốn
- Tính quen thuộc: Sử dụng chung, mã nguồn nổi tiếng làm tăng xác suất mà
kẻ tấn công có thể có hoặc tìm thấy kiến thức và công cụ để khai thác lỗ hổng
- Kết nối: Quá nhiều kết nối, cổng, giao thức, và dịch vụ khác nhau trong một thời gian của cùng một phần mềm cũng dễ gây ra các lỗ hổng
Trang 14Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
- Quản lý mật khẩu: Sử dụng các mật khẩu yếu có thể bị phát hiện bởi các công cụ dò tìm hoặc lưu trữ mật khẩu trên máy tính mà một chương trình có thể truy cập vào nó hoặc sử dụng lại mật khẩu giữa nhiều phần mềm khác nhau
- Các lỗi phần mềm: Lập trình để lại một số lỗi có thể bị khai thác trong chương trình phần mềm
- Dữ liệu đầu vào từ người dùng không được kiểm tra: Chương trình giả định rằng tất cả các đầu vào của người dùng là an toàn Các chương trình không kiểm tra
dữ liệu đầu vào của người dùng có thể cho phép thực thi trực tiếp các dòng lệnh hoặc câu truy vấn SQL không được dự định
- Không rút kinh nghiệm từ những lỗi đã gặp trước
Nghiên cứu cho thấy điểm dễ bị tổn thương nhất trong hầu hết các hệ thống
thông tin là đến từ con người: người thiết kế, phát triển, sử dụng phần mềm [5]
1.2.3 Phân loại lỗ hổng phần mềm
Như chúng ta đã đề cập đến một hệ thống phần mềm tồn tại các điểm yếu có thể bị kẻ tấn công khai thác dẫn đến hệ thống bị phá hoại Vì vậy điều quan trọng là phải biết các loại lỗ hổng phần mềm khác nhau, công tác phòng ngừa và phát hiện của chúng nhằm cố tránh sự hiện diện của chúng trong phiên bản phần mềm đưa vào vận hành để đảm bảo rằng khả năng bị tấn công của phần mềm giảm đến mức thấp nhất Dưới đây, chúng tôi sẽ giới thiệu một số loại lỗi phần mềm phổ biến dẫn đến lỗ hổng phần mềm
bộ nhớ có thể kể đến như:
Trang 15Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
- Buffer overflow: Lỗi tràn bộ đệm xảy ra khi việc ghi dữ liệu vượt quá phạm
vi cho phép, gây ảnh hưởng đến các đối tượng liền kề trong bộ nhớ
- Dangling pointer: Lỗi xảy ra khi con trỏ không trỏ đến một đối tượng hợp lệ của kiểu thích hợp
b Lỗi xác thực đầu vào
Xác thực đầu vào là quá trình đảm bảo rằng một chương trình hoạt động trên
dữ liệu sạch sẽ, chính xác và hữu ích Nó sử dụng các quy tắc, ràng buộc để kiểm tra tính đúng đắn, có ý nghĩa và an toàn của dữ liệu nhập vào hệ thống Việc không xác thực dữ liệu nhập vào hệ thống hoặc xác thực không đầy đủ có thể dẫn tới các
c Điều kiện thực thi
Điều kiện thực thi là hành vi của một hệ thống điện tử hoặc phần mềm mà đầu ra của nó phụ thuộc vào trình tự hoặc thời gian của các sự kiện không kiểm soát được Nó trở thành lỗi khi các sự kiện không xảy ra theo trình tự đã lập trình
- Time-of-check-to-time-of-use: lỗi này phát sinh do thay đổi trong một hệ thống giữa việc kiểm tra điều kiện và sử dụng kết quả kiểm tra đó
- Symlink races: lỗi này là kết quả của việc một chương trình tạo ra các tệp tin không an toàn
d Lỗi phân quyền lẫn lộn
Đây là lỗi xảy ra khi một chương trình máy tính bị lừa bởi một truy cập giả mạo không được phép
- Cross-site request forgery
Trang 16Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
- Clickjacking
- FTP bounce attack
e Lỗi chiếm quyền thực thi
Đây là lỗi xảy ra khi kẻ tấn công khai thác một điểm yếu trong thiết kế hoặc giám sát cấu hình trong một hệ điều hành hoặc phần mềm ứng dụng để truy cập tới các dữ liệu được bảo vệ từ ứng dụng với các quyền cao hơn sự cho phép Kết quả là
kẻ tấn công có thể truy cập ứng dụng với quyền lớn hơn dự định của nhà phát hành
a Kiểm duyệt phần mềm
Quá trình kiểm duyệt phần mềm là quá trình đọc và xem xét trực tiếp mã nguồn chương trình nhằm mục đích tìm ra điểm yếu và sửa chúng ngay trong quá trình phát triển Trong thực tế, đây chính là quá trình Code Review Khi điểm yếu được tìm thấy sớm, chúng ta sẽ tốn ít chi phí cho việc sửa chữa Tuy nhiên, chất lượng của quá trình kiểm duyệt này phụ thuộc vào khả năng và chuyên môn của người kiểm duyệt
Trang 17Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
b Sơ đồ hoạt động bảo mật (Security Activity Graphs)
Đây là một cách thức hiệu quả để ngăn ngừa lỗ hổng phần mềm Cụ thể, sơ
đồ này biểu diễn trực quan mối liên hệ giữa các nguyên nhân trong một đồ thị nguyên nhân lỗ hổng (Vulnerability Cause Graph) Các SAG cho thấy một nguyên nhân cụ thể có thể được ngăn ngừa như thế nào sau khi kết hợp các hoạt động bảo mật trong quá trình phát triển
là các công cụ dựa trên phương thức động, có nghĩa là xây dựng một môi trường mẫu và chạy chương trình trên môi trường mẫu đó để thu thập dữ liệu phát hiện lỗ hổng phần mềm
a Kĩ thuật tĩnh
Đây là những kĩ thuật được áp dụng trực tiếp vào mã nguồn nhằm mục đích đánh giá hoặc nhận được thông tin cụ thể mà không cần chạy chương trình Sau đây, chúng tôi sẽ giới thiệu một số kĩ thuật tĩnh phân tích mã nguồn để tìm ra lỗ hổng phần mềm
- Pattern Matching
Kĩ thuật này hoạt động bằng cách quét mã nguồn và tìm kiếm các chuỗi có định dạng (pattern) nhất định, các chuỗi này bị nghi ngờ dẫn đến lỗ hổng phần mềm Một công cụ đơn giản áp dụng kĩ thuật này là lệnh `grep` trong Unix Kĩ thuật này tạo ra nhiều sai số vì không có phân tích kết quả tìm kiếm Hơn nữa, hiệu quả của kĩ thuật này phụ thuộc vào tính chính xác của chuỗi dùng để tìm kiếm
- Lexical Analysis
Trang 18Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Mã nguồn được biến đổi thành một chuỗi các tokens, các chuỗi này được so sánh với dữ liệu lỗ hổng đã có và gán một định danh Sau đó áp dụng kĩ thuật Pattern Matching và chỉ ra nơi có khả năng dẫn đến lỗ hổng phần mềm Công cụ
ITS4 [6] là một ví dụ sử dụng kĩ thuật này Tuy nhiên kĩ thuật này cũng tạo nhiều
sai số, bởi chúng không có mối liên hệ với cú pháp của chương trình
- Parsing
Kĩ thuật này phức tạp hơn Lexical Analysis Mã nguồn được cho vào phân tích cú pháp bằng việc sử dụng cây phân tích cú pháp Kĩ thuật này có thể áp dụng
để tìm ra các lỗ hổng SQL injection
- Data Flow Analysis (Phân tích dòng dữ liệu)
Kĩ thuật này được sử dụng nhằm mục đích xác định các giá trị có thể có của một biến hoặc một biểu thức trong suốt quá trình chương trình thực thi Kĩ thuật này phù hợp khi xác định các lỗ hổng phần mềm gây ra bởi tràn bộ đệm
- Model Checking (Kiểm thử mô hình)
Đây là một kĩ thuật kiểm tra tự động nếu một mô hình của hệ thống có thể đặc tả được yêu cầu của hệ thống và mô hình được sử dụng để phát hiện lỗ hổng phần mềm Đây là một kĩ thuật phức tạp bởi xây dựng mô hình đặc tả được cả hệ thống là một công việc khó khăn
b Kĩ thuật động
Đây là những kĩ thuật cần phải thực thi mã nguồn chương trình, sau đó phân tích hành vi, kết quả trả về từ hệ thống để đưa ra kết luận Một số kĩ thuật động có thể kể đến như dưới đây
- Fault Injection
Kĩ thuật này hoạt động bằng cách cung cấp các trường hợp có thể gây ra lỗi nhằm mục đích kiểm tra hành vi của hệ thống Chúng ta cần có hiểu biết nhất định
về hệ thống để có thể đưa ra các trường hợp lỗi có thể xảy ra
- Fuzzing Testing (Kiểm thử mờ)
Ý tưởng của kĩ thuật này là cung cấp dữ liệu đầu vào cho ứng dụng một cách ngẫu nhiên nhằm xác định xem ứng dụng có thể xử lý nó một cách chính xác hay
Trang 19Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
không Kĩ thuật này dễ thực hiện hơn Fault Injection bởi vì thiết kế đơn giản và cần
ít hiểu biết về hệ thống hơn
1.3 Dự đoán lỗ hổng phần mềm
Bảo mật phần mềm ngày càng trở nên quan trọng đối với cả doanh nghiệp và người dùng cá nhân Việc phát hiện, xác định và khắc phục tất cả các lỗ hổng phần mềm là chìa khóa để đảm bảo an ninh của hệ thống phần mềm từ các cuộc tấn công
có thể xảy ra Tuy nhiên, từ góc nhìn bảo mật, kiểm thử phần mềm để phát hiện và sửa lỗ hổng tiềm tàng là một công việc tốn thời gian và chi phí bởi hai lý do:
- Các hệ thống phần mềm hiện đại ngày nay tương đối lớn và phức tạp Một hệ thống phần mềm có thể chứa hàng ngàn tệp mã nguồn và các thành phần khác
- Các lỗ hổng thường khó phát hiện hơn so với lỗi truyền thống, người kiểm tra phần mềm cần phải có kiến thức và biết các chiến thuật tấn công như một kẻ tấn công
Do đó, bất kỳ công cụ kĩ thuật kiểm tra tự động nào giúp phát hiện và khắc phục các lỗ hổng phần mềm càng sớm càng tốt đều giúp cho việc nâng cao chất lượng phần mềm và yêu cầu bảo mật lên đáng kể Ngoài những cách đã được trình bày như phần trước, trong khoảng hai thập kỉ trở lại đây, chúng ta bắt đầu áp dụng
kĩ thuật dự đoán lỗ hổng phần mềm Kĩ thuật này đưa ra các thành phần hoặc tệp có khả năng gây ra lỗ hổng phần mềm giúp định hướng cho người kiểm thử nên kiểm tra phần nào trước của phần mềm Dự đoán lỗ hổng phần mềm là bài toán phân lớp nhị phân các thực thể phần mềm như components, classes, modules … có chứa lỗ hổng phần mềm hay không (“vulnerable” hay “non- vulnerable”)
1.4 Các phương pháp dự đoán lỗ hổng phần mềm đã có
Hiện nay đã có nhiều công trình nghiên cứu xây dựng mô hình dự đoán lỗ hổng phần mềm Xem xét các các mô hình đã có, chúng tôi đưa ra bảng so sánh dựa trên 5 yếu tố sau:
- Các đặc trưng được dùng để dự đoán
Trang 20Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
- Kĩ thuật sử dụng để xây dựng mô hình
- Loại ứng dụng đưa vào thực nghiệm
- Kết quả dự đoán của mỗi mô hình
Trang 21MFSA, Red Hat Bugzilla, Read Hat package management system (RPM)
Logistic regression Firefox,
Red Hat Linux Kernel
Firefox — precision: 3%, recall: 79-86%, fall-out: 22-25% Red Hat Linux Kernel — precision: 5%, re-call 80-90%, fall-out: 22-25%
Shin et al
[8]
software metrics, code churn, developer activity metrics
MFSA Logistic regression Firefox precision: 12%, recall: 83%
MFSA / Bugzilla Na ̈ıve bayes,
C4.5 Decision Tree, Random Forest, Logistic regression
Firefox C4.5 decision tree — mean precision: 72%,
mean recall: 74%, mean accuracy: 73%, mean fall-out: 29%
Zimmerman
net al [12]
code churn, code complexity dependency measures, code coverage, organizational metrics,
NVD Logistic regression,
SVM
Windows Vista median precision: 60-67%, median recall: 20-40%
Trang 22Gegick et al
[13]
non-security failure reports
Cisco security reports CART Cisco software
MFSA / CVE / Bugzilla Bayesian network,
Na ̈ıve Bayes, Neural networks, Random forest, SVM
FireFox JS Engine precision: 61-68%, recall: 60-61%,
Drupal, Moodle, PHPMyAdmin
Drupal - precision: ~77%, recall: ~76%
PHPMyAdmin - precision: ~ 88%, recall: ~ 89%
Moodle - precision: ~98%, recall: ~97%
Android Application
Naive Bayes - Precision: 51-92%, Recall: 32-92%
Random Forests - Precision: 59-98%, Recall: 24-98%
Bảng 1.1 Các nghiên cứu về dự đoán lỗ hổng phần mềm đã có
Trang 23Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Từ bảng trên có thể thấy:
- Kĩ thuật phổ biến được sử dụng để xây dựng mô hình dự đoán là các phương pháp phân lớp phổ biến trong học máy như: Naive Bayes, Random Forests, Decision Tree, Logistic Regression, Support Vector Machine …
- Đa số các nghiên cứu tập chung vào khai thác mối liên hệ giữa lỗ hổng phần mềm và các thuộc tính của mã nguồn (độ phức tạp, quá trình phát triển mã nguồn ) để đưa ra các đặc trưng dùng để dự đoán
- Nguồn dữ liệu lỗ hổng được sử dụng là các cơ sở dữ liệu về lỗ hổng được đã được báo cáo và xác nhận Các cơ sở dữ liệu này được cho là các nguồn đáng tin cậy, ít có khả năng chứa các False Positive hơn các công cụ phân tích tĩnh Tuy nhiên, hiện nay cộng đồng nghiên cứu vẫn đang tranh luận về những nguồn đáng tin
cậy nào được sử dụng như là "chân lý" cho các mô hình dự đoán [17]
- Khác với các 9 nghiên cứu đầu tiên, nghiên cứu cuối cùng của Scandariato
áp dụng khai phá văn bản để đưa ra các đặc trưng, đồng thời sử dụng một công cụ phân tích mã nguồn tĩnh như là nguồn dữ liệu lỗ hổng phần mềm để so sánh Theo
Scandariato [17], các nghiên cứu gần đây đã chỉ ra rằng, kết quả cảnh báo đưa ra từ
các công cụ phân tích tĩnh không phải là không đáng tin cậy Bởi vì các công cụ phân tích tĩnh đưa ra các kết quả có mối liên hệ chặt chẽ với cơ sở dữ liệu lỗ hổng phần mềm đã được báo cáo, điều này đã được chứng minh bằng thực nghiệm
1.5 Mục tiêu của luận văn
Mặc dù các nghiên cứu trước đây đã chứng tỏ được sự hữu ích của các mô hình học máy đối với bài toán dự đoán lỗ hổng phần mềm, nhưng việc nâng cao hiệu quả của các mô hình dự đoán này vẫn là một vấn đề còn thách thức
Quá trình xây dựng mô hình bao gồm việc thu thập dữ liệu huấn luyện, lựa chọn đặc trưng, huấn luyện mô hình, kiểm thử mô hình với dữ liệu Để cải thiện hiệu quả của các mô hình, chúng ta cần chọn được các đặc trưng tốt và các thuật toán học máy phù hợp với các đặc trưng đó Trong một nghiên cứu gần đây, kĩ thuật khai thác văn bản đã được đưa vào để lựa chọn đặc trưng cho bài toán dự đoán lỗ
Trang 24Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
hổng phần mềm với kết quả nhiều hứa hẹn [17] Sử dụng kĩ thuật khai phá văn bản
cơ bản đưa ra đặc trưng là các từ đơn lẻ trong mã nguồn Một số kỹ thuật khai thác văn bản nâng cao khác như phân tích n-gram Kĩ thuật này không chỉ đưa ra các từ đơn mà còn đưa ra các cụm từ trong mã nguồn Phân tích n-gram phù hợp với chương trình được viết bằng ngôn ngữ lập trình hướng đối tượng Các đặc trưng hướng đối tượng như các lớp, các đối tượng, phương thức, đối số, và các biến thường có mối liên hệ với nhau, và sự xuất hiện liên tiếp của các đặc trưng này đều mang một ý nghĩa nhất định Tuy nhiên, việc sử dụng n-gram cũng đưa ra một thách thức đó là số chiều của dữ liệu sẽ rất lớn Điều này ảnh hưởng trực tiếp đến hiệu năng và hiệu quả của mô hình dự đoán
Trong luận văn này, chúng tôi xây dựng mô hình dự đoán lỗ hổng phần mềm dựa trên kĩ thuật khai phá văn bản n-gram để trích rút đặc trưng kết hợp với phương pháp giảm chiều dữ liệu và một số thuật toán phân lớp Sau đó mô hình này
sẽ được huấn luyện và kiểm thử bằng mã nguồn của các phần mềm viết bằng ngôn ngữ lập trình hướng đối tượng và ngôn ngữ lập trình lai giữa hướng đối tượng và lập trình hàm
1.6 Kết luận Chương 1
Qua chương này, chúng ta đã biết được các khái niệm cơ bản về bảo mật phần mềm, lỗ hổng phần mềm Chúng tôi cũng đưa ra một cái nhìn tổng quan về bài toán dự đoán lỗ hổng phần mềm cũng như các phương pháp, mô hình hiện nay đã
có để giải quyết bài toán này Đồng thời chúng tôi cũng đã khái quát mục đích nghiên cứu của chúng tôi trong luận văn này
Trang 25Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Chương này trình bày các kiến thức cơ bản về bài toán phân lớp và các mô hình học máy để huấn luyện các mô hình phân lớp từ dữ liệu Đồng thời cũng trình bày một số phương pháp giảm số chiều dữ liệu và cách đánh giá các mô hình phân lớp Các kiến thức này được sử dụng cho bài toán thực nghiệm trong chương sau
2.1 Tổng quan về học máy (Machine Learning - ML)
2.1.1 Ý tưởng
Hình 2.1 Ý tưởng của học máy
Trong khoa học máy tính, kiến thức đưa chúng ta đi xa hơn không dừng lại ở những công thức hay cách thức giải quyết vấn đề mà là những ý tưởng Vậy ý tưởng trong ML là gì? Xét trên khía cạnh trí tuệ nhân tạo, ML là kĩ thuật giúp chúng ta lập trình những thứ không thể lập trình một cách rõ ràng Xét về mặt dữ liệu, với sự bùng nổ về số lượng cũng chất lượng của dữ liệu hiện nay, chúng ta sẽ có thể làm gì được với chúng (không chỉ để thống kê, lưu trữ…) Trong một bộ phim gần đây của Adam Sandler với tựa đề “Pixel”, một cậu bé có khả năng chơi game vượt trội nhờ nhận ra được những “pattern” trong các game Trong thực tế cũng vậy, mọi thứ dường như đều dựa trên khuôn mẫu nào đó, hay nó sẽ giống với một trong những khuôn mẫu chúng ta có thể nghĩ ra được Vì vậy, chúng ta có thể hiểu ML là một nhánh của AI, giúp cho máy tính có khả năng học hỏi mà không cần phải lập trình
Trang 26Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
một cách cụ thể, rõ ràng Con người nhận thông tin, xử lý trong não bộ và đưa ra giải pháp ML cũng cố gắng bắt chước quá trình này thông qua việc xây dựng hàm
số f(x) với x là đầu vào (input) và y = f(x) là đầu ra (output)
2.1.2 Máy học như thế nào
Như đã nói ở trên, mục tiêu của chúng ta là cố gắng xây dựng hàm số f(x) để
xứ lý đầu vào và đưa ra kết quả tương tự như khi con người làm Tuy nhiên, cách làm việc của bộ não con người tới giờ vẫn còn khá nhiều ẩn số, nên dù mục tiêu là vậy nhưng chúng ta vẫn chỉ đang xây dựng hàm h(x) (hypothesis) mang tính giả thuyết gần giống nhất với hàm số f(x) Mặc dù chúng ta không xác định được chính xác f(x) nhưng chính dữ liệu sử dụng cho máy học hỏi lại là những bộ (input, output) của f(x) Vậy nên đơn giản hơn, chúng ta cần xây dựng h(x) giống f(x) nhất
có thể trên tập dữ liệu sử dụng cho việc học của máy
Vậy làm thế nào để đánh giá h(x) giống với f(x) nhất? Để làm được điều này, chúng ta cần phải xác định sự sai khác giữa h(x) và f(x), sau đó giảm thiểu sự sai khác này xuống mức thấp nhất (cực tiểu) Khi đó h(x) sẽ gần với f(x) nhất trên mô hình chúng ta đưa ra Sự sai khác đó thường được biểu diễn bằng hàm số J(θ) trong
đó θ là những tham số ta đưa vào h(x) và có thể thay đổi được Bởi vì có những tham số có thể thay đổi được này mà máy mới có khả năng học hỏi Hàm sai khác J(θ) còn được gọi là hàm chi phí (cost function) hay hàm lỗi (error function)
Đứng trước một bài toán cụ thể, chúng ta xây dựng một mô hình được mô tả thông qua hàm giả thuyết h(x) có chứa những tham số θ có thể thay đổi Đồng thời chúng ta xác định một hàm sai khác J(θ) Quá trình học của máy chính là quá trình chúng ta tối thiểu hóa J(θ)
2.1.3 Tối thiểu hàm sai khác
Trước tiên chúng ta cùng xem lại một số kiến thức cơ bản phục vụ cho việc tối thiểu hàm sai khác J(θ)
- Phương pháp tìm cực đại, cực tiểu của hàm số
Trang 27Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
a Độ dốc của một đường thẳng (slope hay gradient)
Khi độ dốc < 0 tương tự như vận tốc < 0 thì quãng đường sẽ giảm (chúng ta
đi lùi) hay đồ thị hàm số sẽ đi xuống Khi x tăng thì y giảm, khi x giảm thì y lại tăng
Khi độ dốc = 0 tương tự như vận tốc = 0, chúng ta không di chuyển nên quãng đường bất biến Đồ thị hàm số sẽ đi ngang hay y = f(x) không thay đổi
Hình 2.3 Tính biến thiên của đồ thị
Trang 28Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
b Độ dốc của hàm số tại một điểm
Chúng ta thấy rằng mọi đường cong được tạo nên bởi nhiều đoạn thẳng Với hai điểm bất kì chúng ta xác định được một đường thẳng nên độ dốc giữa hai điểm chính là độ dốc của đường thẳng đi qua chúng Ta có độ dốc giữa hai điểm trên đồ thị hàm số được tính như sau: 9:;<= >? = ∆3
∆4
Hình 2.4 Độ dốc giữa hai điểm trên đồ thị
Khi hai điểm trên tiến gần lại đến nhau, khoảng cách giữa chúng tiến về 0 chúng ta có độ dốc tại một điểm
Hình 2.5 Độ dốc của một điểm trên đồ thị
Trang 29Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Nhìn vào hình vẽ ở trên, chúng ta thấy rằng, khi hàm số chuyển từ trạng thái
đi lên sang trạng thái đi xuống nó bắt buộc phải qua trạng thái độ dốc bằng 0 Khi
đó tại những điểm độ dốc bằng 0, hàm số đạt giá trị cực đại hoặc cực tiểu
• Cực tiểu hóa hàm sai lệch J(θ) bằng giải thuật “Gradient descent”
Về mặt lý thuyết, ta đi tìm đạo hàm của J(θ), tìm tất cả những giá trị θ là nghiệm của phương trình J'(θ) = 0 (trong đó J'(θ) là đạo hàm của hàm số J(θ)) Sau
đó chọn θ sao cho J(θ) nhỏ nhất trong tập nghiệm thu được Phương pháp này còn được gọi là “Normal Equation” Tuy nhiên, thực tế không phải mọi phương trình đều giải được, bên cạnh đó khi số lượng tham số lớn, việc giải phương trình có thể tốn nhiều chi phí Chính vì thế chúng ta có giải thuật “Gradient descent” để giải quyết vấn đề này Giả sử với θ hiện tại, giá trị của J(θ) như hình sau:
Hình 2.6 Giá trị J(θ) tại một điểm
Với θ hiện tại, J(θ) đang ở điểm A, rõ ràng ở vị trí A đồ thị trên đang có xu hướng giảm (đạo hàm tại điểm A < 0 nên khi tăng θ thì J(θ) sẽ giảm) Ta tăng θ để
A tiến đến điểm B như hình sau:
Hình 2.7 Thay đổi J(θ)
Trang 30Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Thử tưởng tượng rằng chúng ta làm việc này rất nhiều lần, khi đó J(θ) sẽ giảm dần xuống giá trị cực tiểu gần nhất (cực tiểu địa phương – Local minimum)
Hình 2.8 Thay đổi J(θ) đạt cực tiểu địa phương
Giải thuật được mô tả như sau:
- Bước 1: Khởi tạo θ bất kì (thường tất cả tham số θ được gán bằng 0)
- Bước 2: Lặp lại việc thay đổi θ = θ – α * J'(θ) đồng thời (tất cả các tham
số θ phải được thay đổi cùng một lúc)
- Bước 3: Dừng lại khi J(θ) có thay đổi không đáng kể
Trong đó, α được gọi là tốc độ học (Learning rate - dùng để điều chỉnh tốc
độ học của máy) Chúng ta đưa vào tham số α để có thể điều khiển được tốc độ thay đổi của θ Việc xác định được các tham số θ nhanh hay chậm phụ thuộc vào tham số này, tuy nhiên nếu như lựa chọn không phù hợp có thể gây ra những bất lợi
- α quá nhỏ: α nhỏ sẽ khiến cho các bước đi xuống dốc của J(θ) cũng nhỏ, dẫn đến việc học mất nhiều thời gian hơn
- α quá lớn: α lớn sẽ khiến cho các bước đi trở nên quá lớn, có thể khiến J(θ) lớn hơn giá trị hiện tại
Trang 31Trường Đại học Sư phạm Hà Nội Luận văn thạc sĩ
Nhược điểm của giải thuật
Hình 2.10 Nhược điểm của giải thuật gradient descent
Khi đang ở điểm A, có thể giải thuật này sẽ đi vào vòng lặp vô hạn do hàm
số đi xuống mãi khi giảm θ Bởi trong trường hợp này việc giải phương trình cũng không mang lại kết quả do bản thân hàm số J(θ) không có giá trị nhỏ nhất Cách giải quyết là phải xây dựng hàm J(θ) có giá trị nhỏ nhất, ví dụ như hình sau:
Hình 2.11 Đồ thị có thể tìm cực tiểu
Khi đang ở điểm B và điểm C, áp dụng giải thuật trên sẽ đưa đến 2 điểm cực tiểu khác nhau Rõ ràng tại C, ta sẽ giảm được J(θ) nhiều hơn, chính vì thế để đảm bảo J(θ) đạt được giá trị nhỏ nhất, phải cố gắng xây dựng J(θ) có dạng tương tự như paraboll Khi đó J(θ) sẽ chỉ có một giá trị nhỏ nhất, và giải thuật chắc chắn đưa J(θ) xuống đáy của đồ thị
Hình 2.12 Đồ thị lý tưởng để tìm cực tiểu