Hướng dẫn kiểm tra Fuzz (Fuzzing)
⚡ Tóm tắt thông minh
Kiểm thử Fuzz cung cấp dữ liệu không hợp lệ, không mong đợi hoặc ngẫu nhiên cho chương trình và theo dõi các sự cố, treo máy và lỗi bộ nhớ, từ đó phát hiện các lỗ hổng bảo mật mà các bài kiểm thử chức năng thông thường hầu như không bao giờ tìm ra được.
Kiểm tra Fuzz là gì?
Kiểm thử mờ (Fuzz Testing) hay kỹ thuật làm mờ (Fuzzing) Kiểm thử mờ (fuzz testing) là một kỹ thuật kiểm thử phần mềm sử dụng dữ liệu không hợp lệ hoặc ngẫu nhiên (gọi là FUZZ) để đưa vào hệ thống phần mềm nhằm phát hiện lỗi lập trình và lỗ hổng bảo mật. Mục đích của kiểm thử mờ là chèn dữ liệu bằng các kỹ thuật tự động hoặc bán tự động và kiểm tra hệ thống đối với các ngoại lệ khác nhau như hệ thống bị sập hoặc lỗi của mã tích hợp.
Kiểm thử mờ (Fuzz testing) ban đầu được phát triển bởi Barton Miller tại Đại học Wisconsin–Madison, người đã đặt ra thuật ngữ này sau khi nhiễu đường truyền trên modem làm sập các chương trình ông đang sử dụng. Sinh viên của ông đã chạy các chương trình kiểm thử mờ đầu tiên vào năm 1989 và phát hiện ra rằng khoảng một phần ba các tiện ích UNIX mà họ nhắm mục tiêu bị sập hoặc treo. Kiểm thử mờ là một phương pháp kiểm thử. kiểm thử phần mềm kỹ thuật, và nó là một loại Kiểm tra bảo mật.
Sơ đồ bên dưới minh họa vòng lặp fuzzing cơ bản, trong đó dữ liệu được tạo ra được đưa vào ứng dụng cần kiểm thử và phản hồi được quan sát.
Tại sao phải thực hiện Fuzz testing?
Việc sử dụng kỹ thuật fuzzing có vị trí xứng đáng trong kế hoạch kiểm thử vì nó khám phá những dữ liệu đầu vào mà không ai nghĩ đến việc viết trường hợp kiểm thử. Những lý do chính khiến các nhóm áp dụng kỹ thuật này được liệt kê bên dưới.
- Kiểm thử mờ (fuzz testing) thường giúp phát hiện các lỗi và khiếm khuyết bảo mật nghiêm trọng nhất, bởi vì sự cố xảy ra là bằng chứng trực tiếp về một đường dẫn đầu vào chưa được xử lý đúng cách.
- Kiểm thử mờ (fuzz testing) cho kết quả hiệu quả hơn khi được sử dụng cùng với... Da Đen Box Kiểm tra, Thử nghiệm Beta và các phương pháp gỡ lỗi khác.
- Kiểm thử mờ (fuzz testing) được sử dụng để kiểm tra tính dễ bị tổn thương của phần mềm, và đây là một kỹ thuật kiểm thử rất tiết kiệm chi phí vì dữ liệu đầu vào được tạo tự động thay vì phải nhập thủ công.
- Kiểm thử mờ (fuzz testing) là một trong những kỹ thuật kiểm thử hộp đen. Kiểm thử mờ cũng là một trong những phương pháp phổ biến nhất mà tin tặc sử dụng để tìm ra lỗ hổng trong hệ thống, vì vậy việc chạy nó trước tiên sẽ loại bỏ con đường dễ dàng nhất để kẻ tấn công xâm nhập.
Các loại kiểm thử mờ (Fuzz Testing)
Các công cụ kiểm thử lỗi (fuzzer) thường được phân loại dựa trên mức độ hiểu biết của chúng về chương trình mà chúng đang tấn công. Công cụ càng hiểu biết nhiều, nó càng có thể thâm nhập sâu hơn vào mã nguồn.
| Kiểu | Những gì kẻ chuyên làm mờ hình ảnh biết | Sử dụng điển hình |
| Làm mờ hộp đen | Không có thông tin gì về cấu tạo bên trong; nó chỉ nhận biết tín hiệu đầu vào và đầu ra. | Chạy nhanh các thao tác quét mã độc trên một tệp nhị phân hoặc một điểm cuối đang hoạt động. |
| Làm mờ hộp trắng | Toàn bộ mã nguồn, thường được kết hợp với thực thi tượng trưng để giải quyết các nhánh khó tiếp cận. | Phân tích chuyên sâu một linh kiện có sẵn mã nguồn. |
| Làm mờ hộp màu xám | Không có đánh giá mã nguồn, nhưng có phản hồi trong quá trình thực thi, chẳng hạn như đầu vào đã được thực thi ở nhánh mã nào. | Đây là cấu hình mặc định cho các công cụ hiện đại như AFL++ và libFuzzer. |
Một chiếc xe thứ hai, cũ hơn, đã được chia tách. mờ nhạt ngu ngốc từ làm mờ thông minhMột công cụ kiểm thử lỗi (fuzzer) đơn giản chỉ đảo bit mà không hiểu định dạng đầu vào, do đó hầu hết dữ liệu của nó bị từ chối bởi trình phân tích cú pháp đầu tiên mà nó gặp. Một công cụ kiểm thử lỗi thông minh hiểu được mã kiểm tra (checksum), trường độ dài và cấu trúc thông báo, vì vậy dữ liệu đầu vào của nó vượt qua quá trình xác thực và đến được phần logic bên dưới. làm mờ dựa trên phạm vi bao phủ Đây là sự tinh chỉnh hộp xám đã đưa kỹ thuật fuzzing trở nên phổ biến: công cụ này xử lý dữ liệu nhị phân, giữ lại bất kỳ đầu vào nào dẫn đến một nhánh mới và biến đổi các phần còn lại, do đó tập dữ liệu dần dần phát triển hướng tới mã chưa được khám phá thay vì bắt đầu lại từ nhiễu ngẫu nhiên.
Cách thực hiện kiểm tra Fuzz
Các bước của kiểm thử mờ (fuzz testing) bao gồm các bước kiểm thử cơ bản:
Bước 1) Xác định hệ thống mục tiêu — Chọn tệp nhị phân, thư viện, dịch vụ hoặc điểm cuối giao thức sẽ bị tấn công và xác nhận bạn được phép kiểm tra nó.
Bước 2) Xác định đầu vào — Liệt kê mọi điểm truy cập mà mục tiêu đọc từ đó: tập tin, đối số dòng lệnh, biến môi trường, gói mạng, trường biểu mẫu và dữ liệu API.
Bước 3) Tạo dữ liệu mờ — Tạo ra các dữ liệu đầu vào bị lỗi bằng cách biến đổi các mẫu hợp lệ, bằng cách tạo ra chúng từ một mô hình của định dạng hoặc bằng cách kết hợp cả hai.
Bước 4) Thực hiện kiểm thử bằng dữ liệu mờ — Chạy chương trình mục tiêu với các dữ liệu đầu vào được tạo ra, lý tưởng nhất là trong một vòng lặp tự động khởi động lại quy trình sau mỗi lần thất bại.
Bước 5) Giám sát hành vi hệ thống — Hãy chú ý đến các sự cố, treo máy, lỗi xác nhận, sử dụng bộ nhớ quá mức và báo cáo kiểm tra lỗi thay vì chỉ kiểm tra đầu ra được in ra.
Bước 6) Ghi lại lỗi — Lưu lại chính xác dữ liệu đầu vào đã gây ra từng lỗi, thu nhỏ nó xuống trường hợp tái tạo nhỏ nhất và lưu trữ nó cùng với ngăn xếp. tracĐính kèm.
Ví dụ về Fuzzer
Các công cụ kiểm thử lỗi (fuzzer) cũng được phân loại dựa trên cách chúng xây dựng dữ liệu đầu vào, và ba phương pháp dưới đây là những phương pháp bạn sẽ gặp thường xuyên nhất.
- Fuzzers dựa trên đột biến Chỉnh sửa các mẫu dữ liệu hiện có để tạo dữ liệu thử nghiệm mới. Đây là một phương pháp rất đơn giản và trực quan: nó bắt đầu với các mẫu hợp lệ của một giao thức và tiếp tục chỉnh sửa từng byte hoặc từng tệp.
- Fuzzers dựa trên thế hệ Xác định dữ liệu mới dựa trên đầu vào của mô hình. Họ bắt đầu tạo đầu vào từ đầu dựa trên các thông số kỹ thuật.
- Công cụ kiểm thử lỗi dựa trên giao thức Việc này phụ thuộc vào kiến thức chi tiết về định dạng giao thức đang được kiểm thử, và sự hiểu biết đó đến từ bản đặc tả. Nó bao gồm việc ghi một mảng các thông số kỹ thuật vào công cụ, sau đó sử dụng kỹ thuật tạo kiểm thử dựa trên mô hình để xem xét bản đặc tả và thêm các điểm bất thường trong nội dung dữ liệu, trình tự, v.v. Điều này cũng được gọi là kiểm thử cú pháp, kiểm thử ngữ pháp hoặc kiểm thử độ bền. Một công cụ fuzzing có thể tạo ra các trường hợp kiểm thử từ một trường hợp hiện có, hoặc nó có thể sử dụng các đầu vào hợp lệ hoặc không hợp lệ.
Có hai hạn chế của việc làm mờ dựa trên giao thức:
- Việc kiểm tra không thể tiến hành cho đến khi đặc tả hoàn thiện.
- Nhiều giao thức hữu ích là phần mở rộng của các giao thức đã được xuất bản. Nếu việc kiểm tra lông tơ dựa trên các thông số kỹ thuật đã được công bố, Phạm vi kiểm tra đối với các giao thức mới sẽ bị hạn chế.
Kỹ thuật fuzzing đơn giản nhất là gửi dữ liệu đầu vào ngẫu nhiên đến phần mềm, có thể là dưới dạng gói giao thức hoặc sự kiện. Kỹ thuật truyền dữ liệu đầu vào ngẫu nhiên này rất hiệu quả trong việc tìm lỗi ở nhiều ứng dụng và dịch vụ. Ngoài ra còn có các kỹ thuật khác, và chúng rất dễ thực hiện. Để thực hiện các kỹ thuật này, chúng ta chỉ cần thay đổi dữ liệu đầu vào hiện có, và có thể thay đổi dữ liệu đầu vào bằng cách hoán đổi các bit của nó.
Các loại lỗi được phát hiện bởi Fuzz testing
Vì quá trình kiểm thử mờ (fuzzing) đánh giá một lần chạy dựa trên cách chương trình hoạt động chứ không phải dựa trên giá trị mong đợi, nên các lỗi mà nó phát hiện ra được phân thành ba nhóm.
- Lỗi xác nhận và rò rỉ bộ nhớ: Phương pháp này được sử dụng rộng rãi cho các ứng dụng quy mô lớn, nơi các lỗi ảnh hưởng đến tính an toàn của bộ nhớ, đây là một lỗ hổng nghiêm trọng. Buffer Các lỗi như tràn bộ nhớ, sử dụng bộ nhớ sau khi đã giải phóng và đọc ngoài phạm vi bộ nhớ đều xuất hiện ở đây.
- Dữ liệu đầu vào không hợp lệ: Trong kiểm thử mờ (fuzz testing), các công cụ tạo lỗi (fuzzers) được sử dụng để tạo ra dữ liệu đầu vào không hợp lệ, dùng để kiểm tra các quy trình xử lý lỗi, điều này rất quan trọng đối với phần mềm không kiểm soát được dữ liệu đầu vào. Việc tạo lỗi đơn giản có thể được xem như một cách để tự động hóa. thử nghiệm tiêu cực.
- Lỗi chính xác: Kỹ thuật fuzzing cũng có thể được sử dụng để phát hiện một số loại lỗi "đúng đắn", chẳng hạn như cơ sở dữ liệu bị hỏng hoặc kết quả tìm kiếm kém. Fuzzing khác biệt, trong đó cung cấp cùng một đầu vào cho hai hệ thống và so sánh kết quả, là cách thông thường để phát hiện những lỗi này.
Công cụ kiểm tra lông tơ
Các công cụ được sử dụng trong bảo mật web có thể được sử dụng rộng rãi trong kiểm thử mờ (fuzz testing), chẳng hạn như: Burp Suite và Peach Fuzzer. Một số tên kinh điển dưới đây hiện đã được lưu trữ, vì vậy trạng thái hiện tại của chúng được ghi rõ bên cạnh mỗi mục.
- lông tơ đàoPeach Fuzzer cung cấp phạm vi bảo mật mạnh mẽ hơn so với trình quét. Các công cụ kiểm thử khác chỉ có thể tìm kiếm các mối đe dọa đã biết, trong khi Peach Fuzzer cho phép người dùng tìm thấy cả các mối đe dọa đã biết và chưa biết. Peach Tech đã được GitLab mua lại, và Community Edition v3 không còn được duy trì; phiên bản kế nhiệm được duy trì là... GitLab Protocol Fuzzer Community Edition.
- Proxy tăng đột biếnSPIKE Proxy là một công cụ chuyên nghiệp tìm kiếm các lỗ hổng bảo mật cấp ứng dụng trong các ứng dụng web. SPIKE Proxy bao gồm các chức năng cơ bản, chẳng hạn như... SQL Tấn công chèn mã độc và tấn công kịch bản chéo trang (XSS), trên một môi trường hoàn toàn mở. Python cơ sở hạ tầng, và nó có sẵn cho Linux và WindowsNó đã không được bảo trì trong nhiều năm và được đưa vào đây để tham khảo bối cảnh lịch sử.
- Bọ cánh cứng WebScarabWebScarab được viết bằng ngôn ngữ lập trình sau: Java Do đó, nó có thể được sử dụng trên nhiều nền tảng. Khung WebScarab giao tiếp bằng các giao thức HTTP và HTTPS và hoạt động như một proxy chặn: nó cho phép người vận hành xem xét và sửa đổi các yêu cầu do trình duyệt tạo ra trước khi máy chủ nhận được chúng, và xem xét và cập nhật các phản hồi do máy chủ tạo ra trước khi trình duyệt nhận được chúng. Bất kỳ lỗ hổng nào mà WebScarab tìm thấy đều được thêm vào danh sách các vấn đề đã báo cáo. Kho lưu trữ đã được lưu trữ lại vào tháng 4 năm 2024 và hiện chỉ có thể đọc được.
- OWASP WSFuzzerWSFizzer là một chương trình được cấp phép theo giấy phép GPL, được viết bằng tiếng Anh. Python Nó nhắm mục tiêu vào các dịch vụ web, và trong phiên bản cuối cùng của nó, nó dựa trên giao thức HTTP. dịch vụ SOAP là mục tiêu chính. Nó được vận chuyển như một phần của WebScarab và đã bị loại bỏ cùng với nó; OWASP ZAP và tiện ích bổ sung Fuzzer của nó. là sản phẩm thay thế được khuyến nghị.
- Các phương án thay thế được duy trì: AFL++ và libFuzzer là các công cụ hướng dẫn phạm vi phủ sóng tiêu chuẩn cho mã gốc. OSS-Fuzz chạy chúng liên tục và miễn phí cho các dự án mã nguồn mở, và boofuzz bao gồm kỹ thuật kiểm thử mờ giao thức mạng trong PythonMột danh sách đầy đủ hơn được tổng hợp trong hướng dẫn về... công cụ kiểm tra bảo mật.
Các phương pháp thực hành tốt nhất về kiểm thử mờ (Fuzz Testing)
Một công cụ kiểm thử lỗi (fuzzer) được hướng vào mục tiêu và để yên đó hiếm khi tìm thấy nhiều lỗi. Các phương pháp dưới đây phân biệt một chiến dịch tạo ra các lỗi đã được báo cáo với một chiến dịch chỉ tiêu tốn thời gian xử lý của CPU.
- Hãy bắt đầu từ một kho ngữ liệu gốc tốt. Thu thập các dữ liệu đầu vào thực, hợp lệ mà ứng dụng đã chấp nhận. Việc chỉnh sửa một tập tin thực sự sẽ đến được mã phân tích cú pháp nhanh hơn nhiều so với việc chỉnh sửa các byte ngẫu nhiên.
- Viết một bộ dây dẫn nhỏ gọn và nhanh chóng. Điểm khởi đầu chỉ nên thực hiện một tác vụ mỗi lần chạy, tránh các cuộc gọi mạng và ghi dữ liệu vào ổ đĩa, và trả về kết quả nhanh chóng, vì thông lượng được đo bằng số lần thực thi mỗi giây.
- Hãy bật máy khử trùng. Lỗi hỏng bộ nhớ âm thầm thường không gây sập chương trình. AddressSanitizer và UndefinedBehaviorSanitizer sẽ chuyển lỗi này thành một lỗi tức thời, có thể chẩn đoán được.
- Chạy đường dài và chạy liên tục. Một lần chạy từ một đến hai giờ có thể phát hiện các lỗi đơn giản; các lỗi phức tạp hơn thường cần nhiều giờ, đó là lý do tại sao việc kiểm thử bằng fuzzing nên được thực hiện trong một tác vụ CI hàng đêm chứ không phải là một phiên thủ công.
- Giảm thiểu và loại bỏ các lỗi trùng lặp trong mọi sự cố. Thu nhỏ dữ liệu đầu vào bị lỗi về dạng nhỏ nhất và nhóm các sự cố theo ngăn xếp. trace, nếu không thì một lỗi sẽ được gửi đi dưới dạng hàng trăm phiếu báo cáo.
- Hãy duy trì một tập dữ liệu hồi quy. Thêm mỗi đầu vào gây lỗi vào một tập hợp cố định chạy trên mọi bản dựng, để lỗi đã được khắc phục không thể âm thầm tái xuất hiện.
- Xác định phạm vi mục tiêu một cách hợp pháp. Việc tấn công giả mạo một dịch vụ bên thứ ba đang hoạt động mà không có sự cho phép bằng văn bản là không khác gì một cuộc tấn công.
Ưu điểm của kiểm tra Fuzz
Nếu được sử dụng với kỳ vọng thực tế, kỹ thuật làm mờ hậu cảnh (fuzzing) mang lại giá trị mà các kỹ thuật khác khó có thể sánh kịp.
- Kiểm thử mờ (fuzz testing) giúp cải thiện việc kiểm thử bảo mật phần mềm.
- Các lỗi được phát hiện trong quá trình kiểm thử mờ (fuzzing) đôi khi rất nghiêm trọng và thường giống với những lỗi mà kẻ tấn công sử dụng, bao gồm lỗi gây sập hệ thống, rò rỉ bộ nhớ và các ngoại lệ không được xử lý.
- Nếu bất kỳ lỗi nào không được người kiểm thử phát hiện do hạn chế về thời gian và nguồn lực, những lỗi đó cũng sẽ được tìm thấy trong quá trình kiểm thử mờ (fuzz testing).
- Dữ liệu đầu vào được tạo ra tự động bởi máy móc, do đó phạm vi phủ sóng tiếp tục mở rộng qua đêm mà không cần thêm bất kỳ thao tác thủ công nào.
Nhược điểm của kiểm tra Fuzz
Những đặc tính khiến việc tạo hiệu ứng mờ trở nên rẻ tiền cũng chính là những hạn chế mà nó có thể chứng minh được.
- Chỉ riêng việc kiểm thử mờ (fuzz testing) không thể cung cấp bức tranh toàn diện về mối đe dọa an ninh tổng thể hoặc tập hợp các lỗi.
- Kiểm thử mờ (fuzz testing) kém hiệu quả hơn trong việc xử lý các mối đe dọa bảo mật không gây ra sự cố sập chương trình, chẳng hạn như một số loại virus, sâu máy tính và Trojan.
- Kiểm thử mờ (fuzz testing) chỉ có thể phát hiện các lỗi hoặc mối đe dọa tương đối đơn giản và không thể suy luận về logic nghiệp vụ.
- Để hoạt động hiệu quả, cần có thời gian máy móc đáng kể.
- Việc thiết lập điều kiện giá trị biên với các đầu vào ngẫu nhiên rất khó khăn, mặc dù hiện nay các chuyên gia kiểm thử đã giải quyết phần lớn vấn đề này bằng các thuật toán xác định dựa trên đầu vào của người dùng.
Kiểm thử mờ (Fuzz Testing) so với kiểm thử xâm nhập (Penetration Testing)
Cả hai hoạt động đều nhằm tìm kiếm các lỗ hổng bảo mật, nhưng chúng trả lời những câu hỏi khác nhau và hiếm khi có thể thay thế cho nhau.
| Tiêu chí | Kiểm tra lông tơ | Kiểm tra thâm nhập |
| Thúc đẩy bởi | Một công cụ tự động tạo ra dữ liệu đầu vào bị lỗi. | Một người kiểm thử lành nghề suy luận về hệ thống. |
| Tìm kiếm | Sự cố treo máy, lỗi hệ thống và lỗi an toàn bộ nhớ | Các điểm yếu có thể bị khai thác, bao gồm cả lỗi logic và cấu hình. |
| Độ sâu | Phạm vi đầu vào rất rộng, lập luận nông cạn. | Phạm vi bao phủ hẹp, lý luận sâu sắc |
| Đầu ra | Tái tạo đầu vào và ngăn xếp traces | Báo cáo kết quả bao gồm các lộ trình khai thác và xếp hạng rủi ro. |
| Khoảnh khắc tuyệt nhất | Liên tục, trong quy trình xây dựng | Định kỳ, so sánh với ứng viên phát hành. |
Trên thực tế, hai quá trình này hỗ trợ lẫn nhau: kỹ thuật fuzzing loại bỏ các lỗi nhỏ, dễ tự động hóa, nhờ đó người kiểm thử có thể dành nhiều thời gian hơn để phát hiện ra những lỗi mà chỉ con người mới nhận ra.

