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

Một phương pháp mới dự đoán lỗ hổng phần mềm

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

BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC SƯ PHẠM HÀ NỘI



LÊ HÀ MINH

MỘT PHƯƠNG PHÁP MỚI
DỰ ĐOÁN LỖ HỔNG PHẦN MỀM

Chuyên ngành: Khoa học máy tính
Mã số: 60480101

LUẬN VĂN THẠC SĨ

NGƯỜI HƯỚNG DẪN KHOA HỌC
PGS.TS TRẦN ĐĂNG HƯNG

HÀ NỘI - NĂM 2017


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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

2


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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

3


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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

4


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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.

5


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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

6


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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


7


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

DANH MỤC TỪ VIẾT TẮT
Cụm từ viết tắt

Cụm từ chi tiết

ML

Machine Learning

SVM

Support Vector Machine

V&V

Verification & Validation

SQL

Structure Query Language

HTTP


HyperText Transfer Protocol

FTP

File Transfer Protocol

SAG

Security Activity Graphs

CSDL

Cơ sở dữ liệu

MLE

Maximum Likelihood Estimation

8


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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

9


Trường Đại học Sư phạm Hà Nội


Luận văn thạcsĩ

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


10


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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.

11


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

CHƯƠNG 1:

GIỚI THIỆU

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ệ
thống [2].

-

Theo ENISA: Sự tồn tại của một điểm yếu, thiết kế hoặc lỗi thực hiện có thể dẫn
đến một sự kiện bất ngờ, không mong muốn ảnh hưởng đến an ninh của hệ

thống máy tính, mạng, ứng dụng, hoặc các giao thức có liên quan [3].

12


Trường Đại học Sư phạm Hà Nội

-

Luận văn thạcsĩ

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.

13


Trường Đại học Sư phạm Hà Nội

-

Luận văn thạcsĩ

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.
a. Vi phạm về an toàn bộ nhớ

Bộ nhớ an toàn (memory-safe) là trạng thái bộ nhớ được bảo vệ khỏi các lỗi
phần mềm và các lỗ hổng bảo mật khi truy cập bộ nhớ, chẳng hạn như tràn bộ đệm
và con trỏ chuột. Ví dụ, Java được gọi là bộ nhớ an toàn vì nó có thể phát hiện lỗi
thời gian thực (runtime errors) kiểm tra giới hạn mảng và con trỏ. Ngược lại, C và
C++ hỗ trợ số học con trỏ tùy ý, không có điều khoản để kiểm tra giới hạn, do đó
được gọi là bộ nhớ không an toàn (memory-unsafe). Một số lỗi về vi phạm an toàn
bộ nhớ có thể kể đến như:

14


Trường Đại học Sư phạm Hà Nội

-

Luận văn thạcsĩ

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

lỗ hổng như:
-

Format string attacks

-

SQL injection

-

Code injection

-

E-mail injection

-

Cross-site scripting

-

HTTP header injection

-

HTTP response splitting

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

15


Trường Đại học Sư phạm Hà Nội

-

Clickjacking

-


FTP bounce attack

Luận văn thạcsĩ

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
để thực thi các hành vi trái phép.
f. Lỗi giao diện người dùng
-

Warning fatigue

-

Blaming the victim

g. Tấn công Side-channel
Đây là lỗ hổng bị khai thác từ việc tận dụng các thông tin thu được từ thực
thi một hệ thống mật mã.
-

Timing attack: Kẻ tấn công khai thác lỗ hổng từ việc phân tích thời gian thực

hiện các thuật toán mã hoá.

1.2.4 Ngăn chặn lỗ hổng phần mềm

Bảo mật phần mềm là một vấn đề sống còn đối với hệ thống. Do đó ngăn
chặn các lỗ hổng phần mềm là công việc thiết yếu trước khi đưa phần mềm vào sử
dụng. Với các hiểu biết về lỗ hổng phần mềm, chúng ta có hai cách thường dùng để
phát hiện lỗ hổng phần mềm và kịp thời xử lý trong quá trình phát triển.
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.

16


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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.

1.2.5 Phát hiện lỗ hổng phần mềm
Để ngăn ngừa các lỗ hổng phần mềm người ta thường dùng phương pháp mô
hình hoá và kiểm duyệt phần mềm. Tuy nhiên, chúng ta cũng cần thiết có các công
cụ giúp các lập trình viên có thể phát hiện các lỗ hổng phần mềm trong quá trình

xây dựng phần mềm. Các công cụ này có thể được chia làm hai loại dựa trên
phương thức xây dựng chúng. Một là các công cụ dựa trên các phương thức tĩnh, có
nghĩa là tìm ra lỗ hổng phần mềm mà không cần thiết phải chạy chương trình. Hai
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

17


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ


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

18


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

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


-

Nguồn dữ liệu lỗ hổng

19


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ

-

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

20




Study


Preductor used

Vulnerability source

Shin et al.

software metrics,

MFSA,

[7]

code churn,

Prediction technique
Logistic regression

Applications

Performance

Firefox,

Firefox — precision: 3%, recall: 79-86%, fall-out: 22-25%

Red Hat Bugzilla,

Red Hat Linux


Red Hat Linux Kernel — precision: 5%, re-call 80-90%,

developer activity

Read Hat package

Kernel

fall-out: 22-25%

metrics

management system

Firefox

precision: 12%, recall: 83%

(RPM)
Shin et al.

software metrics,

[8]

code churn,

MFSA

Logistic regression


developer activity
metrics
Shin et al.

code complexity metrics MFSA / CVE / Bugzilla Logistic regression

FireFox JS Engine recall: 3-93%, accuracy: 43-98%, fall-out: 0-58%

[9] [10]
Chowdhury complexity,
et al. [11]

MFSA / Bugzilla

Na ̈ıve bayes,

Firefox

C4.5 decision tree — mean precision: 72%,

coupling,

C4.5 Decision Tree,

mean recall: 74%, mean accuracy: 73%,

cohesion metrics

Random Forest,


mean fall-out: 29%

Logistic regression
Zimmerman code churn, code
net al. [12]

complexity

NVD

Logistic regression,
SVM

dependency measures,
code coverage,
organizational metrics,
actual dependencies

21

Windows Vista

median precision: 60-67%, median recall: 20-40%




Gegick et al. non-security failure
[13]


reports

Nguyen et

component dependency

al. [14]

graphs

Cisco security reports

CART

Cisco software

recall: 57%, fall-out: 48%

system
MFSA / CVE / Bugzilla Bayesian network,

FireFox JS Engine precision: 61-68%, recall: 60-61%,

Na ̈ıve Bayes,

accuracy: 84-85%, fall-out: 9-10%

Neural networks,
Random forest,

SVM
Smith et al.

SQL hotspots

Trac issue reports

Logistic regression

[15]

WordPress,

Wordpress — average precision: 28%, average recall: 24%

WikkaWiki

WikkaWiki — average precision: 62%, average recall: 39%

Mamdouh et software metrics

Naive Bayes,

Drupal, Moodle,

Drupal - precision: ~77%, recall: ~76%

al. [16]

Decision Trees,


PHPMyAdmin.

PHPMyAdmin - precision: ~ 88%, recall: ~ 89%

Random Forests,

Moodle - precision: ~98%, recall: ~97%

Ensemble (Voting)
Scandariato Text mining

Fortify Source Code

Naive Bayes,

Android

Naive Bayes - Precision: 51-92%, Recall: 32-92%

et al. [17]

Analyzer (SCA)

Random Forests,

Application

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ó

22


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ



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ỗ

23


Trường Đại học Sư phạm Hà Nội

Luận văn thạcsĩ




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.

24


Trường Đại học Sư phạm Hà Nội


Luận văn thạcsĩ



CHƯƠNG 2:

CƠ SỞ LÝ THUYẾT

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


25


×