Tập 63: Fuzz — Máy biết hỏi những câu ta không nghĩ ra

Khi viết test thủ công, bộ óc con người có một thiên kiến tự nhiên: chúng ta có xu hướng viết các đoạn mã "hợp lý" (ngay cả khi đó là test reject). Chúng ta viết code theo đúng logic mà chúng ta đã lập trình trong parser.

Máy fuzzing thì không có sự lịch sự đó. Nó không quan tâm đến logic hay ý định của bạn. Nó chỉ quan tâm đến việc tìm ra kẽ hở bằng các đòn tấn công mù quáng.

Sprint 108 giới thiệu Parser Fuzz V0. Chúng tôi viết một generator sinh ra hàng triệu chuỗi ký tự hỗn loạn (cả hợp lệ và dị dạng) rồi ném vào parser của DUY. Đồng thời, thiết lập một reducer để khi máy tìm thấy một chuỗi làm parser bị crash (ví dụ: tràn stack do đệ quy vô hạn trong ngoặc lồng nhau), nó tự động cắt tỉa chuỗi đó về dạng ngắn nhất có thể tái hiện lỗi.

Fuzzer lập tức tát vào mặt trình biên dịch trẻ. Ngay trong 10 phút chạy đầu tiên, nó đã tìm ra một chuỗi token quái dị làm resolver rơi vào vòng lặp vô hạn, hoặc parser ném ra lỗi out-of-memory. Đó là chuỗi chỉ gồm các dấu mở ngoặc nhọn lồng nhau {{{{...}}}} lặp lại 10.000 lần. Parser của tôi do sử dụng đệ quy sâu không kiểm soát đã làm tràn stack của hệ điều hành và crash lập tức.

Những lỗi này con người gần như không bao giờ nghĩ ra khi viết test suite, nhưng chúng chắc chắn sẽ xảy ra khi người dùng gõ nhầm trên bàn phím. Vượt qua cuộc kiểm tra fuzzing trên corpus mục tiêu mà không bị crash là tấm bằng chứng nhận đầu tiên cho thấy parser của DUY đã đủ cứng cáp để đối mặt với thế giới thực tế đầy hỗn loạn bên ngoài.


Bình luận (0)

Đang tải bình luận...