ГраницыДезинфицирующее средство

BoundsSanitizer (BoundSan) добавляет инструментарий к двоичным файлам для вставки проверок границ при доступе к массиву. Эти проверки добавляются, если компилятор не может доказать во время компиляции, что доступ будет безопасным, и если размер массива будет известен во время выполнения, чтобы его можно было проверить. Android 10 развертывает BoundSan в Bluetooth и кодеках. BoundSan предоставляется компилятором и включен по умолчанию в различных компонентах платформы.

Реализация

BoundSan использует дезинфицирующее средство UBSan . Это смягчение включено на уровне каждого модуля. Он помогает защитить важные компоненты Android и не должен отключаться.

Мы настоятельно рекомендуем вам включить BoundSan для дополнительных компонентов. Идеальными кандидатами являются привилегированный собственный код или сложный собственный код, анализирующий ненадежный пользовательский ввод. Накладные расходы на производительность, связанные с включением BoundSan, зависят от количества обращений к массиву, безопасность которых не может быть доказана. Ожидайте в среднем небольшой процент накладных расходов и проверьте, не является ли производительность проблемой.

Включение BoundSan в файлах чертежей

BoundSan можно включить в файлах схемы, добавив "bounds" в свойство misc_undefined sanitize для двоичных и библиотечных модулей:

sanitize: {
   misc_undefined: ["bounds"],
   diag: {
      misc_undefined: ["bounds"],
   },
   blacklist: "modulename_blacklist.txt",

диаг

Свойство diag включает режим диагностики для дезинфицирующих средств. Используйте режим диагностики только во время тестирования. Режим диагностики не прерывается при переполнении, что сводит на нет преимущества безопасности, связанные с устранением проблем, и увеличивает нагрузку на производительность, поэтому его не рекомендуется использовать для производственных сборок.

черный список

Свойство blacklist позволяет указать файл черного списка, который разработчики могут использовать для предотвращения очистки функций и исходных файлов. Используйте это свойство, только если вас беспокоит производительность, а целевые файлы/функции вносят существенный вклад. Вручную проверьте эти файлы/функции, чтобы убедиться, что доступ к массиву безопасен. Дополнительные сведения см. в разделе Устранение неполадок .

Включение BoundSan в make-файлах

BoundSan можно включить в make-файлах, добавив "bounds" в переменную LOCAL_SANITIZE для бинарных и библиотечных модулей:

LOCAL_SANITIZE := bounds
# Optional features
LOCAL_SANITIZE_DIAG := bounds
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt

LOCAL_SANITIZE принимает список дезинфицирующих средств, разделенных запятой.

LOCAL_SANITIZE_DIAG включает режим диагностики. Используйте режим диагностики только во время тестирования. Режим диагностики не прерывается при переполнении, что сводит на нет преимущества безопасности, связанные с устранением проблем, и увеличивает нагрузку на производительность, поэтому его не рекомендуется использовать для производственных сборок.

LOCAL_SANITIZE_BLACKLIST позволяет указать файл черного списка, который позволяет разработчикам предотвращать очистку функций и исходных файлов. Используйте это свойство, только если вас беспокоит производительность, а целевые файлы/функции вносят существенный вклад. Вручную проверьте эти файлы/функции, чтобы убедиться, что доступ к массиву безопасен. Дополнительные сведения см. в разделе Устранение неполадок .

Отключение BoundSan

Вы можете отключить BoundSan в функциях и исходных файлах с помощью черных списков или атрибутов функций. Лучше оставить BoundSan включенным, поэтому отключайте его только в том случае, если функция или файл создают большую нагрузку на производительность, а исходный код проверен вручную.

Дополнительные сведения об отключении BoundSan с помощью атрибутов функций и форматировании файлов черного списка см. в документации Clang LLVM. Ограничьте черный список конкретным дезинфицирующим средством, используя имена разделов, указывающие целевое дезинфицирующее средство, чтобы не влиять на другие дезинфицирующие средства.

Проверка

Специально для BoundSan тестов CTS не существует. Вместо этого убедитесь, что тесты CTS проходят с включенным BoundSan или без него, чтобы убедиться, что это не влияет на устройство.

Поиск проблемы

Тщательно протестируйте компоненты после включения BoundSan, чтобы убедиться, что любые ранее необнаруженные попытки доступа за пределы границ разрешены.

Ошибки BoundSan можно легко идентифицировать, поскольку они включают следующее сообщение о прерывании захоронения:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: out-of-bounds'

При работе в режиме диагностики исходный файл, номер строки и значение индекса выводятся в logcat . По умолчанию в этом режиме не выдается сообщение об отмене. Просмотрите logcat , чтобы проверить наличие ошибок.

external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'