Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

HWAddressSanitizer

AddressSanitizer hỗ trợ phần cứng (HWASan) là một công cụ phát hiện lỗi bộ nhớ tương tự như AddressSanitizer . HWASan sử dụng ít RAM hơn rất nhiều so với ASan, điều này làm cho nó phù hợp để làm sạch toàn bộ hệ thống. HWASan chỉ khả dụng trên Android 10 trở lên và chỉ trên phần cứng AArch64.

Mặc dù chủ yếu hữu ích cho mã C / C ++, HWASan cũng có thể giúp gỡ lỗi mã Java gây ra sự cố trong C / C ++ được sử dụng để triển khai giao diện Java. Nó hữu ích vì nó bắt lỗi bộ nhớ khi chúng xảy ra, chỉ bạn trực tiếp vào mã chịu trách nhiệm.

Bạn có thể flash hình ảnh HWASan dựng sẵn sang các thiết bị Pixel được hỗ trợ từ ci.android.com ( hướng dẫn thiết lập chi tiết ).

So với ASan cổ điển, HWASan có:

  • Chi phí CPU tương tự (~ 2x)
  • Chi phí kích thước mã tương tự (40 - 50%)
  • Chi phí RAM nhỏ hơn nhiều (10% - 35%)

HWASan phát hiện cùng một nhóm lỗi như ASan:

  • Tràn / tràn bộ đệm ngăn xếp và heap
  • Sử dụng hàng đống sau khi miễn phí
  • Ngăn xếp sử dụng bên ngoài phạm vi
  • Nhân đôi miễn phí / hoang dã miễn phí

Ngoài ra, HWASan phát hiện việc sử dụng ngăn xếp sau khi trả về.

Chi tiết và giới hạn triển khai

HWASan dựa trên phương pháp gắn thẻ bộ nhớ , trong đó một giá trị thẻ ngẫu nhiên nhỏ được liên kết với cả con trỏ và với phạm vi địa chỉ bộ nhớ. Để một quyền truy cập bộ nhớ hợp lệ, con trỏ và thẻ nhớ phải khớp với nhau. HWASan dựa vào tính năng bỏ qua byte hàng đầu (TBI) của ARMv8, còn được gọi là gắn thẻ địa chỉ ảo , để lưu trữ thẻ con trỏ ở các bit cao nhất của địa chỉ.

Bạn có thể đọc thêm về thiết kế của HWASan trên trang web tài liệu của Clang.

Theo thiết kế, HWASan không có vùng đỏ kích thước giới hạn của ASan để phát hiện lỗi tràn hoặc vùng cách ly dung lượng hạn chế của ASan để phát hiện việc sử dụng sau khi miễn phí. Vì lý do này, HWASan có thể phát hiện ra một lỗi bất kể mức độ tràn lớn như thế nào hoặc bộ nhớ đã được phân bổ cách đây bao lâu. Điều này mang lại cho HWASan một lợi thế lớn so với ASan.

Tuy nhiên, HWASan có một số giới hạn các giá trị thẻ có thể có (256), có nghĩa là có 0,4% xác suất bỏ sót bất kỳ lỗi nào trong một lần thực thi chương trình.

Yêu cầu

HWASan yêu cầu nhân Linux chấp nhận các con trỏ được gắn thẻ trong các đối số gọi hệ thống. Hỗ trợ cho điều này đã được triển khai trong các bản vá ngược dòng sau:

Các bản vá lỗi này có sẵn dưới dạng cổng hỗ trợ trong nhân Android phổ biến trong các nhánh android-4.14 trở lên, nhưng không có trong các nhánh dành riêng cho Android 10 như android-4.14-q .

Hỗ trợ không gian người dùng cho HWASan bắt đầu với Android 11 .

Nếu bạn đang xây dựng với chuỗi công cụ tùy chỉnh, hãy đảm bảo rằng nó bao gồm mọi thứ tối đa LLVM commit c336557f .

Sử dụng HWASan

Sử dụng các lệnh sau để xây dựng toàn bộ nền tảng bằng HWASan:

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

Để thuận tiện, bạn có thể thêm cài đặt SANITIZE_TARGET vào định nghĩa sản phẩm, tương tự như aosp_coral_hwasan .

Không giống như ASan, với HWASan không cần phải xây dựng hai lần. Các bản dựng tăng dần chỉ hoạt động, không có hướng dẫn nhấp nháy đặc biệt hoặc yêu cầu xóa, các tệp thực thi tĩnh được hỗ trợ và bạn có thể bỏ qua quá trình khử trùng của bất kỳ thư viện nào ngoài libc . Cũng không có yêu cầu nào rằng nếu một thư viện được khử trùng, thì bất kỳ tệp thực thi nào liên kết đến nó cũng phải được khử trùng.

Để bỏ qua quá trình làm sạch mô-đun, hãy sử dụng LOCAL_NOSANITIZE := hwaddress hoặc sanitize: { hwaddress: false } .

Các mô-đun riêng lẻ có thể được làm sạch bằng HWASan, với cảnh báo rằng libc cũng là HWASan-ified. Điều này có thể được thực hiện bằng cách thêm sanitize: { hwaddress: true } vào định nghĩa mô-đun Android.bp tương ứng. Toàn bộ nền tảng Android được xây dựng bằng HWASan khi sử dụng bản dựng _hwasan -suffixed (bao gồm libc ) và do đó, việc khử trùng libc theo cách thủ công là không cần thiết cho các bản dựng HWASan.

Dấu vết ngăn xếp tốt hơn

HWASan sử dụng trình giải nén nhanh, dựa trên con trỏ khung để ghi lại dấu vết ngăn xếp cho mọi sự kiện phân bổ và phân bổ bộ nhớ trong chương trình. Android cho phép con trỏ khung ở mã AArch64 theo mặc định, vì vậy điều này hoạt động hiệu quả trong thực tế. Nếu bạn cần thư giãn thông qua mã được quản lý, hãy đặt HWASAN_OPTIONS=fast_unwind_on_malloc=0 trong môi trường quy trình. Lưu ý rằng dấu vết ngăn xếp truy cập bộ nhớ kém sử dụng trình giải nén "chậm" theo mặc định; cài đặt này chỉ ảnh hưởng đến các dấu vết phân bổ và phân bổ. Tùy chọn này có thể rất tốn CPU, tùy thuộc vào tải.

Biểu tượng hóa

Xem Biểu tượng trong tài liệu ASan.

HWASan trong ứng dụng

Tương tự như AddressSanitizer, HWASan không thể nhìn thấy mã Java, nhưng nó có thể phát hiện lỗi trong thư viện JNI. Không giống như ASan, việc chạy ứng dụng HWASan trên thiết bị không phải HWASan không được hỗ trợ.

Trên thiết bị HWASan, bạn có thể kiểm tra các ứng dụng bằng HWASan bằng cách tạo mã của chúng với SANITIZE_TARGET:=hwaddress in Make hoặc -fsanitize=hwaddress trong compiler flags. Xem tài liệu dành cho nhà phát triển ứng dụng để biết thêm chi tiết.