Tìm hiểu về Fuzz Testing
1. Mục đích tìm hiểu Ngày nay, hình thức thanh toán trực tuyến thông qua website, ứng dụng online đang ngày càng trở nên phổ biến. Vì thế, các website, ứng dụng online này đã trở thành mục tiêu tấn công của hacker.Tại Việt Nam, “Trong năm 2013 đã có gần 5.000 hệ thống website của các cơ ...
1. Mục đích tìm hiểu
Ngày nay, hình thức thanh toán trực tuyến thông qua website, ứng dụng online đang ngày càng trở nên phổ biến. Vì thế, các website, ứng dụng online này đã trở thành mục tiêu tấn công của hacker.Tại Việt Nam, “Trong năm 2013 đã có gần 5.000 hệ thống website của các cơ quan doanh nghiệp tại Việt Nam bị hacker tấn công. Chủ yếu thông qua các lỗ hổng về mạng và cấu hình hệ thống. “(Nguồn http://bkav.com.vn) Từ thực trạng trên cho thấy, an ninh mạng vẫn chưa thực sự được các cơ quan, doanh nghiệp quan tâm. Do đó, cần thiết có một giải pháp kiểm thử an toàn bảo mật cho mỗi hệ thống website, ứng dụng online trước khi đưa vào sử dụng. Nhằm phát hiện và cảnh báo được các lỗ hổng trên hệ thống website một cách chính xác. Và thật may kỹ thuật fuzzing giúp tìm kiếm và xử lý được hầu hết các lỗ hổng trong vấn đề nêu trên.
2.Fuzzing là gì ?
Fuzzing là một kỹ thuật phát hiện lỗi của phần mềm bằng cách tự động hoặc bán tự động sử dụng phương pháp lặp lại thao tác sinh dữ liệu sau đó chuyển cho hệ thống xử lý. Nó cung cấp dữ liệu đầu vào cho chương trình (là các dữ liệu không hợp lệ, dữ liệu không mong đợi: 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), 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. Fuzzing là một trong những kỹ thuật của kiểm thử hộp đen. không đòi hỏi quyền truy cập vào mã nguồn. Do nó có khả năng tìm thấy lỗi một cách nhanh chóng và tránh được việc phải xem mã nguồn. Các chương trình và framework được dùng để tạo ra kỹ thuật fuzzing hoặc thực hiện fuzzing được 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.
3. Ưu điểm và nhược điểm của kiểm thử Fuzzing
3.1 Ưu điểm:
- Kiểm thử fuzzing giúp tìm thấy những lỗi nghiêm trọng nhất về bảo mật hoặc khiếm khuyết.
- Kết quả sử dụng kiểm thử Fuzzing hiệu quả hơn khi sử dụng các phương pháp kiểm thử khác.
- Kiểm thử fuzzing cải thiện vấn đề về an ninh khi kiểm tra phần mềm.
- Lỗi được tìm thấy bằng fuzzing đôi khi nghiêm trọng và hầu hết là những lỗi mà tin tặc hay sử dụng. Trong đó có crashes, rò rỉ bộ nhớ, unhandled exception, vv
- Những lỗi không được tìm thấy khi kiểm thử bị hạn chế về thời gian và nguồn lực thì cũng được kiểm thử fuzzing tìm ra.
3.2 Nhược điểm:
- Chỉ riêng kiểm thử Fuzzing thì không thể xử lý hết được các mối đe dọa an ninh tổng thể hoặc các lỗi.
- Kiểm thử Fuzzing kém hiệu quả với các lỗi mà không gây treo chương trình, chẳng hạn như một số loại virus, computer Worm, Trojan, vv. Chỉ hiệu quả trong các tình huống cụ thể.
- Fuzzing không cung cấp nhiều kiến thức về hoạt động nội bộ của các phần mềm.
- Với chương trình có các đầu vào phức tạp đòi hỏi phải tốn thời gian hơn để tạo ra một fuzzer đủ thông minh.
4. Các giai đoạn của kiểm thử Fuzz
Các bước thực hiện của kiểm thử fuzzing bao gồm các step cơ bản sau:
Bước 1: Xác định mục tiêu (Identify target)
Các mục tiêu được đánh giá có nguy cơ rủi ro cao gồm:
- Các lỗ hổng do lỗi của người lập trình hệ thống: SQL Injection, Code Injection, Cross Site Scripting, URL Redirect… Hoặc các lỗi do việc cấu hình hệ thống không an toàn như để đường dẫn vào trang quản trị hệ thống là mặc định, tài khoản mặc định…
- Các ứng dụng nhận dữ liệu qua mạng - có khả năng bị tổn hại từ xa vì tạo điều kiện thực thi mã từ xa để tạo ra các chương trình độc hại (virus, worm,...).
- Các ứng dụng chạy ở mức ưu đãi cao hơn so với thông thường - gây chú ý cho kẻ tấn công thực thi mã ở mức độ đặc quyền cao hơn, được gọi là leo thang đặc quyền.
- Các ứng dụng xử lý thông tin có giá trị - loại ứng dụng này thu hút kẻ tấn công phá vỡ các điều khiển, sự toàn vẹn, tin cậy của ứng dựng để lấy dữ liệu có giá trị.
- Các ứng dụng xử lý thông tin cá nhân – kẻ tấn công có thể lấy dữ liệu cá nhân có giá trị để dùng cho mục đích riêng không hợp pháp.(ví dụ: Windows Explorer, Window Registry, Media files, Office Documents, Configuration files)
Bước 2: Xác định đầu vào (Identify the Inputs)
Đầu vào ứng dụng có thể có nhiều hình thức, hoặc từ xa (mạng traffic), hoặc cục bộ (các file, các khóa registry, các biến môi trường, đối số dòng lệnh, tên đối tượng …). Một số fuzzer đã được tạo ra để phục vụ cho nhiều loại đầu vào. Các lớp đầu vào ứng với fuzzers phổ biến như sau:
- Command line arguments
- Environment variables (ShareFuzz)
- Web applications (WebFuzz)
- File formats (FileFuzz)
- Network protocols (SPIKE)
- Memory
- COM objects (COMRaider)
- Inter Process Communication
Bước 3: Tạo dữ liệu Fuzzed hay còn gọi là Tạo trường hợp thử nghiệm (Generate Fuzzed Data )
Mục đích của một fuzzer là để kiểm tra sự tồn tại của lỗ hổng bảo mật có thể truy cập thông qua đầu vào trong các ứng dụng phần mềm.
- Tạo ra dữ liệu thử nghiệm ở các mức độ đảm bảo thỏa mãn điều kiện ứng dụng đầu vào.
- Dữ liệu được tạo ra có thể dạng file nhị phân (Binary files), file văn bản (Text files) được sử dụng lặp đi lặp lại vào thời điểm bắt đầu của mỗi lần test.
- Việc tạo ra test data với nhiều testcase lặp đi lặp lại cung cấp các trường hợp kiểm thử để bắt lỗi khi chạy chương trình.
Fuzzers được phân loại dựa trên hai tiêu chí khác nhau: a. Injectionvector hoặc attack vector Fuzzers có thể được chia dựa trên các lĩnh vực ứng dụng mà chúng sử dụng, nhưng về cơ bản theo hướng attack vector. Đối với Fuzzers theo loại Injectionvector nó sẽ thực hiện kiểm thử hộp đen thông qua việc nhập dữ liệu đầu vào. Các Fuzzers loại này dùng để kiểm thử phía client và một số khác để kiểm thử phía server. Đối với fuzzers kiểm thử phía client với giao thức HTTP hoặc TLS sẽ nhằm mục tiêu vào các trình duyệt. Đối với các fuzzers kiểm thử phía Server sẽ thực hiện kiểm thử trên máy chủ Web Server. Một số fuzzers khác hỗ trợ kiểm thử trên cả hai Server và Client, hoặc thậm chí cả hai (dùng để phân tích proxy hoặc phân tích lưu lượng ). b. Kỹ thuật test case Fuzzers cũng có thể được phân loại dựa trên testcase phức tạp. Các test case được tạo ra trong fuzzing với mục tiêu tạo ra các lớp khác nhau trong phần mềm, và nhờ đó có thể thâm nhập vào các lớp logic khác nhau trong ứng dụng. Fuzzers mà thay đổi các giá trị khác nhau trong các giao thức sẽ kiểm tra được lỗ hổng như: tràn số nguyên và các vấn đề khác về số nguyên. Khi cấu trúc thông điệp được biến đổi dị thường (anomalized), các fuzzer sẽ tìm thấy sai sót trong phân tích cú pháp thông điệp (Chẳng hạn trong đặt tả XML và ASN.1). Một số phương pháp phân loại dựa trên sự phức tạp của test case trong một fuzzer:
- Staticandrandomtemplate-basedfuzzer:Những fuzzers thường chỉ kiểm tra các giao thức đáp ứng yêu cầu đơn giản, hoặc các định dạng tập tin.
- Block-basedfuzzers:Những fuzzers sẽ thực hiện cấu trúc cơ bản cho một giao thức đáp ứng yêu cầu đơn giản và có thể chứa một số chức năng động thô sơ như tính toán về checksums và chiều dài các giá trị (lengthvalues).
- Dynamicgenerationorevolutionbasedfuzzers:Đó là những fuzzers mà không nhất thiết phải hiểu được giao thức hoặc định dạng tập tin đang được fuzzed, nhưng có thể tìm hiểu nó dựa trên một vòng phản hồi từ hệ thống mục tiêu.
- Model-basedorsimulation-basedfuzzers:Là những fuzzers thực hiện kiểm thử giao diện hoặc thông qua một mô hình hoặc một mô phỏng, hoặc cũng có thể được triển khai đầy đủ của một giao thức. Không chỉ có cấu trúc thông điệp được fuzzed, mà còn thông điệp bất thường trong chuỗi được tạo ra.
Hiệu quả của fuzzing phụ thuộc vào : + Độ bao phủ không gian đầu vào (input spacecoverage) : Không gian đầu vào của giao diện kiểm thử càng tốt thì hiệu quả đạt càng cao. + Chất lượng của dữ liệu kiểm thử (qualityoftestdata) : Các đầu vào độc hại tiêu biểu (representativemalicious) và dị hình (malformed) sẽ làm sẽ là tăng cường khả năng kiểm thử đối với các yếu tố hoặc cấu trúc trong định nghĩa giao diện.
Bước 4: Thực hiện test sử dụng dữ liệu fuzz (Excute Fuzzed Data)
Ở giai đoạn này, thông thường các fuzzers thực hiện phần lớn các chức năng của các cách tiếp cận nêu trên nhưng bằng cách giải pháp đặt biệt để tự động hóa quá trình xử lý kiểm thử. Đối tượng tiếp cận của Fuzzing bao gồm:
- các con số (signed, unsigned integers, float...)
- ký tự (urls, command-line inputs),
- siêu dữ liệu
- các chuỗi nhị phân, định dạng file (.pdf, png, .wav, .mpg…)
- các giao thức mạng (http, SOAP, SNMP…)
- cũng có thể bao gồm bất kỳ giao diện I/O/ nào đó, các dòng lệnh tùy chọn, import/export, các form, nội dung hay yêu cầu (request) do người dùng tạo ra v.v… Cách tiếp cận chung cho fuzzing là:
- sinh tập dữ liệu giá trị nguy hiểm được biết đến (gọi là fuzz vectors) ứng từng loại đầu vào cụ thể hoặc các lỗ hổng hoặc với các định dạng file, mã nguồn, các giao thức hoặc tổ hợp lại với nhau.
- Chèn thêm mã thực thi vào mã máy của chương trình.
- Phân tích hoạt động của chương trình trong lúc thực thi.
Bước 5: Giám sát dữ liệu fuzz (Monitor for exception Fuzzed Data)
Giai đoạn này không đơn thuần các fuzzers phát hiện các lỗ hổng qua fuzzing, mà phải định nghĩa các lỗi được phát hiện. Điều này có ý nghĩa hết sức quan trọng trong việc phân tích và báo cáo lỗi. Để báo cáo lỗi đòi hỏi sự hiểu biết rõ về hoạt động xử lý, và có thể được tích hợp vào sự kiện phân loại lỗi tự động.
Bước 6: Xác định khả năng khai thác (Determine exploitability)
Sau khi một hoặc một số lỗi phần mềm đã được xác định, các fuzzers gửi một danh sách các khiếm khuyết này để một đội ngũ phát triển, để họ có thể sửa chữa chúng. Tất nhiên, việc này đòi hỏi một cuộc kiểm tra cho dù khiếm khuyết có hay không có khả năng khai thác nhằm tìm hiểu các tác động sẽ ảnh hưởng đến người dùng.
5. Kết luận:
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 website dịch vụ. Ngoài ra, fuzzing là một trong những phương pháp phổ biến nhất được hacker sử dụng để tìm lỗ hổng của hệ thống. Nên khi các quản trị viên, những người trực tiếp quản lý và theo dõi tình hình hoạt động các website hoặc các QA/tester sử dụng phương pháp này để kiểm thử sẽ giúp chương trình ngăn chặn trước được sự quấy phá từ hacker.