ビギナー
概要¶
Mayhem を使用したテストの最初のレッスンにようこそ。このレッスンでは、Mayhem の利点や、Mayhem がどのようにファジングを使用してコードをテストするかという基礎原理など、Mayhem の概要を説明します。
学習時間の目安: 10 分
このレッスンを終了すると、以下のことができるようになります。
- なぜ Mayhem を使用してコードをテストするべきかを述べる。
- Mayhem とは何かを述べる。
- ファジングの仕組みを理解する。
- Mayhem がどのようにターゲットをテストするかを説明する。
- Mayhem を使い始める方法を説明する。
コードのテストに Mayhem を使用する利点¶
現在、アプリケーションのセキュリティ確保は、かつてなく重要な課題となっています。適切なアプリケーション セキュリティ テストを実施していない場合、コードの脆弱性が公開され、ハッカーに弱点を悪用する機会を与え、アプリケーションの完全性およびデータが侵害される可能性があります。
従来のアプリケーション セキュリティ テストの手法は、時間がかかり、多くの手作業を必要としたため、企業や開発チームにオーバーヘッド コストの増加をもたらしました。一方、Mayhem が提供するソリューションは、セキュアかつ信頼性の高いソフトウェアをより高い精度と効率性、費用対効果でデリバリーすることを可能にします。Mayhem は先進的なファズ テスト ソリューションによってこれを実現します。Mayhem のソリューションは、アプリケーション セキュリティ テストでの欠陥の検出と検証を自動化します。具体的には、Mayhem は以下の機能を提供することによって、アプリケーション開発および監査に関する費用を削減します。
- 欠陥の証拠を提示: Mayhem は欠陥の存在と到達可能性を証明するテスト ケースを生成することで、自動的にバグを検出します。
- テスト スイートの生成: Mayhem はセキュリティ テスト実行中に自動的にテストケースを生成し、インデックス付けし、保存します。また、アプリケーションのバージョンが変わるごとに再テストを実行します。テスト スイートは、アプリケーションに対して包括的で繰り返し可能なセキュリティ テストを実行するのに必要な時間とコストを大幅に削減します。
- ベスト プラクティスの実践: Mayhem は、コンパイル済みの実行プログラムを自動でチェックし、悪用に対して強靭化されているかどうかを確認します。
Mayhem とはいったい何か¶
Mayhem は、開発者とセキュリティ担当者がシームレスに協働するための包括的なアプリケーション セキュリティ テスト プラットフォームです。アプリケーションを効率的に分類し、管理し、テストする機能を備え、欠陥やセキュリティ脆弱性を検出します。
基本的に、Mayhem は実行中の Linux プロセスを検査する先進的なファザーを利用します。Mayhem は、インストゥルメンテーションガイド付きファジングという定評ある技術と、シンボリック実行というイノベーションを 1 つにします。
Tip
Mayhem と Mayhem のインストゥルメンテーションガイド付きファジングおよびシンボリック実行機能のわかりやすい解説については「The Science Behind Mayhem」 をご覧ください。
ファジングとは¶
Mayhem はファジングを使用してソフトウェアをテストし、セキュリティを確保します。ファズ テストとも呼ばれるファジングは、アプリケーションにランダムなデータを注入するなどして、プログラムのエラーやクラッシュにつながるバグや欠陥を検出するソフトウェア テスト技法です。さまざまな入力を使用して継続的にアプリケーションを実行することで、テスト対象コードのできるだけ広い範囲を探索し、クラッシュなどの問題につながる可能性があるエッジ ケースを明らかにすることを狙いとします。
ファジングの仕組みをわかりやすく説明するため、簡単なサンプルを見てみましょう。
脆弱性のあるアプリケーションのファジング¶
初めてプログラミングを学ぶ場合、Hello World!
を出力するでしょう。初めてファジングを学ぶには、まず testme
アプリケーションに対してテスト スイートを作成し、バグを見つけてみましょう。
テスト スイートとは、入力を行ってターゲット アプリケーションのさまざまな部分を実行するために使用されるテスト ケースの集まりです。したがって、ターゲット アプリケーションで欠陥が見つかった場合、欠陥を発生させたテスト ケースを保存して、欠陥シナリオの再現に利用できます。
脆弱性のある初歩的なアプリケーション testme
のソース コードを確認し、仕組みを理解しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
testme
アプリケーションには 2 つの関数があるのがわかります。
main
fuzzme
main
関数を見ると、testme
アプリケーションへの引数として適切なファイルが指定された場合、main
関数が fuzzme
関数を呼び出し、fuzzme
関数でファイルの内容を 1 文字ずつ解釈することがわかります。指定されたファイルの内容が「bug」であれば abort()
関数が呼び出され、結果として、プログラムは SIGABRT
シグナルを上げてクラッシュします。
ファイル入力としてテスト ケース "bug" が指定されたときにtestme
アプリケーション内で abort()
関数が呼び出されることは、次の欠陥に分類されます。
- 行 9: CWE-20 - 不適切な入力検証の欠陥
Mayhem によって testme
アプリケーションを実行すると、自動的に SIGABRT
の欠陥が検出されるほか、テスト スイート、つまりさまざまなコード パスを実行する入力のセットが作成されます。
Note
Mayhem のセキュリティ テスト メトリクスの文脈では、入力を変化させたことで実行されたコード パスはエッジまたはカバーされたエッジ と呼ばれることがあります。
たとえば、testme
プログラムに次の 4 つの入力を渡すテスト スイートがあるとします。
mom
は行 6 の false ブランチを実行し、0 を返します。bob
は行 6 の true ブランチを実行し、行 7 の false ブランチを実行して 0 を返します。bun
は行 6-7 の true ブランチを実行し、行 8 の false ブランチを実行して 0 を返します。bug
は行 6-8 の true ブランチを実行し、SIGABRT
エラーを返します。
{mom, bob, bun, bug}
という一連の入力は、プログラムのすべてのブランチを実行するので、優れたテスト スイートになります。
パッケージ化されたターゲット アプリケーションが Mayhem サーバーにアップロードされ、セキュリティ脆弱性がないかどうかテストされます。その後、Mayhem サーバーと同期して、生成されたテスト ケースをクライアント マシンに戻すことができます。
Mayhem の仕組み¶
実行環境が用意されると、Mayhem はアプリケーションを実行して次のタスクを自動的に実行します。
- 悪用可能性ファクター: 悪用に対してアプリケーションが強靭化、つまり保護されているかどうかを確認します。
- ファジングとシンボリック実行: さまざまに変化させた入力を使用してターゲット アプリケーションをテストし、異常な動作/欠陥が発生しないかをモニターします。
- 選別と診断: 見つかった欠陥を検証し、カバレッジ分析を提供します。
- 自動リグレッション テスト: 保存されたテスト スイートを使用して、前回の結果と現在の結果を比較検証します。
悪用可能性ファクター¶
Mayhem がターゲット アプリケーションをテストする際、コンパイル済みのアプリケーションが保護されているか、つまり「強靭化」されているかどうかをチェックします。強靭化されたアプリケーションとは、脆弱性–-既知のものも未知のものも含む–-が比較的悪用されにくいアプリケーションを意味します。開発者は特定のコンパイル時フラグを有効化するかどうかを選択することで、アプリケーションを強靭化できます。
アプリケーションを強靭化するための現時点でのベスト プラクティスである悪用可能性ファクターには、以下が含まれます。
- ASLR: Address Space Layout Randomization (ASLR) は、攻撃者が実行時のメモリの状態を推測するのを難しくし、システムを確実に悪用するのを困難にします。ASLR は、アプリケーションが “Position Independent Executable” (PIE) としてコンパイルされた場合にだけ利用できるオペレーティング システムの機能です。
- FORTIFY_SOURCE: FORTIFY_SOURCE マクロは、メモリおよび文字列の操作を実行するさまざまな関数でのバッファー オーバーフローを検出する軽量の機能を提供します。
- StackGuard: StackGuard は、関数に入ったとき、スタックにスタック カナリアを挿入し、関数を出る前にスタック カナリアの値をチェックして、値が破壊されていた場合は実行を終了します。StackGuard は、スタックベースのバッファー オーバーフロー悪用を検出するのに使用されます。
- DEP: Data Execution Prevention (DEP) は、メモリに対して追加のチェックを実行する技術の集合であり、システム上で悪意のあるコードが実行されるのを防ぐのに役立ちます。
4 つの強靭化技術がすべて有効化されている場合、攻撃者がアプリケーションを悪用するのが大幅に難しくなります。
ファジングとシンボリック実行¶
従来、ファジングとは、単にランダムな入力をアプリケーションに与えて異常な動作がないかをテストするものでした—100 万匹のサルがランダムにキーボードをタイプするようなものです。現実として、1998 年にウィスコンシン大学の Bart Miller という教授は、UNIX アプリケーションの 33% は、ランダムな入力—単にサルがタイプするような入力です—を与えるとクラッシュするということを発見しました。
Mayhem はインストゥルメンテーションガイド付きファジングとシンボリック解析の両方の機能を備えています。これら 2 つの技術は、パフォーマンス曲線は異なりますが、相互補完して最も先進的な形のビヘイビア テストを可能にします。
インストゥルメンテーションガイド付きファジングは、ランダムに生成された入力よりもはるかに洗練され、効率的です。中心となるアイデアは、実行中のプログラムを解析するインストゥルメンテーションを付加し、その情報を使用して新しい入力をインテリジェントに選択するというものです。
シンボリック実行は、さらに先進的です。シンボリック実行はプログラム検証に似ていますが、異なる点があります。プログラムがセキュアであることを検証するのではなく、「欠陥の証明」を生成することで、プログラムがセキュアでないことを検証します。シンボリック実行は、プログラムの実行を形式論理としてモデル化し、数学的解法を使用してプログラムの動作を探索します。
Note
Mayhem のファジング機能を詳しく理解するには、「Mayhem テクノロジー」 を参照してください。
選別と診断¶
プログラムがクラッシュした場合、何か問題があるということはわかりますが、理由はわからないことが多いでしょう。Mayhem は自動的に選別と診断を行って、より深い洞察を可能にし、欠陥に関してより多くの情報を提供します。
各欠陥に関して、Mayhem は次の情報を提示します。
- バックトレースバックトレースは、どの関数が呼び出されたかを特定し、セキュリティ担当者および開発者がよりすばやく問題の根本原因を突き止めるのに役立ちます。
- クラッシュ時のレジスターおよびメモリの状態この情報は、クラッシュに関するコンテキストを提供し、クラッシュの条件が別のクラッシュと同じかどうかを判断するのに使用できます。
自動リグレッション テスト¶
ターゲット アプリケーションをテストする際、Mayhem は各テスト ケースがそれぞれターゲットの固有のコード カバレッジを表すよう、テスト ケースを生成します。したがって、欠陥が見つかった場合、単一のテスト ケースが特定の欠陥を表すため、該当テスト ケースを再実行してエラーを再現できます。
ユーザーの立場からすれば、欠陥が修正された場合は、それを把握したいでしょう。そのため、Mayhemは欠陥を表すテスト ケースを保存し、保存されたテスト スイートを自動的に再実行して、前回の実行と比較して修正された欠陥の数を知らせます。これが自動リグレッション テストです。
Mayhem を使い始める際の必要事項¶
Mayhem とのプログラム適合性の判定¶
まず、テストしたいアプリケーションが Mayhem に適合するかどうかを判断します。Mayhem は、ファイルまたは標準入力を読み取る、あるいは TCP または UDP ソケット経由でネットワークから読み取りを行う C/C++、Go、Rust、Java、Python 等の言語で書かれたコンパイル済みバイナリを解析できます。Mayhem はユーザーランド (コンテナー化された) Linux アプリケーションを処理します。Mayhem は x86、x64、ARM および MIPS アーキテクチャで実行されるバイナリをサポートしています。
Tip
Mayhem とのプログラム適合性の詳細については「サポート マトリクス」 を参照してください。
以下はテストしたいアプリケーションに適合性があるかどうかをすばやく判定するのに役立つヒントです。
- Linux
file <app>
コマンドでアプリケーションが Linux ELF ファイルと表示されるかどうかMayhem はアプリケーションが ELF ファイルであることを必要とします。 - アプリケーションはユーザーランド アプリケーションかどうかアプリケーションを Docker 化できる場合、ユーザーランド アプリケーションです。アプリケーションが特別なハードウェアを必要とする場合、ハードウェアへの依存関係を排除するためにテスト ドライバーを作成する必要があります。
- GUI がアプリケーションとやりとりする唯一の方法かどうか現時点では、Mayhem は GUI を解析しません。
ターゲットのパッケージ化¶
Mayhem を実行してプログラムの欠陥を検出するには、アプリケーションの実行時環境全体が必要です。これには、実行ファイル自体、関連ライブラリ、環境変数、構成設定が含まれます。Mayhem は 2 つの実行時環境の提供方法をサポートしています。
- Docker: Docker は、Mayhem にアプリケーションを取り込む際に推奨される方法です。Docker はアプリケーションのランタイム全体と依存関係をパッケージ化する軽量メカニズムです。Docker イメージが指定された場合、Mayhem は必要に応じてコンテナーをスピン アップおよびティア ダウンして、コンテナー化された環境でアプリケーションを実行します。
- Mayhem パッケージ: Docker を使用できない場合、
mayhem package
コマンドを使用して Linux アプリケーションをパッケージ化し、アプリケーションを静的に解析して推測できるかぎりの依存関係を収集できます。
Mayhem UI または Mayhem CLI によるランの実行¶
Mayhem UI または Mayhem CLIを使用してランを実行できます。
Mayhem UI は、アプリケーション (ターゲット) をテストし、結果を解析できる直感的に操作可能な Web インターフェイスです。Mayhem UI を使用すると、Docker イメージをソースとして指定して Mayhem ランを作成し、コンテナー化されたアプリケーションをテストできます。Mayhem は、Mayhem の内部的な Docker レジストリにアップロードされたローカルな Docker イメージまたは Docker Hub 経由でパブリックにアクセス可能な Docker イメージを取り込むことができます。
Mayhem CLI は、ローカル マシンにダウンロードしてインストールし、ターミナルから Mayhem の操作を実行できるコマンド ライン インターフェイスです。Mayhem CLI を使用するには、生成された API トークンを使用し、インストールした Mayhem CLI をデプロイ済みの Mayhem サーバーで認証しておく必要があります。
Info
Mayhem CLI を認証するために API トークンを生成する方法については、「API トークンの生成」 を参照してください。f
✏️ まとめと振り返り¶
このレッスンでは、Mayhem を使用する利点、Mayhem とは何か、Mayhem の動作の基礎となる概念および Mayhem を使い始めるために必要な要件について学びました。
学習内容
1. コードのテストに Mayhem を使用するべき理由
- アプリケーションをセキュアにすることの必要性はかつてなく大きくなっています。適切なアプリケーション セキュリティ テストが行われていなければ、アプリケーションのコードに存在する脆弱性がハッカーにバックドアを開き、ハッカーが潜在的なセキュリティの欠陥を標的としてアプリケーションおよびデータの完全性を侵害する可能性があります。
- 従来のアプリケーション セキュリティ テストは時間と手作業を必要とし、企業と開発チームのコストの負担を増加させていました。いっぽう、Mayhem を使用すると、時間と労力、最終的にはコストを削減しながら、より高い精度でセキュアかつ信頼性の高いソフトウェアをデリバリーすることが可能になります。
2. Mayhem とは
- Mayhem は、開発者とセキュリティ担当者がコラボレーションし、容易にアプリケーションを分類、管理、テストして欠陥やセキュリティ脆弱性を発見するためのアプリケーション テスト プラットフォームです。
- 基本的に、Mayhem は先進的なファザーを使用して実行中の Linux プロセスを解析し、インストゥルメンテーションガイド付きファジングという定評ある手法とシンボリック実行という独創的技術を 1 つにします。
3.ファジングの仕組み
- ファズテストとも呼ばれるファジングは、アプリケーションの入力としてランダムなデータを注入してモニターし、プログラムのエラーやクラッシュにつながるバグ/欠陥を検出するソフトウェア テスト技法です。できるだけ広い範囲のコードをカバーし、クラッシュにつながるエッジ ケースを探すため、アプリケーションは入力を変えて継続的に再実行されます。
4.Mayhem がターゲットをテストする方法
- 悪用可能性ファクター: 悪用に対してアプリケーションが強靭化、つまり保護されているかどうかを確認します。
- ファジングとシンボリック実行: さまざまに変化させた入力を使用してターゲット アプリケーションをテストし、異常な動作/欠陥が発生しないかをモニターします。
- 優先順位付けと診断: 見つかった欠陥を検証し、カバレッジ分析を提供します。
- 自動リグレッション テスト: 保存されたテスト スイートを使用して、前回の結果と現在の結果を比較検証します。
5.Mayhem の使用を開始する方法
- テストしたいアプリケーションが Mayhem に適合するかどうかを判断します。Mayhem は、ファイルまたは標準入力を読み取るか、TCP または UDP ソケット経由でネットワークから読み取りを行う C/C++、Go、Rust、Java 等の言語で書かれたコンパイル済みバイナリを解析できます。Mayhem はユーザーランド (コンテナー化) Linux アプリケーションを処理します。Mayhem は x86、x64、ARM および MIPS アーキテクチャで実行されるバイナリをサポートしています。
- Mayhem を実行してプログラムの欠陥を検出するには、アプリケーションの実行時環境全体が必要です。
- Docker: Docker は、Mayhem にアプリケーションを取り込む際に推奨される方法です。Docker はアプリケーションのランタイム全体と依存関係をパッケージ化する軽量メカニズムです。
- Mayhem パッケージ: Docker を使用できない場合、
mayhem package
コマンドを使用して Linux アプリケーションをパッケージ化し、アプリケーションを静的に解析して推測できるかぎりの依存関係を収集できます。