アプリケーションセキュリティ
ファジング(Fuzz Testing)
別称: Fuzzing
定義
プログラムに大量の不正・ランダム・想定外な入力を与え、クラッシュ・メモリ破壊・セキュリティ脆弱性を自動的に発見するテスト手法。
ファジング(fuzzing)は、関数・パーサ・プロトコル・アプリケーション全体などの対象に変異・生成入力を大量に投入し、クラッシュ、ハング、アサーション違反、サニタイザのレポートを監視します。目的は、境界外アクセス、解放後使用、無限ループ、未処理例外、論理エラーなど、安全性を破る入力を見つけることです。AFL++、libFuzzer、Jazzer、Atheris などの最新ファザーはカバレッジフィードバックにより、新たなコードパスに到達する入力を進化させるため、パーサ・デコーダ・暗号コードに対して特に効果的です。Google の OSS-Fuzz や Microsoft の SDL の中核としてファジングは活用され、影響度の大きな CVE を多数発見しています。
例
- OSS-Fuzz が OpenSSL のパーサに対し libFuzzer を常時実行し、メモリ破壊を発見する。
- Jazzer で Java の JSON パーサをファジングし、深くネストした入力による DoS を発見する。
関連用語
ミューテーションファジング
正常な既存サンプルを、ビット反転・バイト挿入・ファイルの結合などでランダムに変異させて新たな入力を作るファジング戦略。
カバレッジガイド付きファジング
ターゲットを計装してコードカバレッジを測定し、未踏のパスに到達する入力を進化させることで、バグ発見効率を大幅に高めるファジング手法。
シンボリック実行
具体的な値ではなく記号値を入力としてプログラムを実行し、各パスの制約を SMT ソルバで解いて欠陥を発見するプログラム解析手法。
DAST(動的アプリケーションセキュリティテスト)
稼働中のアプリケーションにネットワーク経由でアクセスして行うブラックボックス型のセキュリティテストで、ランタイムでのみ現れる脆弱性を検出する。
バッファオーバーフロー
メモリ安全性の欠陥で、確保済みバッファの末尾を超えて書き込みが行われ、隣接メモリが破壊されてしばしばコード実行を可能にする。
Secure Coding
Secure Coding — definition coming soon.