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.

Scudo

Scudo là trình cấp phát bộ nhớ ở chế độ người dùng động, hoặc trình cấp phát heap , được thiết kế để có khả năng phục hồi chống lại các lỗ hổng liên quan đến heap (chẳng hạn như tràn bộ đệm dựa trên heap , sử dụng sau khi miễn phímiễn phí gấp đôi ) trong khi duy trì hiệu suất. Nó cung cấp các nguyên thủy phân bổ và định vị thỏa thuận C tiêu chuẩn (chẳng hạn như malloc và miễn phí), cũng như các nguyên thủy C ++ (chẳng hạn như mới và xóa).

Scudo là một công cụ giảm thiểu hơn là một công cụ phát hiện lỗi bộ nhớ chính thức như AddressSanitizer (ASan) .

Bắt đầu từ bản phát hành Android 11, scudo được sử dụng cho tất cả mã gốc (ngoại trừ trên các thiết bị có bộ nhớ thấp, nơi jemalloc vẫn được sử dụng). Trong thời gian chạy, tất cả phân bổ heap gốc và phân bổ giao dịch đều được Scudo phục vụ cho tất cả các tệp thực thi và các phụ thuộc thư viện của chúng, và quá trình này sẽ bị hủy bỏ nếu phát hiện ra lỗi hoặc hành vi đáng ngờ trong heap.

Trong Android 10, scudo phải được bật trên cơ sở mỗi nhị phân bằng cách đặt tùy chọn LOCAL_SANITIZE := scudo trong tệp .mk hoặc sanitize: { scudo: true, } trong tệp .bp.

Scudo là mã nguồn mở và là một phần của dự án trình biên dịch của LLVM. Tài liệu hiện có tại https://llvm.org/docs/ScudoHardenedAllocator.html . Thời gian chạy Scudo vận chuyển như một phần của chuỗi công cụ Android và hỗ trợ đã được thêm vào Soong and Make để cho phép dễ dàng kích hoạt trình phân bổ trong một tệp nhị phân.

Bạn có thể bật hoặc tắt tính năng giảm thiểu bổ sung trong trình phân bổ bằng cách sử dụng các tùy chọn được mô tả bên dưới.

Tùy biến

Một số tham số của trình phân bổ có thể được xác định trên cơ sở từng quy trình thông qua một số cách:

  • Statically : Xác định hàm __scudo_default_options trong chương trình trả về chuỗi tùy chọn được phân tích cú pháp. Hàm này phải có nguyên mẫu sau: extern "C" const char *__scudo_default_options() .
  • Động: Sử dụng biến môi trường SCUDO_OPTIONS chứa chuỗi tùy chọn được phân tích cú pháp. Các tùy chọn được xác định theo cách này sẽ ghi đè lên bất kỳ định nghĩa nào được thực hiện thông qua __scudo_default_options .

Lựa chọn tiếp theo đã khả thi.

Lựa chọn Mặc định 64-bit 32-bit mặc định Sự miêu tả
QuarantineSizeKb 256 64 Kích thước (tính bằng KB) của vùng cách ly được sử dụng để trì hoãn việc phân bổ các khối thực tế. Giá trị thấp hơn có thể làm giảm mức sử dụng bộ nhớ nhưng làm giảm hiệu quả của việc giảm thiểu; giá trị âm sẽ trở lại giá trị mặc định. Đặt cả cái này và ThreadLocalQuarantineSizeKb thành 0 sẽ vô hiệu hóa hoàn toàn vùng cách ly.
QuarantineChunksUpToSize 2048 512 Kích thước (tính bằng byte) mà các phần có thể được cách ly.
ThreadLocalQuarantineSizeKb 64 16 Kích thước (tính bằng KB) của bộ đệm mỗi luồng sử dụng để giảm tải vùng cách ly chung. Giá trị thấp hơn có thể làm giảm mức sử dụng bộ nhớ nhưng có thể làm tăng tranh chấp về vùng cách ly toàn cầu. Đặt cả this và QuarantineSizeKb thành 0 sẽ vô hiệu hóa hoàn toàn vùng cách ly.
DeallocationTypeMismatch false false Cho phép báo cáo lỗi về malloc / delete, new / free, new / delete []
DeleteSizeMismatch true true Cho phép báo cáo lỗi về sự không khớp giữa các kích thước mới và xóa.
ZeroContents false false Cho phép không có nội dung chunk trên phân bổ và phân bổ giao dịch.
allocator_may_return_null false false Chỉ định rằng trình cấp phát có thể trả về null khi xảy ra lỗi có thể khôi phục, thay vì kết thúc quá trình.
hard_rss_limit_mb 0 0 Khi RSS của quy trình đạt đến giới hạn này, quy trình sẽ kết thúc.
soft_rss_limit_mb 0 0 Khi RSS của quy trình đạt đến giới hạn này, các phân bổ tiếp theo không thành công hoặc trả về null (tùy thuộc vào giá trị của allocator_may_return_null ), cho đến khi RSS hoạt động trở lại để cho phép cấp phát mới.
allocator_release_to_os_interval_ms N / A 5000 Chỉ ảnh hưởng đến bộ cấp phát 64-bit. Nếu được đặt, hãy cố gắng giải phóng bộ nhớ không sử dụng cho Hệ điều hành, nhưng không thường xuyên hơn khoảng thời gian này (tính bằng mili giây). Nếu giá trị âm, bộ nhớ không được giải phóng cho hệ điều hành.
abort_on_error true true Nếu được đặt, công cụ sẽ gọi abort() thay vì _exit() sau khi in thông báo lỗi.

Thẩm định

Hiện tại, không có bài kiểm tra CTS nào dành riêng cho Scudo. Thay vào đó, hãy đảm bảo rằng các bài kiểm tra CTS vượt qua khi có hoặc không bật Scudo cho một tệp nhị phân nhất định để xác minh rằng nó không ảnh hưởng đến thiết bị.

Xử lý sự cố

Nếu vấn đề không thể khôi phục được phát hiện, bộ cấp phát sẽ hiển thị thông báo lỗi cho bộ mô tả lỗi chuẩn và sau đó kết thúc quá trình. Dấu vết ngăn xếp dẫn đến kết thúc được thêm vào nhật ký hệ thống. Đầu ra thường bắt đầu bằng Scudo ERROR: tiếp theo là một bản tóm tắt ngắn về vấn đề cùng với bất kỳ con trỏ nào.

Dưới đây là danh sách các thông báo lỗi hiện tại và nguyên nhân tiềm ẩn của chúng:

  • corrupted chunk header : Xác minh tổng kiểm tra của tiêu đề chunk không thành công. Điều này có thể do một trong hai điều: tiêu đề đã bị ghi đè (một phần hoặc toàn bộ), hoặc con trỏ được chuyển đến hàm không phải là một đoạn.
  • race on chunk header : Hai luồng khác nhau đang cố gắng thao túng cùng một tiêu đề tại cùng một thời điểm. Đây thường là triệu chứng của tình trạng cuộc đua hoặc thiếu khóa nói chung khi thực hiện các hoạt động trên đoạn đó.
  • invalid chunk state : Chunk không ở trạng thái mong đợi cho một hoạt động nhất định, ví dụ: nó không được cấp phát khi cố gắng giải phóng nó hoặc nó không bị cách ly khi cố gắng tái chế nó. Miễn phí kép là lý do điển hình cho lỗi này.
  • misaligned pointer : Các yêu cầu căn chỉnh cơ bản được thực thi mạnh mẽ: 8 byte trên nền 32 bit và 16 byte trên nền 64 bit. Nếu một con trỏ được chuyển đến các hàm của chúng ta không phù hợp với những hàm đó, thì con trỏ được chuyển đến một trong các hàm sẽ bị lệch.
  • allocation type mismatch : Khi tùy chọn này được bật, một hàm phân bổ được gọi trên một đoạn phân bổ phải khớp với loại hàm đã được gọi để cấp phát nó. Loại không phù hợp này có thể gây ra các vấn đề bảo mật.
  • invalid sized delete : Khi toán tử xóa có kích thước C ++ 14 được sử dụng và kiểm tra tùy chọn được bật, sẽ có sự không khớp giữa kích thước đã được chuyển khi phân bổ một đoạn và kích thước được yêu cầu khi phân bổ nó. Đây thường là sự cố trình biên dịch hoặc nhầm lẫn kiểu trên đối tượng được phân bổ.
  • Đã RSS limit exhausted : Đã vượt quá giới hạn RSS tối đa được chỉ định theo tùy chọn.

Nếu bạn đang gỡ lỗi sự cố trong chính hệ điều hành, bạn có thể sử dụng bản dựng hệ điều hành HWASan . Nếu bạn đang gỡ lỗi sự cố trong một ứng dụng, bạn cũng có thể sử dụng bản dựng ứng dụng HWASan .