Kronika Chromium nr 9: ClusterFuzz

Odcinek 9: Adrian Taylor w Mountain View (grudzień 2019 r.)
Poprzednie odcinki

Może się okazać, że zostaniesz poproszony o naprawienie szczególnie ważnych błędów w zabezpieczeniach wykrytych przez usługę ClusterFuzz. Co to jest? Czy trzeba traktować te błędy poważnie? Jak możesz pomóc?

Rozmyty schemat blokowy

Przesyłanie danych przez usługę ClusterFuzz do Chrome i sprawdzanie błędów. W niektórych kompilacjach Chrome włączono dodatkowe sprawdzanie, na przykład AddressSanitizer, który szuka błędów związanych z bezpieczeństwem pamięci.

ClusterFuzz przypisuje komponenty na podstawie lokalizacji awarii i przypisuje wagę na podstawie typu awarii oraz tego, czy nastąpiła ona w procesie piaskownicy. Na przykład atak typu „use-after-free” będzie miał wysoki poziom ważności, chyba że występuje w procesie przeglądarki. W takim przypadku kluczowy jest problem (brak piaskownicy, który ogranicza wpływ):

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.

Usługa ClusterFuzz generuje dane wejściowe z fuzzerów lub błędów przesłanych z zewnątrz. Niektóre filtry rozmywające korzystają z technologii libFuzzer, która rozwija dane wejściowe, aby zwiększyć pokrycie kodu. Niektórzy rozumieją gramatykę języka wejściowego przekonwertowanego na protobufs. Gdy usługa ClusterFuzz znajdzie awarię, spróbuje zminimalizować ilość danych wejściowych, a nawet podzielić ją na dwa, aby znaleźć nieprawidłowe zatwierdzenie. Znajduje dużo...

Możesz pomóc:

  • Wyprzedź paranoję w kwestii czasu życia obiektów i przepełniania się liczbami całkowitymi.
  • Dodaj nowe elementy rozmywające, zwłaszcza jeśli przetwarzasz niewiarygodne dane lub IPC (patrz linki poniżej, często poniżej 20 wierszy kodu).
  • Naprawianie błędów zgłaszanych przez ClusterFuzz: heurystyka poziomu ważności jest godna zaufania, ponieważ opierają się na rzeczywistych możliwościach wykorzystania: nawet przepełnienie jednobajtowe kodu doprowadziło do przypadkowego wykonania kodu przez atakującego.

Zasoby