1. Khái niệm
Trong lĩnh vực an ninh ứng dụng, Fuzzing là một kỹ thuật phát hiện lỗi của phần
mềm bằng cách cung cấp dữ liệu đầu vào cho chương trình (các dữ liệu không hợp lệ, dữ liệu không mong đợi), sau đó theo dõi và ghi lại các lỗi, các kết quả trả về của ứng dụng trong quá trình xử lý của chương trình. Dữ liệu không mong đợi
thường là các giá trị vượt quá biên, các giá trị đặc biệt có ảnh hưởng tới phần xử lý, hiển thị của chương trình.
Fuzzing là quá trình tự động hoặc bán tự động và lặp lại thao tác sinh dữ liệu sau đó chuyển cho hệ thống xử lý. Kỹ thuật Fuzzing thường được sử dụng nhiều trong việc kiểm thử cho các vấn đề về an ninh trong các phần mềm, hệ thống máy tính và các ứng dụng dịch vụ. Khái niệm Fuzzing thiên về lý thuyết hơn là giải pháp cụ thể cho từng vấn đề. Các chương trình ứng dụng Fuzzing gọi là Fuzzer. Tùy theo môi trường và ứng dụng cần kiểm tra mà người ta có các phương án khác nhau để xây dựng Fuzzer.
2. Lịch sử của Fuzzing
Thuật ngữ “fuzz” được giá sư Barton Millter đưa ra trong bài tập cho sinh viên tại trường Winconsin Madison vào năm 1988. Bài tập được đặt tên là “Operating System Utility Program Reliability - The Fuzz Generator” để kiểm tra mức độ chịu đựng của các ứng dụng Unix, độ tin cậy của mã nguồn. Hiện nay, các kết quả nghiên cứu của nhóm vẫn được cập nhật tại địa chỉ: http://pages.cs.wisc.edu/~bart/fuzz/.
Năm 1999, trường đại học Oulu bắt đầu xây dựng các bộ kiểm thử PROTOS. Các bộ kiểm thử được xây dựng qua việc nghiên cứu và đặc tả giao thức sau đó tạo ra các gói tin “dị dạng” để kiểm tra xem ứng dụng cài đặt có xử lý đúng đắn nó không. Việc sinh ra những bộ kiểm thử như vậy khá tốn nhiều công sức, nhưng một khi hoàn tất sẽ có thể áp dụng cho nhiều ứng dụng khác nhau của nhiều hãng phát triển khác nhau. Một số lượng lớn lỗi đã được phát hiện trong quá trình fuzzing sau đó. Năm 2002, Microsoft đã quyết định đầu tư cho nhóm sáng lập PROTOS. Năm 2003, các thành viên của nhóm đã thành lập Codenomicon, một công ty chuyên thiết kế và phát triển các sản phẩm fuzzing thương mại.
Trong suốt thời gian từ năm 2003 đến nay, nhiều lỗ hổng phần mềm đã được phát hiện và công bố đều được phát hiện dựa trên kỹ thuật fuzzing. Như lỗi MS04-28 trong hệ điều hành Windows, các lỗi về định dạng tệp tin, các lỗi trong nền tảng ActiveX, …
3. Phân loại các kỹ thuật fuzzing
Dựa trên các phương pháp sinh dữ liệu và cách thực hiện phương pháp fuzzing chúng ta có thể phân chia phương pháp fuzzing thành 5 loại như sau:
Sử dụng các testcase được sinh trước (Pregenerated Test Cases). Theo
cách này người thực hiện fuzzingsex sử dụng những bộ dữ liệu đặc biệt, cố định, được lập trình cứng, để tạo ra các bộ dữ liệu này cần nhiều công sức và kinh nghiệm. Một khi tất cả các bộ dữ liệu đã được gửi đi thì qua trình fuzzing cũng kết thúc. Điểm yếu của quá trình này phụ thuộc vào độ chính xác của bộ dữ liệu fuzzing.
Sinh dữ liệu ngẫu nhiên (Random). Dữ liệu được sinh ra ngẫu nhiên, liên
tục và gửi đi, không theo giao thức nào. Cách này không hiệu quả, mặc dù vậy thật ngạc nhiên là đã có những lỗi cực kỳ quan trọng đã được phát hiện bởi phương pháp này.
Kiểm tra thủ công bằng cách thay đổi giao thức (Manual Protocol
Mutation Testing). Theo phương pháp này, không có một chương trình
fuzzer tự động nào. Thực tế người nghiên cứu chính là fuzzer, họ chặn các giao thức, sửa đổi ngẫu nhiên và chuyển đi. Cách này được dùng chủ yếu cho các ứng dụng web.
Thay đổi giao thức tự động (Mutation hay là Brute Force Testing).
Phương pháp này bắt đầu từ một mẫu dữ liệu hợp lệ, sửa từng byte, word, dword, hay xâu trong đó. Phương pháp này có ưu điểm là không tốn công nghiên cứu giao thức và định dạng tệp, thời gian để xây dựng một fuzzer nhanh. Tuy nhiên mức độ bao trùm lệnh tùy thuộc vào việc gọn gói tin hay tệp tin mẫu ban đầu. Phần lớn các giao thức và định dạng tệp khác phực tạp, do vậy số lượng mẫu ban đầu phải tương đối lớn để bao trùm hết các khả năng kiểm thử củ. FileFuzz và notSPIKEfile là hai fuzzer mã nguồn mở sử dụng kỹ thuật này.
Tự động sinh dữ liệu cho giao thức (Automatic Protocol Generation
Testing). Đây là phương pháp cao cấp nhất hiện nay, thay vì tạo ra các bộ dữ
liệu cứng để kiểm tra, ngươi nghiên cứu sẽ xây dựng một ngữ pháp để mô tả giao thức sẽ hoạt động thế nào, các đơn vị dữ liệu cơ bản, và trình tự hoạt động của giao thức. Công việc này đòi hỏi thời gian và công sức nghiên cứu nhưng sau đó công việc là giành cho fuzzer.
Kỹ thuật fuzzing được ứng dụng rất nhiều trong việc kiểm thử phần mềm, hệ thống, hay các chuẩn giao thức. Tuy nhiên trong phạm vi đồ án chỉ đi sâu vào phân tích phương pháp fuzzing đặc thù cho ứng dụng web.
Một ứng dụng web thao tác với người dùng qua trình duyệt và sử dụng giao thức HTTP hoặc HTTPS. Một hệ thống website sẽ chứa các điểm đầu vào của hệ thống bao gồm:
- Các form nhập dữ liệu
- Các giá trị trên các URL của website.
- Các trường trong HTTP Headers (bao gồm cả cookies)
Việc kiểm thử hệ thống sẽ tập trung chủ yếu vào các điểm đầu vào của hệ thống cụ thể là việc gửi các dữ liệu qua Headers, phương thức GET , POST. Fuzzer sẽ phải thực hiện việc thu thập toàn bộ các điểm đầu vào của hệ thống trước khi thực hiện fuzzing. Dưới đây là mô hình kiểm thử website dựa trên kỹ thuật fuzzing:
Hình : Kiểm thử website dựa trên kỹ thuật Fuzzing
Với các lỗ hổng website sẽ có những chữ ký để nhận dạng cho các ứng dụng đó. Cụ thể chính là giá trị thêm vào các biến trước khi gửi tới hệ thống. Và phân tích các kết quả trả về từ ứng dụng.
PHẦN III: XÂY DỰNG HỆ THỐNG
Nội dung chính
Các giải pháp xây dựng hệ thống Phân tích và thiết kế hệ thống