Overview
SAST(Static Application Security Testing:静的アプリケーションセキュリティテスト)とDAST(Dynamic Application Security Testing:動的アプリケーションセキュリティテスト)は、アプリケーションの脆弱性を検出するための2つの主要なテスト手法です。SASTはソースコードやバイナリを実行せずに解析する「ホワイトボックステスト」、DASTは実行中のアプリケーションに対して外部から攻撃を模擬する「ブラックボックステスト」です。
SASTは開発の早い段階でコード中の脆弱性パターン(SQLインジェクション、バッファオーバーフロー、ハードコードされた認証情報など)を検出できるため、シフトレフト(セキュリティを開発の上流工程に移動させる)の中核技術として位置づけられます。一方、DASTは実際の実行環境における脆弱性(認証不備、セッション管理の欠陥、サーバー設定ミスなど)を検出でき、本番環境に近い条件でのテストが可能です。
両手法にはそれぞれ長所と限界があるため、SAST と DAST を組み合わせて使用することが推奨されます。さらに、両者の利点を統合したIAST(Interactive Application Security Testing)や、実行中のアプリケーションを内部から保護するRASP(Runtime Application Self-Protection)といった技術も登場し、アプリケーションセキュリティテストは多層的なアプローチへと進化しています。
Details
SAST(静的アプリケーションセキュリティテスト)
SASTは、アプリケーションのソースコード、バイトコード、またはバイナリを静的に解析して脆弱性を検出する手法です。コンパイルや実行を必要としないため、開発の非常に早い段階(コーディング中やコミット時)から適用でき、脆弱性の修正コストを大幅に削減できます。
- データフロー解析:ユーザー入力(ソース)からセキュリティ上重要な関数(シンク)までのデータの流れを追跡し、適切なサニタイズ処理が行われているかを検証
- 制御フロー解析:プログラムの実行パスを解析し、到達可能な脆弱性パターンを検出
- パターンマッチング:既知の脆弱性パターン(危険な関数の使用、ハードコードされた秘密情報など)をルールベースで検出
- セマンティック解析:コードの意味的な解析を行い、より高度な脆弱性パターンを検出
代表的なSASTツールには、SonarQube、Checkmarx、Fortify、Semgrep、CodeQLなどがあります。
DAST(動的アプリケーションセキュリティテスト)
DASTは、実行中のアプリケーションに対して外部からHTTPリクエストを送信し、レスポンスを分析することで脆弱性を検出する手法です。ソースコードへのアクセスが不要で、言語やフレームワークに依存しない点が大きな利点です。
- クローリング:Webアプリケーションの全ページとフォームを自動的に探索し、テスト対象のエンドポイントを網羅的に特定
- ファジング:入力フィールドに異常なデータや攻撃ペイロードを送信し、予期しない動作やエラーメッセージの漏洩を検出
- 認証テスト:認証バイパス、セッション管理の不備、アクセス制御の欠陥を検出
- 設定チェック:HTTPヘッダーの不備、TLS設定の問題、サーバー情報の漏洩などを検出
代表的なDASTツールには、OWASP ZAP、Burp Suite、Acunetix、Niktoなどがあります。
SASTとDASTの比較
SASTは開発初期から適用可能で、脆弱性の正確なコード位置を特定できますが、偽陽性(誤検出)が多い傾向があり、実行時にのみ発現する脆弱性は検出できません。DASTは実際の攻撃を模擬するため偽陽性が比較的少なく、設定ミスやランタイムの問題を検出できますが、脆弱性のコード位置は特定できず、テスト対象のカバレッジが限定的になる場合があります。
IAST(Interactive AST)とRASP
IASTはアプリケーション内部にエージェントを組み込み、実行時のデータフローを監視しながらテストを行います。SASTの精度とDASTの実行時分析を組み合わせたアプローチで、偽陽性を大幅に削減できます。RASPは本番環境でアプリケーションを内部から保護し、攻撃をリアルタイムで検出・ブロックする技術です。
DevSecOpsにおけるAST統合
現代のDevSecOpsプラクティスでは、SAST/DASTをCI/CDパイプラインに統合し、コードの変更が行われるたびに自動的にセキュリティテストを実行します。SASTはプルリクエストの段階で実行してコードレビューと並行して脆弱性を検出し、DASTはステージング環境へのデプロイ後に実行してランタイムの問題を検出するのが一般的です。
Security Measures
- 01CI/CDパイプラインへのSAST組み込み:プルリクエストやコミット時にSASTスキャンを自動実行し、脆弱性を含むコードがマージされることを防いでください。重大な脆弱性が検出された場合はビルドを失敗させるゲート機能を設定しましょう。
- 02定期的なDASTスキャンの実施:ステージング環境や本番環境に対して定期的にDASTスキャンを実行し、デプロイ後に発現する脆弱性や設定ミスを検出してください。認証付きスキャンを設定し、ログイン後のページもテスト対象に含めましょう。
- 03偽陽性管理と検出ルールのチューニング:SASTの偽陽性が多すぎると開発者が警告を無視するようになるため、検出ルールを環境に合わせて継続的にチューニングしてください。確認済みの偽陽性は抑制リストに登録し、ノイズを削減しましょう。
- 04SASTとDASTの併用による網羅的テスト:SASTだけ、またはDASTだけではカバーできない脆弱性があります。両手法を併用し、コードレベルの脆弱性と実行時の脆弱性の両方を検出する体制を構築してください。可能であればIASTの導入も検討しましょう。
- 05開発者向けセキュリティトレーニング:SASTツールが検出する脆弱性パターンとその修正方法について、開発者向けのトレーニングを定期的に実施してください。ツールの出力を理解し、適切に修正できるスキルを開発チーム全体で育成しましょう。
- 06テスト結果の一元管理と傾向分析:SAST/DASTの検出結果を脆弱性管理プラットフォームに集約し、検出数の推移、修正率、再発率などの指標を追跡してください。繰り返し検出される脆弱性パターンに対してはセキュアコーディングガイドラインの強化で対処しましょう。
Incidents
📋 Heartbleed脆弱性とコードレビューの限界(2014年)
2014年に発見されたOpenSSLのHeartbleed脆弱性(CVE-2014-0160)は、メモリ境界チェックの欠如という比較的単純なコーディングエラーが原因でした。この脆弱性は2年以上にわたって存在していましたが、人手によるコードレビューでは発見されませんでした。
Heartbleed発見後、SASTツールの多くがこの脆弱性パターン(境界チェックの欠如)を検出ルールに追加しました。この事件は、オープンソースプロジェクトにおいても自動化されたSASTスキャンが不可欠であることを示し、Core Infrastructure Initiative(現OpenSSF)のようなOSSセキュリティ支援プログラムの設立につながりました。
📋 大手ECサイトにおけるSQLインジェクション被害(2020年代)
2020年代に入っても、SQLインジェクションによる情報漏洩事件は後を絶ちません。SASTツールが容易に検出できるはずのSQLインジェクション脆弱性が本番環境に残存し、攻撃者に悪用されるケースが継続的に報告されています。多くの場合、SASTの導入が不十分であるか、検出された警告が放置されていたことが原因です。
これらの事件は、SASTツールを導入するだけでなく、検出された脆弱性を確実に修正する運用プロセスの確立が重要であることを示しています。セキュリティテストの「ゲート機能」により、未修正の重大な脆弱性を含むコードのリリースを自動的にブロックする仕組みが効果的です。
📋 APIセキュリティ不備の大量検出とDASTの進化(2023年)
2023年、複数のセキュリティベンダーの調査により、WebアプリケーションのAPI脆弱性が急増していることが報告されました。従来のDASTツールはWebページのフォームベースのテストに最適化されており、REST APIやGraphQL APIのテストには不十分でした。この課題に対応するため、API特化型のDASTツールが急速に発展しました。
BOLA(Broken Object Level Authorization)やBFLA(Broken Function Level Authorization)などのAPIセキュリティ固有の脆弱性は、従来のSASTでは検出が難しく、API仕様(OpenAPIスキーマ)をインポートしたDASTスキャンが効果的です。この事例は、テスト手法もアプリケーションアーキテクチャの進化に合わせて更新する必要があることを示しています。