Хроники Chromium #9: ClusterFuzz

Эпизод 9: Адриан Тейлор в Маунтин-Вью (декабрь 2019 г.)
Предыдущие серии

Вы можете обнаружить, что вас просят исправить высокоприоритетные ошибки безопасности, обнаруженные ClusterFuzz. Что это такое? Стоит ли относиться к этим ошибкам серьезно? Как вы можете помочь?

Блок-схема фаззинга

ClusterFuzz передает входные данные в Chrome и отслеживает сбои. В некоторых из этих сборок Chrome включены дополнительные проверки, например AddressSanitizer , который ищет ошибки безопасности памяти.

ClusterFuzz назначает компоненты в зависимости от места сбоя и назначает серьезность в зависимости от типа сбоя и того, произошло ли оно в изолированном процессе . Например, использование кучи после освобождения будет иметь высокий уровень серьезности, если только оно не находится в процессе браузера, и в этом случае это критично (нет песочницы, чтобы ограничить влияние!):

class Foo {
  Widget* widget;
};

void Foo::Bar() {
  delete widget;
  ...
  widget->Activate();  // Bad in the renderer process, worse in the
                       // browser process. Obviously, real bugs are
                       // more subtle. Usually.

ClusterFuzz генерирует входные данные от фаззеров или ошибок, отправленных извне. Некоторые фаззеры работают на libFuzzer , который развивает входные данные для увеличения покрытия кода. Некоторые понимают грамматику входного языка, преобразованную в protobufs . Как только ClusterFuzz обнаружит сбой, он попытается свести к минимуму входной тестовый пример и даже разделить его пополам, чтобы найти вызывающий ошибку коммит . Он находит много...

Вы можете помочь:

  • Будьте параноиком в отношении времени жизни объектов и целочисленных переполнений.
  • Добавляйте новые фаззеры, особенно когда вы обрабатываете ненадежные данные или IPC (см. ссылки ниже, часто <20 строк кода).
  • Исправьте ошибки, о которых сообщил ClusterFuzz: эвристике серьезности можно доверять, поскольку они основаны на реальных возможностях использования : даже переполнение одного байта приводило к выполнению злоумышленником произвольного кода.

Ресурсы