Chromium Chronicle #8: GWP-ASan: Phát hiện lỗi trong tự nhiên

Tập 8: của Vlad Tsyrklevich ở Seattle, Washington (tháng 11 năm 2019)
Các tập trước

Việc gỡ lỗi an toàn bộ nhớ (chẳng hạn như use-after-frees hoặc buffer overflow) có thể gặp khó khăn. Các công cụ như AddressSanitizer (ASan) rất hữu ích trong việc xác định lỗi bộ nhớ trong các bài kiểm thử đơn vị và trình kiểm thử mờ, nhưng nhiều lỗi chỉ xuất hiện sau khi triển khai cho những người dùng mà chi phí của ASan quá cao.

GWP-ASan là một trình phát hiện lỗi bộ nhớ chỉ vùng nhớ khối xếp được thiết kế để sử dụng trong tự nhiên. Tính năng này phát hiện các vùng đệm được sử dụng sau khi giải phóng, tràn/tràn bộ đệm và giải phóng gấp đôi. Không giống như ASan, tuỳ chọn này không phát hiện lỗi trên ngăn xếp hoặc trong toàn cục.

Bằng cách lấy mẫu một tỷ lệ nhỏ lượt phân bổ, GWP-ASan có thể cung cấp khả năng phát hiện lỗi xác suất với mức hao tổn hiệu suất và bộ nhớ không đáng kể. GWP-ASan sẽ khiến quá trình này gặp sự cố ngay lập tức khi xảy ra lỗi bộ nhớ với một cơ chế phân bổ được lấy mẫu. Điều này giúp bạn dễ dàng phát hiện lỗi hơn khi sự cố xảy ra ngay tại nơi xảy ra lỗi thay vì vào một thời điểm sau đó khi sử dụng bộ nhớ bị hỏng.

Giống như ASan, báo cáo sự cố GWP-ASan bao gồm cả dấu vết ngăn xếp phân bổ và giải phóng để giúp khắc phục các vấn đề về bộ nhớ. Hãy cùng xem ví dụ (crbug/956230) về một số dữ liệu bổ sung được trình bày trong giao diện người dùng về sự cố:

Việc sử dụng và phân bổ đều bắt nguồn từ PDFiumEngine::ExtendSelection(). Nguồn này nhanh chóng cho thấy lỗi là việc sử dụng một trình lặp std::vector không hợp lệ.

GWP-ASan được bật trên kênh chính thức cho các lượt phân bổ được thực hiện bằng malloc/newPartitionAlloc trên Windows và macOS. Đang hỗ trợ Android. Cho đến nay, có hơn 60 lỗi GWP-ASan đã được báo cáo và khoảng 70% lỗi đã được khắc phục. Sự cố GWP-ASan đều là các sự cố bảo mật có thể khai thác. Vì vậy, hãy nhanh chóng phân loại các sự cố đó và yêu cầu điều chỉnh cho phiên bản cũ khi cần.