Chromium Chronicle #9: ClusterFuzz

エピソード 9: Adrian Taylor によりマウンテン ビュー(2019 年 12 月)
前のエピソード

ClusterFuzz により発見された優先度の高いセキュリティ バグの修正を求められる場合があります。概要: これらのバグを深刻に受け止めるべきですか?どのようにサポートすればよいでしょうか。

ファジングのフローチャート

ClusterFuzz は、入力を Chrome にフィードしてクラッシュを監視します。こうした Chrome ビルドの一部では、メモリ安全性エラーを探す AddressSanitizer など、追加のチェックがオンになっています。

ClusterFuzz はクラッシュの場所に基づいてコンポーネントを割り当て、クラッシュの種類とサンドボックス化されたプロセスでクラッシュが発生したかどうかに基づいて重大度を割り当てます。たとえば、ヒープの use-after-free(解放後の使用)は、重大度が「高」になります。ただし、ブラウザ プロセス内では重大な問題です(影響を制限するサンドボックスがないということです)。

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 はクラッシュを検出すると、入力テストケースを最小化し、不適切な commit を見つけるために bisect を最小化しようとします。たくさんの項目が見つかります...

次のようなサポートを提供できます。

  • オブジェクトの存続期間と整数オーバーフローについて気にしないでください。
  • 特に、信頼できないデータや IPC を処理する場合は、新しいファザーを追加します(以下のリンクを参照してください。多くの場合、コードは 20 行未満です)。
  • ClusterFuzz から報告されたバグを修正します。重大度のヒューリスティックは、現実世界での攻撃性に基づいているため信頼できます1 バイトのオーバーフローであっても、攻撃者による任意のコードの実行につながります。

関連情報