Tải bản đầy đủ (.docx) (53 trang)

Dự Đoán Lỗ Hổng Phần Mềm Dựa Trên Kỹ Thuật Khai Phá Dữ Liệu

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 (869.26 KB, 53 trang )

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
---------------------------------------

Vũ Thị Vân

DỰ ĐOÁN LỖ HỔNG PHẦN MỀM DỰA TRÊN KỸ THUẬT KHAI
PHÁ DỮ LIỆU

Chuyên ngành: Hệ thống thông tin
Mã số: 60.48.01.04

LUẬN VĂN THẠC SĨ KỸ THUẬT

NGƯỜI HƯỚNG DẪN KHOA HỌC :
PGS.TS. BÙI THU LÂM


HÀ NỘI - 2014


3

MỞ ĐẦU
Xây dựng các dự án phần mềm thành công luôn là mối quan tâm hàng đầu
của các tổ chức, doanh nghiệp. Trong đó, việc đảm bảo chất lượng phần mềm là
ưu tiên cao nhất trong toàn bộ quá trình phát triển cũng như vận hành của phần
mềm.
Hiện nay, phần mềm máy tính có rất nhiều lỗ hổng, dễ dàng cho các cuộc
tấn công cố ý, trong khi các tin tặc lại có vô số các phương cách khai thác các lỗi
này. Xu hướng này thực sự làm nhiều người lo ngại và cũng không ít người lạc
quan vào khả năng của các chuyên gia an ninh trong việc phát hiện và thông báo


các lỗ hổng nhờ vào những kỹ thuật mới. Khi một lỗ hổng được phát hiện, một
phần mềm tự động tương ứng sẽ phân tích và chỉ thông báo công khai khi đã sửa
chữa xong. Điều này giúp những nhà quản lý hệ thống máy tính dễ dàng nhận
thấy tính dễ tổn thương trong hệ thống an toàn của họ. Tuy nhiên, nếu người
quản lý không cài đặt bổ sung phần mềm sửa chữa trước khi tin tặc biết cách khai
thác, chúng có thể bị sử dụng để nắm quyền kiểm soát máy tính và phát tán virus.
Chính vì vậy, ngày nay các phần mềm dự đoán lỗ hổng của một phần
mềm đang phát triển mạnh mẽ, với nhiều phương pháp khác nhau. Có hai
phương pháp chính để phát hiện lỗi và lỗ hổng phần mềm:
- Phương pháp phân tích tĩnh: là phương pháp phân tích trực tiếp trên mã
nguồn hoặc dịch ngược mã nguồn mà không cần phải thực thi ứng dụng. Đối
tượng của phương pháp này được đánh giá hoặc trực tiếp lấy thông tin đặc biệt từ
mã nguồn và phân tích tìm ra các lỗ hổng mà kẻ tấn công có thể lợi dụng để thâm
nhập vào hệ thống.
- Phương pháp phân tích động: là phương pháp tự động phát hiện các lỗ
hổng qua việc phân tích thực thi của đoạn mã chương trình và thực hiện phân
tích cách xử lý hay các câu trả lời của hệ thống và đưa ra một nhận định.
Trong hai phương pháp trên, phương pháp phân tích tĩnh là một phương
pháp mang lại hiệu quả cao trong quá trình phát hiện lỗ hổng của phần mềm. Do
vậy, để tìm hiểu thêm về vấn đề này, học viên chọn đề tài: “Dự đoán lỗ hổng
phần mềm dự trên kỹ thuật khai phá dữ liệu”


4

Kết cấu của luận văn gồm 3 chương chính:
Chương 1: Tổng quan về dự đoán lỗ hổng phần mềm, chương này giới thiệu
các khái niệm chung về lỗ hổng, lỗ hổng phần mềm, cách thức phân loại lỗ hổng
phần mềm và các phương pháp dự đoán lỗ hổng phần mềm phổ biến hiện nay.
Chương 2: Sử dụng kỹ thuật khai phá dữ liệu trong dự đoán lỗ hổng phần

mềm, chương này giới thiệu chung về kỹ thuật khai phá dữ liệu và phương pháp
áp dụng kỹ thuật khai phá dữ liệu để dự đoán lỗ hổng phần mềm.
Chương 3: Thử nghiệm và đánh giá kết quả, chương này sẽ đưa ra một mô
hình cài đặt thực nghiệm cho ứng dụng dự đoán lỗ hổng phần mềm. Hệ thống lấy
dữ liệu từ tập hợp các tập tin mã nguồn của bộ mã nguồn mẫu. Xây dựng mô
hình dự đoán lỗ hổng phần mềm bằng kỹ thuật khai phá dữ liệu để đưa ra các
trích chọn đặc trưng, trình bày chi tiết về kỹ thuật được áp dụng để tạo ra mô
hình dự đoán lỗ hổng phần mềm, đưa ra các kết quả dự đoán đó để áp dụng cho
một hệ thống phần mềm mới.


5

MỤC LỤC

Danh mục từ viết tắt
STT
1

Từ viết tắt
AST

Danh mục các bảng
Danh mục các hình

Nghĩa tiếng Việt
Cây cú pháp trừu tượng

Tiếng Anh
Abstract syntax tree



6

Chương 1 – TỔNG QUAN VỀ DỰ ĐOÁN LỖ HỔNG PHẦN MỀM
Chương này trình bày tổng quan về dự đoán lỗ hổng phần mềm và các
phương pháp nhằm ngăn ngừa, dự đoán lỗ hổng phần mềm. Luận văn giới thiệu
các khái niệm liên quan tới lỗ hổng nói chung, cũng như lỗ hổng phần mềm nói
riêng. Luận văn cũng trình bày một cách khái quát các phương pháp ngăn ngừa,
dự đoán lỗ hổng trong đó tập trung làm rõ phương pháp dự đoán lỗ hổng dùng
cách phân tích tĩnh mã nguồn phần mềm. Đó chính là phương pháp được sử
dụng trong quá trình dự đoán lỗ hổng phần mềm của luận văn.

1.1 Khái niệm lỗ hổng phần mềm
1.1.1 Lỗ hổng
Trong vấn đề bảo mật máy tính, lỗ hổng (hay điểm yếu) là một điểm cho
phép kẻ tấn công lợi dụng nhằm làm giảm sự an toàn thông tin hệ thống. Một lỗ
hổng được xác định bởi ba yếu tố chính: Một điểm nhạy cảm của hệ thống hay
lỗi, một lỗ hổng mà kẻ tấn công thường hay truy cập tới và ba là khả năng khai
thác hệ thống của các kẻ tấn công. Để khai thác được lỗ hổng, kẻ tấn công phải
có ít nhất một công cụ hoặc một kỹ thuật để kết nối tới một điểm yếu của hệ
thống. Một nguy cơ bảo mật cũng có thể coi là một lỗ hổng.
Hiện nay, trên thế giới có nhiều khái niệm lỗ hổng khác nhau do các tổ
chức, các công ty đưa ra, có thể kể đến một số khái niệm sau:
 ISO 27005 định nghĩa lỗ hổng như:
Một điểm yếu của một tài sản 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 dọa và bất cứ thứ gì có thể có giá trị cho tổ chức, cho
các hoạt động sản xuất kinh doanh của tổ chức, bao gồm cả các nguồn thông tin
hỗ trợ cho tổ chức đó.
 Theo IETF RFC 2828, lỗ hổng là:

Một lỗ hổng (hay điểm yếu) trong thiết kế, phát triển, quản lý của một hệ
thống mà có thể được khai thác nhằm vi phạm chính sách bảo bật của hệ thống
đó.


7

 Ủy ban về các hệ thống an ninh quốc gia của Mỹ xác định khái
niệm lỗ hổng là:
Lỗ hổng trong một hệ thống nội bộ, một thủ tục an ninh, các kiểm soát nội
bộ hoặc trong quá trình thực hiện có thể khai thác từ bên ngoài.
 Nhiều ấn phẩm NIST (National Institute of Standards and
Technology – Viện tiêu chuẩn và công nghệ) xác định lỗ hổng là:
Một lỗ hổng (hay điểm yếu) trong các thủ tục an ninh hệ thống, trong thiết
kế, phát triển hoặc kiểm soát nội bộ là các vấn đề có thể được thực hiện (vô tình
hay cố ý gây ra) và tạo ra kết quả là vi phạm các chính sách an ninh, bảo mật của
hệ thống.
 ENISA định nghĩa lỗ hổng là:
Sự tồn tại của một điểm yếu hoặc thiết kế lỗi có thể dẫn tới một sự kiện
bất ngờ không mong muốn ảnh hưởng đến sự an toàn của hệ thống máy tính,
mạng, ứng dụng hoặc các giao thức liên quan.
 ISACA định nghĩa lỗ hổng trong hệ thống quản lý rủi ro là:
Là một điểm yếu trong thiết kế, phát triển, vận hành hoặc điều hành nội
bộ.
Như vậy, có thể đưa ra khái niệm lỗ hổng trong hệ thống phần mềm như
sau: “Các lỗ hổng trên một hệ thống là các điểm yếu có thể tạo ra sự ngưng trệ
của dịch vụ, thêm quyền đối với người sử dụng hoặc cho phép các truy nhập
không hợp pháp vào hệ thống.”Các lỗ hổng cũng có thể nằm ngay trong các dịch
vụ cung cấp như sendmail, web, ftp ... Ngoài ra các lỗ hổng còn tồn tại ngay
chính tại hệ điều hành như trong Windows NT, Windows 95, UNIX; hoặc trong

các ứng dụng mà người sử dụng thương xuyên sử dụng như Word processing,
Các hệ databases...

1.1.2 Phân loại lỗ hổng
Lỗ hổng được phân loại dựa theo các lớp mà nó liên quan đến

1.1.2.1 Lỗ hổng phần cứng
Trong lỗ hổng phần cứng có thể bao gồm:


8

-

Độ nhạy với độ ẩm
Độ nhạy với bụi
Độ nhạy với bẩn
Độ nhạy với thiết bị lưu trữ không được bảo vệ

1.1.2.2 Lỗ hổng phần mềm
Lỗ hổng phần mềm bao gồm:
-

Lỗ hổng phát sinh do chưa được kiểm thử đầy đủ
Lỗ hổng phát sinh do thiếu việc kiểm tra các lỗi đã từng xuất hiện
trước đây

1.1.2.3 Lỗ hổng mạng
Lỗ hổng mạng bao gồm:
-


Lỗ hổng do kênh truyền không được bảo vệ
Lỗ hổng do kiến trúc mạng không an toàn

1.1.2.4 Lỗ hổng về con người
Lỗ hổng về con người bao gồm:
-

Lỗ hổng do quá trình tuyển dụng thiếu chặt chẽ, chất lượng thấp
Lỗ hổng do quá trình đào tạo, nâng cao nhận thức mức trung bình

1.1.2.5 Lỗ hổng về site
Lỗ hổng về site bao gồm:
-

Lỗ hổng do site quá nhiều chủ đề
Lỗ hổng do khả năng của mã nguồn không đáng tin cậy

1.1.2.6 Lỗ hổng về tổ chức
Lỗ hổng về tổ chức bao gồm:
-

Lỗ hổng do thiếu kiểm tra thường xuyên
Lỗ hổng do thiếu kế hoạch liên tục
Lỗ hổng do thiếu bảo mật

1.1.3 Nguyên nhân gây ra lỗ hổng
Các nguyên nhân chính gây ra lỗ hổng bao gồm:
-


Sự phức tạp: hệ thống càng lớn, càng phức tạp thì càng làm tăng khả

-

năng xuất hiện lỗ hổng và những điểm truy cập ngoài ý muốn.
Sự quen thuộc: Thói quen sử dụng chung, những code đã biết, các
phần mềm, hệ điều hành và cả phần cứng làm tăng khả năng cho


9

những kẻ tấn công trong việc tìm kiếm những hiểu biết hoặc công cụ
-

để khai thác lỗi.
Sự kết nối: Quá nhiều kết nối vật lý, nhiều quyền, cổng, giao thức và
các dịch vụ trong cùng thời gian cũng dẫn đến việc tăng khả năng truy

-

cập đến các lổ hổng.
Lỗi hệ thống quản lý mật khẩu: Máy tính người dung sử dung mật
khẩu quá đơn giản (weak passwods) và có thể bị khám phá ra nếu bị
tấn công mạnh mẽ (thông qua các chương trình phân tích tốt và các hệ

-

thống tốt).
Lỗi thiết kế nền tảng hệ điều hành: Thiết kế hệ điều hành thực hiện
các chính sách tối ưu cục bộ hoặc dành cho việc quản lý người dung/


-

chương trình cụ thể.
Duyệt web: một vài trang web có thể chưa nhứng những phần mềm
độc hại (harmful Spyware) có thể cài đặt tự động lên hệ thống máy

-

tính trong quá trình truy cập.
Sai sót phần mềm: người lập trình không quan tâm đến những chỗ sai
sót có thể bị khác thác trong chương trình. Chương trình có thể chứa
những sai sót có thể cho phép những kẻ tấn công lạm dụng để khai

-

thác chương trình.
Không kiểm tra đầu vào: chương trình được giả định rang tất cả

-

những nhập liệu đầu vào của người dùng là an toàn.
Không rút kinh nghiệm từ những lỗi đã gặp phải trước đó: chẳng
hạn như những lỗi được phát hiện trong giao thức IPv4 cũng được tìm
thấy trong giao thức mới được xây dụng IPv6.

1.1.4 Khái niệm lỗ hổng phần mềm
Từ các quan điểm về lỗ hổng, cách thức phân loại lỗ hổng như trên, chúng
ta có thể đưa ra khái niệm về lỗ hổng phần mềm như sau: “Lỗ hổng phần mềm
đơn giản là điểm yếu trong hệ thống cho phép những kẻ tấn công có thể tận dụng

để phát huy lợi thế.”
Trong ngữ cảnh của bảo mật phần mềm: các lỗ hổng là những lỗi đặc
trưng hoặc bị bỏ quên trong một phần nào đó của phần mềm và cho phép những


10

kẻ tấn công gậy hại cho hệ thống thay đổi những thông tin nhạy cảm, làm gián
đoạn hoặc phá hủy hệ thống, hoặc chiếm quyền kiểm soát hệ thống máy tính
hoặc chương trình.

Hình 1.1 Vai trò của lỗ hổng trong bảo mật phần mềm

1.2 Các loại lỗ hổng phần mềm
Trong phần này, học viên sẽ đưa ra các cách phân loại lỗ hổng phần mềm
theo hai tiêu chí:
-

Phân loại theo các sai sót của phần mềm
Phân loại theo quá trình phát triển phần mềm.

1.2.1 Phân loại theo các sai sót của phần
mềm
Các loại sai sót phổ biến trong phần mềm dẫn tới việc xuất hiện các lỗ
hổng phần mềm bao gồm:

1.2.1.1 Vi phạm an toàn bộ nhớ (memory safety)
An toàn bộ nhớ là vấn đề đáng lo ngại trong quá trình phát triển phần
mềm nhằm mục đích tránh lỗi phần mềm gây ra lỗ hổng bảo mật với RAM như
gây ra tràn bộ đệm hoặc treo con trỏ.



11

Có một số loại lỗi bộ nhớ có thể xảy ra, tùy thuộc vào ngôn ngữ lập trình
được sử dụng:
 Lỗi tràn bộ đệm (buffer overflow): Việc ghi dữ liệu quá phạm vi
cho phép có thể làm hỏng nội dung của các đối tượng liền kề trong
bộ nhớ. Đây là lỗi cổ điển nhất và ngày càng ít gặp bởi vì hầu hết
các lập trình viên đều nhận thức được và tránh lỗi này.
 Lỗi bộ nhớ động (dynamic memory errors): quản lý không chính
xác bộ nhớ động và con trỏ động.
 Biến chưa được khởi tạo: Xảy ra khi một biến chưa được gán một
giá trị khởi tạo. Nó có thể chứa bên trong nó (trong một số ngôn
ngữ lập trình) những giá trị lỗi.
 Lỗi tràn bộ nhớ: gồm các lỗi sau:
o Stack overflow: Xảy ra khi chương trình chạy ra khỏi không
gian cho phép của ngăn xếp, thông thường vì đệ quy quá
sâu.
o Allocation failures: Chương trình cố gắng sử dụng nhiều bộ
nhớ hơn số lượng có sẵn. Trong một số ngôn ngữ, tình trạng
này phải được kiểm tra bằng tay sau mỗi lần phân bổ.

1.2.1.2 Lỗi xác thực đầu vào (input validation)
Quá trình xác thực dữ liệu đầu vào là quá trình nhằm đảm bảo rằng một
chương trình phần mềm hoạt động trên dữ liệu rõ ràng, chính xác và hữu ích. Nó
sử dụng một số thói quen hay còn gọi là các quy tắc để kiểm tra tính đúng đắn,
tính ý nghĩa và bảo mật của dữ liệu được nhập vào hệ thống. Các quy tắc có thể
được thực hiện thông qua các cách thức kiểm tra tự động theo từ điển dữ liệu
hoặc bởi các điều kiện logic của chương trình.


1.2.1.3 Điều kiện thực hiện (race condition)
Là hành vi của mổ 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ự đã được lập trình. Thuật ngữ
này bắt nguồn từ ý tưởng hai tín hiệu cùng chạy đua tới để tới đích trước


12

1.2.1.4 Lỗi phân quyền lẫn lộn (Privilege confusion)
Lỗi phần quyền lẫn lộn xảy ra khi một chương trình máy tính bị lừa bởi
một người khác nhằm vi phạm vào các truy cập không được phép. Đây là một
loại hình cụ thể của lỗi chiếm quyền thực thi. Trong an ninh thông tin, vấn đề này
thường được coi là một ví dụ về lý do tại sao bảo mật dựa trên khả năng là rất
quan trọng.

1.2.1.5 Lỗi chiếm quyền thực thi (Privilege escalation)
Là hành vi khai thác một lỗi, lỗ hổng 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 đặc quyền cao hơn sự cho phép. Kết quả là kẻ
tấn công có thể truy cập một ứng dụng với quyền lớn hơn dự định của nhà phát
triển hoặc quản trị hệ thống để thực hiện các hành vi trái phép.
Lỗi chiếm quyền thực thi xảy ra trong hai hình thức:
 Chiếm quyền thực thi theo chiều dọc: hay còn gọi là nâng cao đặc
quyền, nơi mà người sử dụng có đặc quyền thấp hơn hoặc các ứng
dụng truy cập các chức năng hay nội dung dành cho người sử dụng
hoặc ứng dụng có quyền cao hơn. Ví dụ như người sử dụng
Internet Banking có thể truy cập các chức năng quản trị của trang
web hoặc mật khẩu cho một Smartphone bị bỏ qua.

 Chiếm quyền thực thi theo chiều ngang: Là cách mà một người sử
dụng bình thương có thể truy cập các chức năng hoặc nội dung
dành cho người sử dụng bình thường khác. Ví dụ như người dùng
A có thể sử dụng Internet Banking để truy cập vào tài khoản của
người dùng B.

1.2.1.6 Các lỗi trong giao diện người dùng (user interface failures)


13

1.2.2 Phân loại theo quá trình phát triển
phần mềm
1.2.2.1 Lỗi thiết kế
Lỗ hổng trong thiết kế là một vấn đề phát sinh từ những sai lầm cơ bản
trong thiết kế hoặc trong giám sát của bước thiết kế phần mềm. Với các lỗ hổng
trong thiết kế, phần mềm sẽ không an toàn vì nó không chính xác với những gì
phần mềm nên được thiết kế để làm. Nó có thể là các thiết kế đơn giản nhưng
vẫn gây ra những lỗi lớn. Những sai sót thường xảy ra do những giả định về môi
trường của hệ thống không đúng với những gì mà hệ thống sẽ thực hiện hoặc
tương tác. Lỗi trong thiết kế được gọi là lỗ hổng có mức độ cao, những lỗ hổng
kiến trúc, hoặc các hạn chế, các vấn đề với các chương trình phần mềm.

1.2.2.2 Lỗi thực hiện
Khi nói về các lỗ hổng ở bước thực hiện xây dựng chương trình thì mã
nguồn chương trình đóng vai trò quan trọng nhất, nhưng cũng là nguyên nhân
gây ra các lỗ hổng phần mềm lớn nhất. Đúng như tên gọi của nó, các lỗ hổng
phần mềm thuộc loại này thường phát sinh trong quá trình thực hiện xây dựng
phần mềm, nhưng đôi khi cũng phát sinh ở giai đoạn tích hợp và kiểm thử phần
mềm. Những lỗ hổng này gây ra sự sai lệch giữa việc thiết kế và thực hiện xây

dựng phần mềm. Đánh giá chung thì các lỗ hổng ở bước này thường là các lỗ
hổng ở mức độ thấp hoặc chỉ là các lỗi kỹ thuật.

1.2.2.3 Lỗi sử dụng
Lỗ hổng trong vận hành, sử dụng hệ thống là các vấn đề an ninh phát sinh
trong quá trình vận hành, sử dụng một phần hoặc toàn bộ hệ thống phần mềm
trong một môi trường cụ thể. Cách thức phân biệt loại lỗ hổng này là đánh giá
các lỗ hổng không có trong mã nguồn của phần mềm hoặc chính xác hơn là đánh
giá cách phần mềm tương tác với môi trường của nó. Nó có thể bao gồm các vấn
đề với việc cấu hình phần mềm trong môi trường của nó hoặc vấn đề liên quan
tới các tác động tự động hoặc thủ công xung quanh phần mềm. Lỗ hổng này có
thể bao gồm một số phương thức tấn công vào người dùng của hệ thống.


14

1.3 Ngăn ngừa lỗ hổng phần mềm
Việc xây dựng các mô hình là phương pháp tiếp cận đầu tiên để đối phó
với các lỗ hổng dựa trên sự hiểu biết về nó. Trong phần này, luận văn sẽ đưa ra
hai phương pháp phòng chống lỗ hổng. Với mục đích là đánh giá các mã nguồn
phần mềm trong quá trình xây dựng để phát hiện ra bất kỳ lỗi bảo mật trong thời
gian này mà không cần phải có bước kiểm tra chuyên sâu sau khi đã hoàn thiện
phần mềm.

1.3.1 Phương pháp kiểm tra phần mềm
Phương pháp kiểm tra phần mềm là quá trình đọc trực tiếp mã nguồn phần
mềm hoặc các tài liệu liên quan để tìm ra lỗi và sửa chữa chúng trong quá trình
phát triển. Khi các lỗi tìm thấy sớm sẽ tiết kiệm chi phí cũng như sẽ dễ dàng hơn
khi sửa lỗi. Tuy nhiên, để đạt được kết quả tốt trong quá trình kiểm tra phần
mềm, một yếu tố quan trọng là khả năng của các nhân viên kiểm soát, các loại lỗi

mà họ cần kiểm tra. Thông thường, quá trình kiểm tra phần mềm là một bước bắt
buộc trong quá trình phát triển phần mềm.
Dưới đây, luận văn giới thiệu hai phương pháp kiểm tra dựa trên việc hệ
thống hóa các kiến thức của các chuyên gia bảo mật nhằm tìm ra các lỗ hổng trên
phần mềm.
 Xây dựng cây SGIT (Security Goal Indicator Trees)
Cây chỉ định mục tiêu kiểm tra an ninh (Security Goal Indicator Trees –
SGIT) tập trung vào các tính năng tích cực của các phần mềm mà có thể được
xác định trong suốt quá trình kiểm tra. Một SGIT là một đồ thị mà gốc là một
mục tiêu an ninh và các con của nó là các chỉ số hoặc các thuộc tính để xác định
được mục tiêu đó. Tuy nhiên, vì không phải tất cả các thuộc tính đều có thể mô tả
tường minh nên nó có thể có một số chỉ số tiêu cực. Các chỉ số này sẽ có một giá
trị logic với mục tiêu và phải được kiểm tra để đạt được mục tiêu.
SGIT được xây dựng bởi các chuyên gia về an toàn thông tin. Ví dụ về
một SGIT cho mục tiêu kiểm soát dữ liệu được mô tả trong hình 1.2, nó cho thấy


15

các quan hệ phụ thuộc, các chỉ số tích cực và tiêu cực, ngoài ra còn có các cây
SGIT khác được trỏ tới (như “An audit component exists”)

Hình 1.2 Ví dụ Security Goal Indicator Trees

 Lược đồ kiểm tra lỗ hổng (Vulnerability Inspection Diagram)
Xây dựng lược đồ kiểm tra lỗ hổng (Vulnerability Inspection Diagram VID) cũng là một phương pháp kiểm tra phần mềm thủ công với mục đích là
mang lại lợi ích cho các lập trình viên từ những kiến thức và kinh nghiệm của các
chuyên gia bảo mật trong quá trình phát triển ứng dụng. Vì vậy, một VID là một
đồ thị định hướng cho các lập trình viên để kiểm tra phần mềm nhằm phát hiện
các lỗ hổng trên phần mềm. Thông thường, với mỗi loại lỗ hổng sẽ có một lược

đồ tương ứng được xây dựng.


16

1.3.2 Phương pháp xây dựng mô hình SAG
(Security Activity Graph)
Mô hình hoạt động an ninh (Security Activity Graphs – SAGs) cũng rất
hiệu quả trong việc phòng chống lỗ hổng. Nó là một biểu đồ bao gồm các nguyên
nhân cụ thể của các hoạt động an ninh trong quá trình phát triển phần mềm. Biểu
đồ trong hình 1.3 cho thấy sự lựa chọn khác nhau để giải quyết vấn đề “Lacking
design to implementation traceability”

Hình 1.3 Ví dụ mô hình SAG

1.4 Dự đoán lỗ hổng phần mềm
Trong phần này, luận văn sẽ xem xét một số phương pháp dự đoán lỗ
hổng phần mềm phổ biến dùng phương pháp phân tích tĩnh và phương pháp động
nhằm đưa ra dự đoán lỗ hổng phần mềm.
Trong đó phương pháp phân tích tĩnh là phương pháp dự đoán lỗ hổng mà
không cần phải chạy mã nguồn để thực hiện phát hiện lỗ hổng. Với phương pháp
động, các mã nguồn phần mềm được chạy bên trong một môi trường được kiểm
soát để thực hiện việc phát hiện lỗ hổng hoặc thu thập các dấu hiệu để phát hiện
lỗ hổng.

1.4.1 Phương pháp dự đoán tĩnh
1.4.1.1 Phương pháp đối chiếu mẫu
Phương pháp đối chiếu mẫu là kỹ thuật phân tích tính đơn giản nhất. Một
ví dụ cụ thể áp dụng phương pháp này như sau:
Sử dụng cộng cụ Grep để tìm tất cả các lần xuất hiện của chuỗi “strcpy”

trong toàn bộ mã nguồn của một phần mềm được viết bằng ngôn ngữ lập trình C.


17

Khi đó, kết quả trả về hầu hết đều đưa ra hàm strcpy() trong thư viện của C. Việc
này dẫn tới chúng thường bị lạm dụng và dễ gây ra các lỗ hổng tiềm năng.
Do vậy, phương pháp này được đánh giá là thiếu tính thực tiễn. Nó có thể
không phân tích được các mã nguồn đơn giản và do vậy, nó cũng không phù hợp
để phân tích, phát hiện các lỗ hổng bảo mật phức tạp.

1.4.1.2 Phân tích từ vựng
Phương pháp phân tích từ vựng cải tiến hơn so với phương pháp đối chiếu
mẫu. Một lexer được sử dụng để chuyển mã nguồn thành 1 bộ các thẻ (token),
trong đó đã loại bỏ các khoảng trắng. Các thẻ này sẽ được đối chiếu lại một lần
nữa với cơ sở dữ liệu các mẫu lỗ hổng đã biết, từ đó đưa ra kết quả chính xác
hơn.
Một số công cụ sử dụng phương pháp này như Flawfinder, RATS, ITS4.
-

Công cụ Flawfinder: Nó chứa một cơ sở dữ liệu lớn các mẫu lỗ hổng
phần mềm. Khi phân tích mã nguồn, nó tạo ra một danh sách các lỗ
hổng bảo mật tiềm năng, trong đó phân thành các mức độ rủi ro tương
ứng. Danh sách các lỗi được đưa ra cũng được sắp xếp theo mức độ rủi
ro của chúng. Và những lỗi có mức độ rủi ro các nhất được đưa lên

-

đầu tiên. Từ đó, có thể tìm ra được lỗ hổng thực sự của phần mềm.
ITS4: Nó cũng là một công cụ phát hiện lỗ hổng phần mềm tương tự

như Flawfinder, nhưng nó có khả năng phân tích được nhiều ngôn ngữ
ngoài ngôn ngữ C. Một điểm khác biệt nữa là ITS4 có các xử lý đặc
biệt dựa trên các luật trong bộ tập luật của nó. Ví dụ như khi xử lý
đánh dấu hàm strcpy(), hàm này được gọi là an toàn nếu tham số thứ
hai của hàm là một chuỗi tĩnh.

Tuy nhiên, phương pháp này vẫn còn những nhược điểm như các lợi ích
của phân tích từ vựng còn nhỏ, con số sai số được đưa ra sau khi phân tích vẫn
còn rất lớn.


18

1.4.1.3 Phân tích dựa trên cây cú pháp trừu tượng (AST)
Bước tiếp theo trong việc cải thiện tính chính xác của kỹ thuật phân tích
tĩnh là phân tích các mã nguồn và xây dựng cây cú pháp trừu tượng (AST) đại
diện của chương trình. Việc này thường được thực hiện từ đầu vào của các
chương trình biên dịch và nó cung cấp khả năng tái sử dụng các mã nguồn. Một
trong các công cụ phân tích mã nguồn tĩnh sớm nhất là công cụ kiểm tra cú phát
Lint được xây dựng từ năm 1979. Công cụ này phát hiện ra các đoạn lệnh không
hợp lệ, các biến không được sử dụng hay các hàm được gọi với số tham số không
đúng. Các bộ biên dịch mới đã có thể thực hiện được hầu hết các hàm kiểm tra
như trên nên công cụ Lint đã trở nên lỗi thời, nhưng phương pháp phân tích dựa
trên cây cú pháp trừu tượng vẫn được sử dụng cho các công cụ phân tích phức
tạp hơn.
Vấn đề phân tích cú pháp C và đặc biệt là mã nguồn C++ có thể là một
nhiệm vụ hết sức phức tạp. Trong khi hầu hết các chương trình biên dịch đều
tương thích với ngôn ngữ C, thì các phần mềm lại có thể dựa trên các ngôn ngữ
không chuẩn khác. Do vây, dẫn tới việc phải mở rộng biên dịch hoặc gây ra lỗi
biên dịch. Một ví dụ cụ thể như sau:

TODO…
Cây cú pháp trừu trượng cho phép chúng ta phân tích không chỉ cú pháp
mà còn là ngữ nghĩa của một chương trình. Khi sử dụng phương pháp phân tích
từ vựng có thể gây nhầm lẫn giữa các biến cùng tên như là một lỗi hàm, nhưng
khi dùng phân tích AST sẽ có thể phân biệt được các loại định danh khác nhau.
Trên cây cú pháp trừu tượng thì biểu đồ mức độ và độ phức tạp được mở rộng, từ
đó có thể đưa ra được nhiều lỗ hổng tiềm ẩn hơn so với phương pháp phân tích từ
vựng. Các phương pháp phân tích trừu tượng hơn như phân tích luồng dữ liệu
hay phân tích lưu lượng dữ liệu có thể được xây dựng bằng cách sử dụng cây cú
pháp trừu tượng.


19

1.4.1.4 Phương pháp vòng loại
Một số công cụ phát hiện lỗ hổng tiên tiến hơn được xây dựng trên cơ sở
của phương pháp vòng loại được phát triển bởi Jeffrey Foster. Ông mô tả nó như
là các điều kiện bắt buộc phải có trên các ngôn ngữ lập trình cơ bản như C, C++,
Java hay ML.
Hầu hết các ngôn ngữ này đều có một số lượng giới hạn các vòng loại (là
các hằng số hoặc các từ khóa). Do vậy, Foster đã đề xuất một hệ thống các vòng
loại dùng chung bằng các chú giải trong mã nguồn và từ đó phát hiện các lỗ hổng
trong mã nguồn bằng vòng loại.
Hầu hết các công cụ sử dụng phương pháp này được xây dựng trên cơ sở
các công cụ phân tích mã nguồn C. Một ví dụ là công cụ phát hiện các lỗi trong
định dạng chuỗi do Shankar phát triển. Công cụ này sử dụng các vòng loại để
đánh dấu các chuỗi không đáng tin cậy trong chương trình. Nếu một biến bị đánh
dấu là chuỗi không tin cậy được sử dụng trong chương trình thì công cụ sẽ trả về
một lỗi định dạng chuỗi. Nhiều người cho rằng công cụ này có hiệu quả cao và
đã giảm được tỉ lệ các mã nguồn bị lỗi.

Phương pháp này có lợi thế là với các công cụ đơn giản thì chỉ cần yêu
cầu một vài chú thích cho vòng loại được thêm vào và áp dụng các phương pháp
suy luận thì sẽ có hiệu quả cho cả các chương trình lớn.
Tuy nhiên phương pháp này cũng có nhược điểm là nó chỉ áp dụng cho
một số lỗ hổng bảo mật có thể biểu diễn dưới dạng các mâu thuẫn.

1.4.1.5 Phân tích luồng dữ liệu
Các loại lỗ hổng phần mềm thì rất đa dạng và nó không chỉ đơn giản là
các lỗi về định dạng chuỗi. Các lỗi liên quan với việc tràn bộ đệm, tràn số
nguyên, chỉ mục của mảng hoặc các vấn đề về con trỏ đòi hỏi kỹ thuật phân tích
phức tạp hơn phương pháp đối chiếu mẫu, hay phương pháp phân tích từ vựng.
Những lỗ hổng có thể phát sinh khi một biến trong một chương trình có thể bị
mất ngoài phạm vi an toàn nhất định. Ví dụ, hàm strcpy() có thể là một lỗ hổng
nếu kịch thước chuỗi vượt quá kích thước của bộ nhớ đệm đích. Với những lỗi


20

như thế này thì việc phát hiện lỗi trong chương trình là rất khó. Phương pháp
phân tích luồng dữ liệu là một kỹ thuật sử dụng phương pháp biên dịch truyền
thống để giải quyết vấn đề này, và nó có thể sử dụng như một phương pháp để
phát hiện lỗ hổng của hệ thống.
Phương pháp phân tích luồng dữ liệu của một chương trình với ngôn ngữ
C có thể là bất khả thi nếu không tính tới các giải pháp để xử lý các vấn đề về sai
số hoặc các lỗi không thể phát hiện được. Điều này khiến cho các công cụ phân
tích mã nguồn tĩnh phải có hai lựa chọn: sử dụng luồng phân tích dữ liệu an toàn
hoặc cung cấp kết quả chính xác trong một số trường hợp, còn một số trường hợp
sẽ đưa ra kết quả xấp xỉ và chấp nhận các kết quả không hoàn toàn chính xác
hoặc có sai số. Nói chung, với các sai số nhỏ là có thể chấp nhận được và việc
phân tích mã nguồn không bị hạn chế sẽ quan trọng hơn, do đó phương pháp thứ

hai thường được lựa chọn nhiều hơn.

1.4.1.6 Phân tích hỏng hóc
Khái niệm hỏng hóc ở đây dung để chỉ những dữ liệu đến từ các nguồn
thong tin không đáng tin cậy, hay còn gọi là “vết nhơ” và nó gửi tình trạng của
nó tới tất cả các nơi sử dụng dữ liệu này. Mỗi chính sách bảo mật cụ thể sẽ quy
định việc cho phép hay hạn chế những dữ liệu không an toàn này.
Việc cố gắng sử dụng các dữ liệu bị hỏng này là một dấu hiệu của một lỗ
hổng trong phần mềm.
Ví dụ nổi bật nhất của kỹ thuật này là chế độ taint được cung cấp bởi các
ngôn ngữ lập trình Perl. Khi chạy trong chế độ này, các phiên dịch viên đánh dấu
tất cả các dữ liệu được đọc từ tập tin, mạng, các tham số lệnh, các biến môi
trường và từ các nguồn không tin cậy khác. Các ngôn ngữ này cung cấp các cơ
sở để loại bỏ (hoặc “rửa”) các dữ liệu không tin cậy sau khi các lập trình viên đã
xác minh rằng nó an toàn. Các dữ liệu bị hỏng có thể không được sử dụng trong
bất kỳ chức năng nào làm biến đổi các tập tin, thư mục hoặc thực hiện bởi các
chương trình bên ngoài. Nếu quy tắc này bị vi phạm, các thông dịch viên sẽ hủy
bỏ việc thực hiện chương trình.


21

1.4.1.7 Phương pháp phân tích văn bản
Cách thức tiếp cận của phương pháp này là coi mỗi file mã nguồn như là
một file văn bản. Mỗi file văn bản chuyển đổi thành một vectơ tính năng, trong
đó mỗi từ trong file văn bản đó được coi là một tính năng.
Trước khi chuyển đổi thành các vectơ tính năng thì mã nguồn phần mềm
sẽ thực hiện một bước tiền xử lý: Lọc ra tất cả các ghi chú từ hệ thống mã nguồn;
lọc ra tất cả các chuỗi và các giá trị số.
Sau quá trình tiền xử lý, chúng ta cần tạo ra các vectơ đặc trưng đại diện

cho các tập hợp các từ trong văn bản mã nguồn. Để phân tách các vectơ đặc
trưng thì chúng ta sẽ sử dụng các ký tự trắng, các dấu chấm câu như “. , ; ) ( g f]
[“ hoặc các toán tử số học và logic như “+ - / * ^ j jj & && !”. Từ đó trong mỗi
bộ vectơ đặc trưng có các tính năng cùng các giá trị của nó.
Ví dụ với file mã nguồn như sau trong file HelloWord.java:

Hình 1.4 Mã nguồn mẫu file "HelloWord.java"

Với việc lọc các từ trong file “HelloWord.java”, chúng ta đưa ra được
vectơ đặc trưng như sau:
class:1, HelloWorldApp:1, public:1, static:1,
void:1, main:1, String:1, args:1, System:1, out:1,
println:1
Lúc này mỗi từ được theo sau bởi một số.
Đến giai đoạn học, mỗi vecto đặc trưng trong mỗi file văn bản được gán
một nhãn (ví dụ: là lỗ hổng hoặc bình thường). Dựa trên khái niệm học máy
(SVM) chúng ta xây dựng mô hình dự báo lỗ hổng từ tập hợp các vecto đặc trưng
ở trên.


22

1.4.2 Phương pháp dự đoán động
1.4.2.1 Kỹ thuật Tiêm lỗi (Fault injection)
Đây là một kỹ thuật để dự đoan lỗ hổng bằng cách kiểm tra hành vi của hệ
thống dựa trên một số kiến thức về hệ thống để tạo ra các lỗi có thể xảy ra. Khi
này, một lỗi được đưa vào hệ thống để kiểm tra, đồng thời sẽ được quan sát nhằm
đánh giá khả năng chịu lỗi của hệ thống. Mỗi một lần thử thất bại là một lỗ hổng
tiềm năng của hệ thống được đưa ra.


1.4.2.2 Kỹ thuật Fuzzing
Ý tưởng của kỹ thuật này là cung cấp các dữ liệu ngẫu nhiên để làm đầu
vào cho ứng dụng nhằm xác định các xử lý của ứng dụng cho chính xác hay
không. Thử nghiệm này đơn giản hơn kỹ thuật tiêm lỗi vì các dữ liệu kiểm tra
được đưa vào là đơn giản luôn có thể biết được khi kiểm tra hệ thống.

1.4.2.3 Kỹ thuật Dynamic Taint
Kỹ thuật này tương tự như kỹ thuật phân tích hỏng hóc ở phương pháp dự
đoán tĩnh, nhưng trong trường hợp này, các dữ liệu bị lỗi được theo dõi trong quá
trình sử dụng hệ thống để xác định khả năng lỗi của nó. Nó cho phép phát hiện
các vấn đề của dữ liệu đầu vào mà có thể làm phát sinh lỗ hổng.

1.4.2.4 Kỹ thuật Sanitization
1.5 Phần mềm quét lỗ hổng
1.5.1 Giới thiệu chung
Phần mềm quét lỗ hổng là một ứng dụng phần mềm dung để đánh giá các
lỗ hổng bảo mật trong các mạng máy tính hoặc hệ thống máy chủ và đưa ra các
tập kết quả quét. Tuy nhiên, vì cả nhà quản lý và những kẻ tấn công có thể sử
dụng cùng một công cụ để sửa chữa và khai thác hệ thống, do vậy các quản trị
viên cần tiến hành quét và sửa chữa mọi vấn đề trước khi kẻ tấn công có thể quét
tương tự và khai thác lỗ hổng được tìm thấy.


23

1.5.2 Phần mềm quét lỗ hổng là gì
Một phần mềm quét lỗ hổng có thể đánh giá một loại các lỗ hổng trên hệ
thống thông tin bao gồm máy tính, hệ thống mạng, hệ điều hành và các ứng dụng
phần mềm khác. Các lỗ hổng này có thể xuất phát từ nhà cung cấp, hoặc từ các
hoạt động quản trị hệ thống hay các hoạt động sử dụng hàng ngày nói chung:

-

Nguồn gốc từ nhà cung cấp: bao gồm các lỗi phần mềm, các bản vá lỗi
hệ điều hành còn thiếu, các dịch vụ có lỗi, các cấu hình mặc định

-

không an toàn, hoặc các lỗ hổng từ ứng dụng web.
Nguồn gốc từ hệ quản trị: bao gồm các truy cập không chính xác hoặc
thay đổi cấu hình hệ thống trái phép, thiếu các chính sách bảo vệ mật

-

khẩu…
Nguồn gốc từ người sử dụng: chia sẽ trái phép các thư mục, không
chạy phần mềm quét virus, hoặc các hành vi có hại khác.

1.5.3 Các nhược điểm
Những nhược điểm của phần mềm quét lỗ hổng là:
-

Chỉ tức thời: mỗi phần mềm quét lỗ hổng chỉ có thể đánh giá tại một
thời điểm trong các điều khoản của máy tính hoặc tình trạng an ninh
mạng. Do đó, nhu cầu quét phải được tiến hành thường xuyên khi xuất
hiện các lỗi hổng mới hoặc khi thay đổi cấu hình hệ thống làm phát

-

sinh lỗ hổng bảo mật mới.
Sự cần thiết phải có sự tham gia của con người: Các phần mềm quét lỗ

hổng chỉ có thể được cài đặt dựa trên các cấu hình có sẵn do con người
thiết lập. Nó không thể tự động xác định một kết quả là chính xác hay
không chính xác. Việc tham gia của con người luôn là cần thiết trong

-

việc phân tích các dữ liệu sau khi quét.
Những vấn đề khác: Mỗi phần mềm quét lỗ hổng thường được thiết kế
để phát hiện ra các loại lỗ hổng đã được biết đến. Nó không thể phát
hiện ra các mối đe dọa bảo mật khác như các tác động vật lý, môi
trường.


24

1.5.4 Kiến trúc chung
Mô hình chung của một phần mềm quét lỗ hổng thường có bốn thành
phần (module) chính như sau: Scan Engine, Scan Database, Report Module và
User Interface.

Hình 1.5 Kiến trúc chung phần mềm quét lỗ hổng

Scan Engine: Thực hiện kiểm tra dựa trên các cài đăt có sẵn, xác định các
thông tin của hệ thống và các lỗ hổng. Nó có thể quét nhiều hơn một máy chủ tại
một thời điểm và so sánh kết quả với các lỗ hổng được biết đến.
Scan Database: Lưu trữ các dữ liệu về lỗ hổng, các kết quả quét, và các
dữ liệu khác được sử dụng bởi máy quét. Số lượng các cấu hình có sẵn, và tần số
cập nhật có thể khác nhau tùy nhà cung cấp tương ứng. Mỗi cấu hình có thể chứa
các thử nghiệm, các mô tả lỗ hổng thậm chí hướng dẫn sửa chữa lỗ hổng. Một
phần mềm với tính năng tự động cập nhất các cấu hình có thể cho phép tải về các

thiết lập mới nhất về cơ sở dữ liệu.
Report Module: Cung cấp các mức độ khác nhau về kết quả quét, như
các báo cáo chi tiết kỹ thuật, hay các đề xuất biện pháp sửa đổi cho người quản
trị hệ thống. Các đồ thị cấp cao hay các báo cáo xu hướng cho người điều hành
cũng là phạm vi của phần này.


25

User Interface: cho phép người quản trị có thể vận hành hệ thống quét lỗ
hổng. Nó có thể là giao diện đồ họa (GUI) hoặc đơn giản là giao diện dòng lệnh.

1.5.5 Các loại phần mềm quét lỗ hổng
Phần mềm quét lỗ hổng có thể dựa trên hai loại: phần mềm dựa trên mạng
và chạy qua mạng; phần mềm dựa trên máy chủ và chạy trên máy chủ mục tiêu
riêng
Phần mềm dựa trên mạng: Loại phần mềm này thường được cài đặt trên
một máy tính duy nhất và quét một số máy chủ khác trên mạng. Nó giúp phát
hiện lỗ hổng nghiêm trọng như tường lửa, máy chủ web bị lỗi, rủi ro liên quan tới
việc cung cấp phần mềm và các rủi ro liên quan đến quản trị mạng và hệ thống.
Phần mềm dựa trên máy chủ: Loại phần mềm này được cài đặt trong
máy chủ để quét và có quyền truy cập dữ liệu mức thấp như các dịch vụ trên máy
chủ và các cấu hình trên hệ điều hành của máy chủ. Các phần mềm này có thể
thực hiện các kiểm tra cơ bản và nâng cao vì phần mềm dựa trên mạng không có
quyền truy cập trực tiếp và hệ thống như phần mềm dựa trên máy chủ.

1.6 Kết luận chương
Chương 1 đã trình bày cơ sở lý thuyết về lỗ hổng nói chung và lỗ hổng
phần mềm nói riêng.
Mục 1.4 đã giới thiệu hai phương pháp dự đoán lỗ hổng phần mềm phổ

biến nhất hiện nay là phương pháp dự đoán tĩnh và phương pháp dự đoán động.
Trong đó phương pháp dự đoán tĩnh đã và đang được áp dụng rộng rãi, đặc biệt
là với các phần mềm phức tạp. Trong các phương pháp dự đoán tĩnh, phương
pháp phân tích văn bản là một phương pháp mới. Đây cũng là phương pháp luận
văn sẽ sử dụng để dự đoán lỗ hổng phần mềm.


×