web-dev-qa-db-ja.com

デスクトップアプリを馬鹿にすることで、どのようなバグが見つかりますか?

私はファジングについて学び始めたばかりで、pdfファイル内のいくつかのランダムなバイトをランダムな値に変更し、それを開いて、Acrobat Readerがクラッシュしたかどうかを検出するダムファザーを作成しました。このような方法を使用すると、どのような種類のバグが見つかるでしょうか?

ダムファザーがフォーマット文字列パラメーターを適切な場所に挿入した場合に、フォーマット文字列の脆弱性が見つかると思います。また、整数オーバーフローが見つかったと想定しています。しかし、他に何が見つかりますか?

バッファオーバーフローを見つけることは可能ですか?変更するランダムバイトはほんの数バイトなので、バッファがオーバーフローする可能性は実際には小さいか、まったくないものと想定しています。それとも私は間違っていますか?

5
stanko

ダムファジング

私はファジングについて学び始めたばかりで、pdfファイル内のいくつかのランダムなバイトをランダムな値に変更し、それを開いて、Acrobat Readerがクラッシュしたかどうかを検出するダムファザーを作成しました。このような方法を使用すると、どのような種類のバグが見つかるでしょうか?

なし。このような「ばかげた」ファジングでは、報道範囲が信じられないほど限られています。入力の数バイトがランダムに変更されたという理由だけで、そのアプリケーションが実際にクラッシュした場合、私は非常に驚きます。これは、ファザーが毎秒数百万のサンプルを試行していた場合でも当てはまります。ただし、ファザーが開き、クラッシュするかどうかを確認することもできます。これは何を取得するだけです、数回は1秒を試みますか?数秒ごとに試しますか?それだけの価値はありません。

方法 プロのファザーの一部 はプロセスを生成し、ターゲットデータを解析する直前にメモリ状態を一時停止し(ブートストラップ状態をスキップするため)、その後再開します。数十ミリ秒以内にクラッシュしない場合は、以前の一時停止状態に戻します。これにより、毎秒数百回の速度で最速、または数万回の速度で最速でファジングできます。

ダムファザーがフォーマット文字列パラメーターを適切な場所に挿入した場合に、フォーマット文字列の脆弱性が見つかると思います。また、整数オーバーフローが見つかったと想定しています。しかし、他に何が見つかりますか?

これは、パーサーの動作方法によって異なります。 Acrobat Readerのソースコードがないと、この質問に答えることさえできませんでした。バッファオーバーフロー、文字列形式の脆弱性、整数オーバーフロー、論理エラーなどがすべて発生する可能性があります。また、入力の一部がチェックサムや複雑なマジックナンバーで保護されたり、圧縮されたりする可能性があるため、すべての脆弱性を簡単に発見できるとは限らないことにも注意してください。

単純なチェックサムで保護されたフィールドがあるとします。 randomの変更によって衝突が発生する可能性は非常に低くなります。これは、チェックサムが設計されているためであり、その結果、脆弱なコードパスが使用されることはありません。ただし、実際のエクスプロイトは、チェックサムが有効であることを確認するだけです。これは、新規ユーザーがrar形式をファジングする際の一般的な問題です。ファイル全体がチェックサムで覆われているため、誰かがどれほど単純なファジングを行っても、クラッシュすることはありません。チェックサムコードを削除すると、バグが多く、クラッシュしやすくなります。この問題を回避するには、形式を理解し、チェックサムコードを削除するか、入力が常に正しいチェックサムを使用するようにする必要があります。

バッファオーバーフローを見つけることは可能ですか?変更するランダムバイトはほんの数バイトなので、バッファがオーバーフローする可能性は実際には小さいか、まったくないものと想定しています。それとも私は間違っていますか?

最終的にバッファのサイズを指定する値を変更した場合、バッファのサイズを変更しなくても、オーバーフローが発生する可能性があります。たとえば、架空のメモリの内容here is some text17。これは、バッファhere is some text、サイズ、17。サイズが小さくなるようにサイズを変更する順列は、処理されるとバッファがオーバーフローする原因になります。現在、Acrobat Readerにこれほど明白なものがある可能性は低いですが、バグにより仮想的に同様の結果が内部で発生する可能性があります。私はいくつかの可能性を想像することができました。

インテリジェントなファジング

プロのファザーは、プログラムにランダムな入力を投げて、クラッシュするかどうかを確認するだけではありません。それらは、ターゲットの動作に変化をもたらす可能性が高い 特定の方法 で入力を変更します。プログラムは、各ブランチで内部状態をファザーに報告させる特別なコードを挿入してコンパイルされます。これにより、外部動作が変化しなくても、ファザーは特定の入力が異なるコードパスを取得したことを知ることができます。これは、最も一般的な汎用ファザーの1つである [〜#〜] afl [〜#〜] で使用される手法です。それは、入力を供給しているときにJPEGデコーダーの状態を調べるだけで、 薄い空気から有効なJPEGファイルを作成する に十分にインテリジェントです。

実際のバグを見つけるファザーを作成するには、AFLのようなバイナリインストルメンテーションを使用して 自動的にフォーマットを分析する か、アプリケーション固有のフォーマットを認識したファザー(つまり、PDF形式の詳細を深く認識しており、per-syntaxキーワードベースではなく、順列を作成できるaバイト単位)。

2
forest

Adobe PDF形式はかなり複雑であるため、このアプローチがこのスコープの脆弱性を見つけるのに役立つとは思いません。妥当な量で適切なコードカバレッジを達成することはほとんどありません。時間の。

代わりに、PDF形式の 参照 とAdobe拡張機能を確認し、興味深いと思われる特定のパーツのテストの作成を開始します(これにより、仕様につながる場合があります)埋め込み可能な他のファイル形式の例です。)特定の実装の詳細に焦点を当てれば、バイトフリッピングをうまく処理できます。

1
Noir