Đốitượ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âmnhập vào hệ thống.. Kết
Trang 1LUẬ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
Trang 3Chính vì vậy, ngày nay các phần mềm dự đoán lỗ hổng của một phầnmềm đang phát triển mạnh mẽ, với nhiều phương pháp khác nhau Có haiphươ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 Đốitượ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âmnhậ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íchcá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ươngphá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”
Trang 4Kế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ổngphầ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áctrí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 chomột hệ thống phần mềm mới
Trang 5MỤC LỤC
LỜI CẢM ƠN i
LỜI CAM ĐOAN ii
MỤC LỤC iii
Danh mục từ viết tắt v
Danh mục các bảng v
Danh mục các hình v
MỞ ĐẦU 1
1 Chương 1 – TỔNG QUAN VỀ DỰ ĐOÁN LỖ HỔNG PHẦN MỀM 3
1.1 Khái niệm lỗ hổng phần mềm 3
1.1.1 Lỗ hổng 3
1.1.2 Phân loại lỗ hổng 4
1.1.3 Nguyên nhân gây ra lỗ hổng 5
1.1.4 Khái niệm lỗ hổng phần mềm 6
1.2 Các loại lỗ hổng phần mềm 7
1.2.1 Phân loại theo các sai sót của phần mềm 7
1.2.2 Phân loại theo quá trình phát triển phần mềm 10
1.3 Ngăn ngừa lỗ hổng phần mềm 11
1.3.1 Phương pháp kiểm tra phần mềm 11
1.3.2 Phương pháp xây dựng mô hình SAG (Security Activity Graph) 13
1.4 Dự đoán lỗ hổng phần mềm 13
1.4.1 Phương pháp dự đoán tĩnh 13
1.4.2 Phương pháp dự đoán động 19
1.5 Phần mềm quét lỗ hổng 19
1.5.1 Giới thiệu chung 19
1.5.2 Phần mềm quét lỗ hổng là gì 20
1.5.3 Các nhược điểm 20
1.5.4 Kiến trúc chung 21
1.5.5 Các loại phần mềm quét lỗ hổng 22
1.6 Kết luận chương 22
Trang 62 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 23
2.1 Khái niệm về khai phá dữ liệu và các mô hình khai phá dữ liệu 23
2.1.1 Khái niệm 23
2.1.2 Các mô hình khai phá dữ liệu 25
2.1.3 Mạng nơron trong khai phá dữ liệu 28
2.2 Xây dựng các đặc trưng từ các văn bản mã nguồn phần mềm 39
2.3 Sử dụng kỹ thuật khai phá dữ liệu phân tích mã nguồn phần mềm 39
2.4 Kết luận chương 39
3 Chương 3 – THỬ NGHIỆM VÀ ĐÁNH GIÁ KẾT QUẢ 40
3.1 Thu thập, phân tích dữ liệu 40
3.1.1 Thu thập dữ liệu 40
3.1.2 Phân tích dữ liệu 40
3.2 Thực thi chương trình 40
3.2.1 Giới thiệu công cụ thực nghiệm 40
3.2.2 Tổng hợp kết quả 40
3.3 Đánh giá kết quả thực hiện dự đoán 40
3.4 Kết luận chương 40
KẾT LUẬN 40
TÀI LIỆU THAM KHẢO 40
Trang 7Danh mục từ viết tắt
1 AST Cây cú pháp trừu tượng Abstract syntax tree
Danh mục các bảng
Danh mục các hình
Hình 1.1 Vai trò của lỗ hổng trong bảo mật phần mềm 7
Hình 1.2 Ví dụ Security Goal Indicator Trees 12
Hình 1.3 Ví dụ mô hình SAG 13
Hình 1.4 Mã nguồn mẫu file "HelloWord.java" 18
Hình 1.5 Kiến trúc chung phần mềm quét lỗ hổng 21
Hình 2.1 Các bước trong khai phá dữ liệu 24
Hình 2.2 Mô hình và quá trình xử lý trong nơron nhân tạo 28
Hình 2.3 Sơ đồ đơn giản về một mạng nơron nhân tạo 30
Hình 2.4 Mạng truyển thẳng với một mức nơron 31
Hình 2.5 Mạng tiến kết nối đầy đủ với một mức ẩn và một mức đầu ra 32
Hình 2.6 Mạng hồi quy không có nơron ẩn và không có vòng lặp tự phản hồi 33
Hình 2.7 Mạng hồi quy có các nơron ẩn 33
Trang 8Chươ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 chophé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 haylỗ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 khaithá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ácbở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, chocá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đó
Trang 9 Ủy ban về các hệ thống an ninh quốc gia của Mỹ xác định kháiniệ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 andTechnology – 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ìnhhay 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ệnbấ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ộibộ
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 ngaychính tại hệ điều hành như trong Windows NT, Windows 95, UNIX; hoặc trongcá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:
Trang 10- 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ệntrướ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:
Trang 11- 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 chonhữ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 truycậ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áytí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ứanhững sai sót có thể cho phép những kẻ tấn công lạm dụng để khaithá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ìmthấy trong giao thức mới được xây dụng IPv6
Trang 121.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
Hình 1.1 Vai trò của lỗ hổng trong bảo mật phần mềm1.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ềmtheo 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
Trang 131.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ầnmề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ỏ
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 vicho 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ếtcá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ínhxá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ộtgiá trị khởi tạo Nó có thể chứa bên trong nó (trong một số ngônngữ 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ônggian 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ạngnà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ộtchươ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ó
Trang 14sử 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ệuhoặ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
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ởimộ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ộtloạ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àythườ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ấtquan 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ìnhtrong 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áttriể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 đặcquyền, nơi mà người sử dụng có đặc quyền thấp hơn hoặc các ứngdụng truy cập các chức năng hay nội dung dành cho người sử dụnghoặc ứng dụng có quyền cao hơn Ví dụ như người sử dụng InternetBanking có thể truy cập các chức năng quản trị của trang web hoặcmật khẩu cho một Smartphone bị bỏ qua
Trang 15 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 dungdà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ủangười dùng B
1.2.1.6 Các lỗi trong giao diện người dùng (user interface failures)
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ảntrong 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ổngtrong 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ưngvẫ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ôitrường của hệ thống không đúng với những gì mà hệ thống sẽ thực hiện hoặctương tác Lỗi trong thiết kế được gọi là lỗ hổng có mức độ cao, những lỗ hổngkiế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ângâ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ổngphầ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ựngphần mềm, nhưng đôi khi cũng phát sinh ở giai đoạn tích hợp và kiểm thử phầnmề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âydự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
Trang 161.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 sinhtrong 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ềmtrong 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à đánhgiá 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 quantớ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
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 rahai phương pháp phòng chống lỗ hổng Với mục đích là đánh giá các mã nguồnphầ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ờigian này mà không cần phải có bước kiểm tra chuyên sâu sau khi đã hoàn thiệnphầ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ầnmề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ìnhphá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ơnkhi sửa lỗi Tuy nhiên, để đạt được kết quả tốt trong quá trình kiểm tra phầnmề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ắtbuộ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ênphần mềm
Xây dựng cây SGIT (Security Goal Indicator Trees)
Trang 17Câ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ể đượcxác định trong suốt quá trình kiểm tra Một SGIT là một đồ thị mà gốc là mộtmụ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ấycá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âySGIT khác được trỏ tới (như “An audit component exists”)
Hình 1.2 Ví dụ Security Goal Indicator Trees
Trang 18
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ácchuyê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ệncá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
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ấthiệu quả trong việc phòng chống lỗ hổng Nó là một biểu đồ bao gồm các nguyênnhâ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 đề “Lackingdesign to implementation traceability”
Hình 1.3 Ví dụ mô hình SAG1.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 độngnhằ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
Trang 19động, các mã nguồn phần mềm được chạy bên trong một môi trường được kiểmsoá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.Khi đó, kết quả trả về hầu hết đều đưa ra hàm strcpy() trong thư viện của C Việcnà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ếumẫ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ầnnữ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áchơ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ổngphầ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 đầutiê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ữ
Trang 20ngoài ngôn ngữ C Một điểm khác biệt nữa là ITS4 có các xử lý đặcbiệ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 íchcủ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ẫncòn rất lớn
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íchtĩ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) đạidiệ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ácchươ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ộttrong 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átLint đượ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ônghợ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 tranhư 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ựatrê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ứctạ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ộtnhiệ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 đềutươ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ỗibiê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ưngkhi dùng phân tích AST sẽ có thể phân biệt được các loại định danh khác nhau
Trang 21Trê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ệuhay 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
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ị đánhdấ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êucầ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ápsuy 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 chomộ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ố
Trang 22nguyê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íchphứ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ổngnế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ỗinhư thế này thì việc phát hiện lỗi trong chương trình là rất khó Phương phápphâ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ềnthố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ântí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ànhoặ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áchoặc có sai số Nói chung, với các sai số nhỏ là có thể chấp nhận được và việcphâ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
Trang 23để 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ácminh 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ácchươ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
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ệncho các tập hợp các từ trong văn bản mã nguồn Để phân tách các vectơ đặctrư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 đượcvectơ đặ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ố
Trang 24Đến giai đoạn học, mỗi vecto đặc trưng trong mỗi file văn bản được gánmộ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
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 Khinà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ổngtiề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 đầuvào cho ứng dụng nhằm xác định các xử lý của ứng dụng cho chính xác haykhô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ệncá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áctậ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ử
Trang 25dụ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éttương tự và khai thác lỗ hổng được tìm thấy.
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ụngphầ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áchoạ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 địnhkhô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ặcthay đổi cấu hình hệ thống trái phép, thiếu các chính sách bảo vệ mậtkhẩu…
- Nguồn gốc từ người sử dụng: chia sẽ trái phép các thư mục, khôngchạ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ộtthời điểm trong các điều khoản của máy tính hoặc tình trạng an ninhmạng Do đó, nhu cầu quét phải được tiến hành thường xuyên khi xuấthiện các lỗi hổng mới hoặc khi thay đổi cấu hình hệ thống làm phátsinh 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ườithiết lập Nó không thể tự động xác định một kết quả là chính xác haykhông chính xác Việc tham gia của con người luôn là cần thiết trongviệc phân tích các dữ liệu sau khi quét
Trang 26- 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áthiệ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ôitrường
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ànhphầ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ạimộ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ứacá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ộtphầ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ácthiết lập mới nhất về cơ sở dữ liệu
Trang 27Report 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ảntrị 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ànhcũng là phạm vi của phần này
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êuriê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áthiệ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ớiviệ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áychủ 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ủ
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ươngphá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ậnvăn sẽ sử dụng để dự đoán lỗ hổng phần mềm