Google Project Zeroのツールを使ったLadybirdのファジング
- Domato は Google Project Zero が開発した DOM ファザーで、大量の、主に有効だが奇妙な HTML、CSS、JavaScript を含む Web ページを生成する。
- 生成された Web ページは約 500 KiB の大きさで、ブラウザーエンジンを驚かせる「興味深い」JS、CSS、HTML で満ちている。
- Domato は主要ブラウザーで多くのバグを発見してきたとされ、これを Ladybird に適用して問題を発見し修正した。
Issue #1: <th> タグが <mfrac> の中にある場合
- Domato が生成した出力から、
<mfrac> の中に <th> を入れる問題を発見した。
- UBSAN(Undefined Behavior SANitizer) を使ってコンパイルした Ladybird で null ポインター参照エラーが発生した。
<th> と <td> 要素は常に DOM ツリー上位に <table> がある前提で実装していたが、JavaScript API を使って DOM ノードを手動で生成する場合はこの規則を破ることができる。
- 問題解決のため、
<th> と <td> 要素が常に <table> を含んでいると仮定せず、first_ancestor_of_type<HTMLTableElement>() を使うよう修正した。
Issue #2: 分離された DOM での window イベントハンドラーの割り当て
- ファザーを実行していると、すぐに別の問題にぶつかった。
DOMParser を通じて生成された文書には window オブジェクトがなく、これが原因で問題が発生した。
Document::window() が nullable な値を返すよう修正し、複数箇所で null 処理を行った。
- window のない文書で
document.body.onblur を割り当てるときは何もしないよう修正した。
Issue #3: SVG <linearGradient> における無限再帰
- SVG では、他のグラデーションを参照して色を継承するグラデーションを宣言できる。
- グラデーションが自分自身を参照するケースを考慮しておらず、無限ループが発生した。
- 参照サイクルが複数段階にわたる場合に対応するため、訪問したすべてのグラデーションを追跡し、すでに訪問したグラデーションに出会ったらチェーンの追跡を中止するようにした。
Issue #4: 削除された iframe の window プロパティーへのアクセス
- iframe が DOM から削除されると、対応するコンテンツ文書はブラウジングコンテキストから切り離される。
- window オブジェクトのプロパティーにアクセスするとき、ブラウジングコンテキストの存在を前提としている HTML 仕様のバグを発見した。
- HTML 仕様に対して issue を起票し、Ladybird では null チェックを追加して問題を解決した。
Issue #5: Element.before() における無限ループ
- ページが読み込まれず、CPU 使用率が 100% のままになった。
before() 実装の誤りにより無限ループが発生した。
node->previous_sibling の代わりに previous_sibling->previous_sibling を通じて兄弟チェーンをたどるよう修正した。
結論
- 1日の間に実際のバグを 5 件発見し、すべて修正した。
- ファザーのようなツールは、ソフトウェアをより堅牢にしたい人にとって驚くほど有用な資源である。
- Ladybird が継続的なファジング入力を処理できるほど安定すれば、クラウド上で自動実行してさらに多くの問題を発見できるだろう。
GN⁺の意見
- この記事は、Ladybird ブラウザーエンジンが Google Project Zero の Domato ファザーを使って発見したバグを修正する過程を説明している。
- ファジングはソフトウェアのセキュリティ脆弱性を発見するうえで非常に効果的な技術であり、開発者は自分のコードをより堅牢にするために活用できる。
- この記事は開発者にファジングの重要性を再認識させ、実際にどのように適用されるかについての洞察を提供している。
- 批判的に見ると、ファジングは予期しない入力に対するソフトウェアの反応をテストするものであり、実際のユーザーの利用パターンを完全に反映するとは限らない。
- 類似の機能を提供する他のファジングツールとしては、AFL(American Fuzzy Lop) や LibFuzzer などがあり、開発者はこれらのツールを使って自分のプロジェクトをテストできる。
- Ladybird 開発者はこの技術を導入することで、発見されたバグを修正してブラウザーの安定性を向上させられ、これはユーザー体験の改善とセキュリティ強化に役立つだろう.
1件のコメント
Hacker Newsの意見
複数の実装によって仕様の価値が証明される
小規模なグループでも驚くべきものを作れる可能性
SVG実装によるプロジェクトの急速な進展への驚き
ソフトウェア開発において問題解決へ深く踏み込む必要性
LadybirdのWebエンジンHackfest参加有無への関心
ハッキング関連YouTube動画の不在への疑問
"fuzzing ladybird"という語の組み合わせへの面白い反応
Ladybirdが世界を征服してほしいと密かに願う
[削除されたコメント]