Chromium Chronicle #8: GWP-ASan: 野生のバグを検出する

エピソード 8: Vlad Tsyrklevich、ワシントン州シアトル(2019 年 11 月)
以前のエピソード

use-after-frees やバッファ オーバーフローなど、メモリ安全性エラーのデバッグは困難な場合があります。AddressSanitizer(ASan)などのツールは、単体テストやファザーでメモリエラーを特定するのに役立ちますが、多くのバグは ASan のオーバーヘッドが非常に大きいユーザーへのデプロイ後に現れます。

GWP-ASan は、実際の環境で使用するように設計されたヒープ専用メモリエラー検出器です。use-after-frees、バッファのオーバーフロー/アンダーフロー、二重解放を検出します。ASan とは異なり、スタックやグローバルのエラーは検出されません。

GWP-ASan では、割り当てのごく一部をサンプリングして、メモリとパフォーマンスのオーバーヘッドをほとんど抑えつつ、確率的なエラー検出を実現できます。サンプリングされた割り当てでメモリエラーが発生すると、GWP-ASan は直ちにプロセスをクラッシュさせます。これにより、後で破損したメモリが使用された場合ではなく、エラーが発生した直後にクラッシュするため、バグを見つけやすくなります。

ASan と同様に、GWP-ASan クラッシュ レポートには割り当てと割り当て解除のスタック トレースが含まれ、メモリの問題のデバッグに役立ちます。クラッシュ UI に表示される追加データの一部の例(crbug/956230)を見てみましょう。

使用と割り当て解除はどちらも PDFiumEngine::ExtendSelection() で開始されます。このソースでは、バグが無効な std::vector イテレータを使用していることがすぐにわかります。

Windows と macOS では、GWP-ASan は Stable チャンネルで malloc/newPartitionAlloc を使用して行われた割り当てに対して有効になっています。Android のサポートは進行中です。これまでに 60 件以上の GWP-ASan のバグが報告されており、約 70% は修正されています。GWP-ASan のクラッシュはすべて、悪用される可能性があるセキュリティ上の問題候補です。速やかに優先順位を付け、必要に応じてバックポートをリクエストしてください。