OWASPが公認する「意図的脆弱アプリ」でセキュリティスキャナーをベンチマーク — OWASP VulnerableApp

タグ OWASPセキュリティスキャナー脆弱性DASTSASTベンチマークDockerJavacolumnコラムlinuxLinuxwindowsWindowsdockerGitHubオープンソースSasanLabsVulnerableApp
🚀 今すぐ試せます! デモスクリプトをダウンロードして、解凍後にターミナルで bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。 (macOS / Linux 環境が必要)

OWASPが公認する「意図的脆弱アプリ」でセキュリティスキャナーをベンチマーク — OWASP VulnerableApp

ひとことでいうと

OWASP VulnerableApp は、セキュリティスキャナー(脆弱性を自動で探すツール)の性能を測るために、わざと脆弱性を仕込んだ Java 製のウェブアプリケーションです。OWASP(Open Web Application Security Project)という世界的なセキュリティ団体のインキュベータープロジェクトとして公認されており、単なる学習用にとどまらず「自分のスキャナーが本当に機能するか確かめる」ための自動化・再現性・拡張性を重視して設計されています。壊す・スキャンする・再現する・ベンチマークする・改善するという5つの用途を想定しており、セキュリティエンジニア・研究者・教育者向けの実践的なツールです。


こんな人におすすめ

  1. スキャナーの精度を数字で確認したい方: Burp Suite や OWASP ZAP などの DAST ツール(動くアプリに向かって脆弱性を探すツール)が「何件見つけて、何件見逃しているか」を自動でレポートにまとめたい場合に活躍します。検出率・未検出・誤検知の3軸で定量評価できます。

  2. 安全な環境でさまざまな攻撃を試したい方: SQL インジェクション、XSS(クロスサイトスクリプティング)、コマンドインジェクション、JWT 脆弱性など14種類以上の脆弱性パターンをローカル環境で自由に再現できます。各脆弱性は決まった動作をするため、スキャン結果を何度でも再現できます。

  3. 研究・教育に使える継続的な環境を探している方: 新しい攻撃手法が登場したときに脆弱性シナリオを自分で追加できるモジュラー設計(部品を組み合わせて拡張できる仕組み)を持っています。教育カリキュラムや研究プロジェクトに組み込んで長く使い続けられます。


インストール・使い方

Docker Compose を使う方法が最もシンプルで、公式に推奨されています。

ターミナルとは?: 文字でコンピューターに命令を送る画面のことです。Mac なら「ターミナル」、Windows なら「PowerShell」や「コマンドプロンプト」が該当します。以下のコマンドはコピー&ペーストで使えます。


Step 1: Docker と Docker Compose をインストールする

docker --version
docker compose version

Docker(アプリをまとめてパッケージ化して動かす仕組み)が正しくインストールされているかを確認します。バージョン番号が表示されれば準備 OK です。


Step 2: リポジトリ(ソースコードの置き場)をダウンロードする

git clone https://github.com/SasanLabs/VulnerableApp.git
cd VulnerableApp

GitHub からソースコード一式をパソコンにコピーし、そのフォルダーに移動します。


Step 3: Docker イメージを取得して起動する

docker-compose pull && docker-compose up

必要なファイルをダウンロードしてアプリを起動します。初回は少し時間がかかりますが、完了するとアプリが動き始めます。


Step 4: ブラウザでアクセスする

起動後、ブラウザ(Chrome や Firefox など)で http://localhost にアクセスするとモダン UI が表示されます。旧来の UI は http://localhost:9090/VulnerableApp で確認できます。


Docker を使わずに起動したい場合(スタンドアロン JAR)

GitHub の Releases ページから最新の JAR ファイルをダウンロードし、以下のコマンドで起動します。Java 17 が必要です。

java -jar VulnerableApp-*.jar

起動後は http://localhost:9090/VulnerableApp でアクセスできます。


組み込みデータベースへのアクセス

http://localhost:9090/VulnerableApp/h2 からブラウザでデータベースに直接接続できます。

項目
JDBC URLjdbc:h2:mem:testdb
ユーザー名admin
パスワードhacker

動かしてみた

プロジェクトを確認すると、Java/Gradle ベース(Java のビルドツール)で構成されており、Docker 関連ファイルが整然と揃っていることがわかりました。

./build.gradle
./gradlew
./Dockerfile.base
./docker-compose.yml
./docker-compose.local.yml
./docker-compose.without_llm.yml

Docker Compose の構成ファイルは用途ごとに3種類用意されています。docker-compose.yml が通常起動用、docker-compose.local.yml がローカルでのビルドテスト用、docker-compose.without_llm.yml が LLM(大規模言語モデル)連携なしで軽量に動かしたい場合の構成です。用途に合わせて使い分けられる点が実用的です。

scripts/testWithModernUI.sh というスクリプトも確認でき、ローカルで変更を加えたときにモダン UI と組み合わせてテストする自動化の仕組みも備わっています。また Python 3.12 のランタイムも確認でき、関連スクリプトや将来的な拡張も見据えた構成になっています。


デモについて

本ツールはわざと脆弱性を仕込んだアプリのため、インターネット上の公開環境で動かすことは安全上おすすめできません。Docker Compose を使ってローカル環境またはプライベートネットワーク内に立ち上げ、外部からアクセスできない環境だけで使うようにしましょう。「手元のパソコンだけで動かす」ことが大前提のツールです。


スキャナーベンチマークのはじめの一歩

VulnerableApp 最大の特徴がスキャナーベンチマーク機能です。スキャナーが出力した JSON 結果を専用エンドポイントに送るだけで、プロジェクト内蔵の「正解データ(グラウンドトゥルース)」と照合してカバレッジレポートを自動生成します。DAST と SAST の両方のスキャナー形式に対応しています。

DAST スキャナー結果の送信例(curl=コマンドラインで HTTP リクエストを送るツール):

curl -X POST http://localhost:9090/VulnerableApp/scanner/benchmark \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "my-dast-scanner",
    "scanType": "DAST",
    "findings": [
      { "url": "http://localhost:9090/VulnerableApp/user", "type": "SQL_INJECTION", "cwe": "89" }
    ]
  }'

SAST スキャナー結果の送信例:

curl -X POST http://localhost:9090/VulnerableApp/scanner/benchmark \
  -H "Content-Type: application/json" \
  -d '{
    "tool": "my-sast-tool",
    "scanType": "SAST",
    "findings": [
      { "filePath": "src/main/java/.../SqlInjection.java", "line": 42, "cwe": "89" }
    ]
  }'

レスポンス(返答)と benchmarks/<tool>-results.json ファイルの両方にカバレッジレポートが出力されます。typecwe(共通脆弱性識別子)・wascId のいずれか1軸が一致すれば検出成功と判定されます。

すぐ試せるポイントをまとめます。

  • まず docker-compose up で起動し、http://localhost の画面が表示されることを確認する
  • OWASP ZAP などのスキャナーをローカルで実行し、スキャン結果の JSON を用意する
  • ベンチマーク API にその JSON を送信し、カバレッジレポートを確認する
  • LLM 連携なしの軽量構成で試したいときは docker-compose.without_llm.yml を使う
  • 新しい脆弱性シナリオを追加したいときは ./gradlew GenerateSampleVulnerability で雛形を自動生成できる

用語とポイント解説

OWASP(オーワスプ) Open Web Application Security Project の略で、ウェブセキュリティの標準を作る非営利の国際団体です。かんたんに言うと「セキュリティの世界標準を作る団体」で、VulnerableApp はここのインキュベータープロジェクト(公認の育成中プロジェクト)として開発されています。

DAST(ダスト) Dynamic Application Security Testing の略で、実際にアプリを動かしながら外から脆弱性を探すテスト手法です。かんたんに言うと「動くアプリに向かって実際に攻撃を試みるテスト」です。Burp Suite や OWASP ZAP がその代表的なツールです。

SAST(サスト) Static Application Security Testing の略で、アプリを動かさずにソースコードを読んで脆弱性を探す手法です。かんたんに言うと「コードを読んで問題を探す静的解析ツール」です。DAST と組み合わせて使うことで、検出の網羅性がより高まります。

SQL インジェクション データベース(データを整理して保存する仕組み)に送る命令文(SQL)に悪意ある文字を紛れ込ませる攻撃です。かんたんに言うと「入力フォームからデータベースを操作してしまう攻撃」で、VulnerableApp には Error Based・Union Based・Blind の3種類が収録されています。

XSS(クロスサイトスクリプティング) ウェブページに悪意あるスクリプト(プログラムの断片)を埋め込む攻撃です。かんたんに言うと「他のユーザーのブラウザで勝手にプログラムを動かす攻撃」で、Persistent(持続型)と Reflected(反射型)の2種が収録されています。

JWT(ジェイダブリュティー) JSON Web Token の略で、ユーザーの認証情報をトークン(電子的な証明書)として渡す仕組みです。かんたんに言うと「ログイン状態を証明する電子チケット」で、署名検証の不備や有効期限の扱いに脆弱性が生まれることがあります。

SSRF(エスエスアールエフ) Server-Side Request Forgery の略で、サーバーを経由して内部ネットワークにアクセスさせる攻撃です。かんたんに言うと「外から直接届かない場所へ、サーバーを踏み台にして侵入する攻撃」です。クラウド環境で特に危険度が高い脆弱性とされています。

IDOR(アイドア) Insecure Direct Object Reference の略で、認可(アクセス権限の確認)が不十分なためほかのユーザーのデータにアクセスできてしまう脆弱性です。かんたんに言うと「URL の数字を変えるだけで他人のデータが見えてしまう問題」です。

Path Traversal(パストラバーサル) ../ などのパス記号を使い、アクセス制限外のファイルやフォルダーに侵入する攻撃です。かんたんに言うと「フォルダーの外に出る道を使って非公開ファイルを読み取る攻撃」です。ファイルのアップロード・ダウンロード機能を持つアプリで特に注意が必要です。

XXE(エックスエックスイー) XML External Entity 攻撃の略で、XML(データ記述形式)のパーサー(読み取りプログラム)が外部ファイルを参照する機能を悪用する攻撃です。かんたんに言うと「XML の読み取り機能を使ってサーバー内のファイルを盗む攻撃」です。

グラウンドトゥルース(正解データ) ベンチマーク評価で「これが正しい答えである」と事前に定義したデータのことです。かんたんに言うと「採点のための答え合わせシート」で、スキャナーが何件正解できたかを自動集計するために使われます。

モジュラー設計 機能を独立した部品(モジュール)として組み合わせた設計方式です。かんたんに言うと「部品を差し替えたり追加したりしやすい作り方」で、VulnerableApp では新しい脆弱性シナリオをあとから追加していける構造になっています。


活用例

  • CI/CD パイプラインへの組み込み: VulnerableApp を Docker で起動し、スキャナーを自動実行してベンチマーク API に結果を送る CI ジョブを組むことで、リリースのたびにスキャナーの検出精度を継続的に監視できます。スキャナーのアップデートで検出率が下がっていないかも自動でチェックできます。
  • 複数スキャナーの比較評価: 同じ脆弱性セットに対して Burp Suite・OWASP ZAP・独自ツールの結果を並べて比較できます。どのツールが何を見落としているかを定量的に可視化でき、商用ツールの導入判断や更新評価にも活用できます。
  • セキュリティトレーニング環境: JWT 署名検証の不備・Blind SQL インジェクション・Stored XSS など実際の脆弱性コードを読みながら、攻撃と防御の両面を学べるハンズオン環境として活用できます。社内研修や勉強会の教材としても最適です。
  • スキャナーの新機能開発: 開発中のスキャナーに新しい検出ルールを追加した後、VulnerableApp でどれだけ検出率が向上したかをすぐに数値で確認できます。開発サイクルの中に定量評価を組み込めます。
  • セキュリティ研究・論文執筆: 新しい攻撃手法を研究する際、既存の脆弱性シナリオと比較しながら再現性のある実験ができます。./gradlew GenerateSampleVulnerability で独自シナリオの雛形を生成して拡張できるため、研究目的の環境構築にも適しています。
  • ペネトレーションテストの練習: 安全な閉じた環境でさまざまな攻撃手法を試すことができます。実際のシステムを傷つけることなく、ツールの使い方や攻撃の仕組みを手を動かしながら学べます。

OWASP VulnerableApp は、Java 17 + Spring Boot + ReactJS で構築されたオープンソースのセキュリティテスト基盤です。単なる学習ツールを超え、スキャナーの定量評価から研究・教育まで幅広い用途に対応しています。ぜひセキュリティスキャナーの性能検証や社内のセキュリティトレーニングなどに活用してみてはいかがでしょうか。