ストーリー
田
田中VPoE
SASTはソースコードを見る「ホワイトボックス」テストだった。次はDAST — 実行中のアプリケーションを外部からテストする「ブラックボックス」テストだ
あなた
実際にリクエストを送って脆弱性を見つけるわけですか
あ
田
田中VPoE
そうだ。DASTは攻撃者の視点でアプリケーションをテストする。SASTが「コードの中に問題がないか」を見るのに対し、DASTは「外から見て問題がないか」を見る。両者は補完関係にある
田
田中VPoE
SASTはコードベースの問題を見つけるが、設定ミスやランタイムの問題は見つけられない。例えば、CORSの設定ミスやHTTPヘッダーの不備はDASTでしか検出できない。逆に、DASTはコードの内部構造は見えないから、すべてのパスを網羅するのは難しい
DASTの仕組み
SASTとDASTの比較
| 観点 | SAST | DAST |
|---|
| テスト対象 | ソースコード | 実行中のアプリケーション |
| アプローチ | ホワイトボックス | ブラックボックス |
| 検出対象 | コードレベルの脆弱性 | ランタイムの脆弱性、設定ミス |
| 実行タイミング | ビルド時(PR作成時) | デプロイ後(ステージング環境) |
| 誤検知率 | 比較的高い | 比較的低い(実際に攻撃が成功するか検証) |
| 言語依存 | あり(言語ごとの解析器) | なし(HTTPレベルで解析) |
| カバレッジ | コードの網羅性が高い | アクセス可能なエンドポイントに限定 |
| 速度 | 高速(数分〜数十分) | 低速(数十分〜数時間) |
DASTのスキャンタイプ
DAST のスキャンタイプ:
1. Passive Scan(受動スキャン)
├── プロキシとして通常のトラフィックを監視
├── レスポンスヘッダーの問題を検出
├── Cookie設定の問題を検出
└── アプリケーションに影響なし(安全)
2. Active Scan(能動スキャン)
├── 実際に攻撃ペイロードを送信
├── SQLインジェクション、XSS等を検出
├── ファジング(ランダムな入力を送信)
└── アプリケーションに影響する可能性あり
3. API Scan(APIスキャン)
├── OpenAPI/Swagger仕様書をベースに解析
├── APIエンドポイントの認証テスト
├── パラメータの境界値テスト
└── REST/GraphQL対応
主要なDASTツール
| ツール | ライセンス | 特徴 | 適用場面 |
|---|
| OWASP ZAP | OSS | 業界標準、豊富な機能、APIスキャン対応 | CI/CD統合、APIテスト |
| Nuclei | OSS | テンプレートベース、高速、カスタマイズ容易 | 設定ミス検出、CVEスキャン |
| Burp Suite | 商用 | 高機能、手動テスト支援 | ペネトレーションテスト |
| OWASP Dependency-Track | OSS | SBOM管理と脆弱性追跡 | サプライチェーン管理 |
| StackHawk | 商用 | 開発者フレンドリー、CI/CD統合 | DevSecOps |
| Nikto | OSS | Webサーバー設定スキャン | インフラセキュリティ |
OWASP ZAPの自動スキャン例
# ZAP Docker を使った CI/CD 統合
# GitHub Actions の例
name: DAST Scan
on:
push:
branches: [main]
jobs:
dast:
runs-on: ubuntu-latest
services:
app:
image: myapp:latest
ports:
- 8080:8080
steps:
- uses: actions/checkout@v4
# API スキャン(OpenAPI仕様書ベース)
- name: ZAP API Scan
uses: zaproxy/action-api-scan@v0.9.0
with:
target: 'http://app:8080'
rules_file_name: 'zap-rules.tsv'
cmd_options: >
-f openapi
-O http://app:8080/api/openapi.json
# フルスキャン(Active Scan含む)
- name: ZAP Full Scan
uses: zaproxy/action-full-scan@v0.10.0
with:
target: 'http://app:8080'
rules_file_name: 'zap-rules.tsv'
ZAPのルール設定ファイル
# zap-rules.tsv
# ルールID アクション 説明
10010 WARN Cookie No HttpOnly Flag
10011 FAIL Cookie Without Secure Flag
10015 FAIL Incomplete or No Cache-control Header
10017 FAIL Cross-Domain JavaScript Source File Inclusion
10020 FAIL X-Frame-Options Header
10021 FAIL X-Content-Type-Options Header
10036 FAIL Server Leaks Version Information
10038 FAIL Content Security Policy (CSP) Header
40003 FAIL CRLF Injection
40012 FAIL Cross Site Scripting (Reflected)
40014 FAIL Cross Site Scripting (Persistent)
40018 FAIL SQL Injection
90019 FAIL Server Side Code Injection
90020 FAIL Remote OS Command Injection
DASTで検出できる主要な脆弱性
| 脆弱性 | 検出方法 | OWASP分類 |
|---|
| SQLインジェクション | 特殊文字を含むペイロードを送信し、エラーレスポンスを分析 | A03 |
| XSS(クロスサイトスクリプティング) | scriptタグを含む入力を送信し、レスポンスに反映されるか確認 | A03 |
| CSRF | CSRFトークンの有無とバリデーションを確認 | A01 |
| セキュリティヘッダーの不備 | レスポンスヘッダーのCSP、HSTS、X-Frame-Options等を確認 | A05 |
| CORS設定ミス | オリジンを変えてリクエストし、許可状況を確認 | A05 |
| 認証バイパス | 認証なしでの保護リソースアクセスを試行 | A07 |
| 情報漏洩 | エラーメッセージ、バージョン情報、デバッグ情報の露出を確認 | A01 |
| TLS設定不備 | 対応プロトコル、暗号スイート、証明書の有効性を確認 | A02 |
レスポンスヘッダーのチェック項目
必須セキュリティヘッダー:
Strict-Transport-Security: max-age=31536000; includeSubDomains
→ HTTPS の強制
Content-Security-Policy: default-src 'self'; script-src 'self'
→ XSS 防止
X-Content-Type-Options: nosniff
→ MIME タイプスニッフィング防止
X-Frame-Options: DENY
→ クリックジャッキング防止
Referrer-Policy: strict-origin-when-cross-origin
→ Referrer 情報の制御
Permissions-Policy: camera=(), microphone=(), geolocation=()
→ ブラウザ機能の制限
DASTの運用上の注意点
テスト環境の考慮事項
| 考慮事項 | 対策 |
|---|
| 本番環境への影響 | ステージング環境でのみActive Scanを実行 |
| データの副作用 | テスト用データベースを使用、テスト後にリセット |
| レート制限への対応 | スキャン速度を調整、テスト環境ではレート制限を緩和 |
| 認証が必要なエンドポイント | ZAPに認証情報を設定、Authenticationスクリプトを使用 |
| API仕様の変更 | OpenAPI仕様書をCI/CDで自動更新 |
「DASTは攻撃者の視点でテストする。つまり、テスト環境を壊す可能性がある。本番環境で絶対にActive Scanを実行するな」 — 田中VPoE
まとめ
| ポイント | 内容 |
|---|
| DAST | 実行中のアプリケーションを外部からテストするブラックボックステスト |
| SASTとの補完関係 | SASTはコードの問題、DASTはランタイムと設定の問題を検出 |
| スキャンタイプ | Passive(安全)、Active(攻撃ペイロード送信)、API(仕様書ベース) |
| 運用注意 | ステージング環境でのみActive Scan、認証設定、速度調整が必要 |
チェックリスト
次のステップへ
次は「SCAとサプライチェーンセキュリティ」を学びます。依存ライブラリに潜む脆弱性を管理する方法を身につけましょう。
推定読了時間: 30分