PandaWard について
PandaWardは、自分のコードを対象とするローカルのアプリケーションセキュリティ評価ツールです。Go製コマンドラインツールとClaude Codeプラグインを備え、証拠を台帳に記録し、再テストで確認した後に検出結果の状態を更新します。
主な機能
- 01既定で読み取り専用のオフライン検査
- 02制御項目とマスキング済み証拠の台帳
- 03スキャンをまたいだ検出結果の追跡
- 04HTML、Markdown、JSONなどのレポート出力
- 05ネットワークテストには人の承認が必要
- 06Claude Codeでコード変更を自動再テスト
活用シーン
- 01コードリポジトリのアプリケーションセキュリティ評価
- 02修正後の再テストと検出結果の差分確認
- 03未判定の制御項目と証拠の確認
- 04セキュリティ評価レポートの出力
MCP 対応
Claude CodeプラグインはMCPサーバーを介してPandaWardエンジンに接続し、スキルと読み取り専用エージェントが利用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
PandaWard
自分のコードを対象とする、ローカルで実行するエビデンスに基づいたアプリケーションセキュリティ評価。
単独で使える Go CLI と Claude Code プラグインです。デフォルトではパッシブに動作し、テストしていない内容も正直に示します。
ウェブサイトとデモ · ドキュメント · クイックスタート · 制限事項
ほとんどのスキャナーはアラートの一覧を出力して終了します。PandaWard は台帳を保持します。チェック可能なすべてのコントロール、それぞれのチェック方法、秘匿化されたエビデンス、そして判定できなかったすべてのコントロールを記録します。検出結果には実行をまたいで一貫したフィンガープリントが付与されるため、修正が REMEDIATED になるのは、チェックを再実行して問題が確認されなくなった場合だけです。また、ファイルの移動や名前の変更があっても、その検出結果や ID、トリアージは維持され、修正済みとして扱われることはありません。
tools/termdemo が生成した、同梱のデモプロジェクトでの実際のセッションです。
同梱の脆弱なフィクスチャを実際にスキャンした結果です。ターミナルの再生とレポート全文はライブデモでご覧いただけます。
| デフォルトで安全 | デフォルトのプロファイルではリポジトリを読み取るだけです。インストールスクリプト、Makefile、ビルドを実行せず、シンボリックリンクをたどらず、どの対象にも通信しません。 |
| 人の承認を得たネットワークテスト | リクエストを送信する処理には、対話型ターミナルから人が記入して承認したスコープマニフェストが必要です。AI エージェントは承認できません。 |
| 誤った「問題なし」の判定なし | 決定的な結果は PASS と FAIL のみです。スキャナーがない場合は BLOCKED、クラッシュした場合は ERROR、ヒューリスティックによる検出は SUSPECTED となります。いずれも安全とは見なしません。 |
| 意見ではなく証拠 | 各検出結果は、編集済みで SHA-256 アドレス指定された証拠レコードにリンクされています。モデルが提案した問題は、人が判断するまで HYPOTHESIS のままです。 |
| 秘密情報を漏らしません | 値は保存、表示、報告、モデルへの返却の前にマスキングされます。.env ファイルとキーのファイルは、名前のみ記録されます。 |
| セッションをまたいで記憶 | 状態はローカルの SQLite 台帳に保存されるため、コンテキストの圧縮や再起動によって結果が失われることはありません。 |
| ドメインを横断した分析 | identity -> authorization(BC1)や webhook -> payment state(FG1)などのリンクは、コード内の共有アセットから作成され、個別に追跡されます。 |
| プライベート | アカウントもクラウドバックエンドも必要ありません。使用状況のテレメトリは、自分で有効にしない限りオフです。また、pandaward telemetry show を実行すると、送信されるすべてのバイトが表示されます(詳細)。 |
旧称 PenSec。 このプロジェクトは 0.2.0 で PandaWard に改名されました。PenSec を使用していた場合は、PenSec からの移行をご覧ください。
クイックスタート
Claude Code プラグインとして
/plugin marketplace add ratomirjovanovic/pandaward
/plugin install pandaward@pandaward # macOS and Linux
/plugin install pandaward-windows@pandaward # Windows
同じ手順は、ターミナルから claude plugin marketplace add ratomirjovanovic/pandaward と claude plugin install pandaward-windows@pandaward(macOS と Linux では pandaward@pandaward)を実行して行うこともできます。その後 Claude Code を再起動してください。/mcp に plugin:pandaward:pandaward が接続済みとして表示されます。2 つのプラグインのうち、インストールするのは 1 つだけにしてください。問題が発生した場合は、トラブルシューティングを参照してください。
更新。 Claude Code は、設定を有効にしない限り、サードパーティのマーケットプレイスを自動では更新しません。自動更新を一度有効にする(/plugin を開き、Marketplaces、pandaward、Enable auto-update の順に選択する)か、手動で更新してください。
claude plugin marketplace update pandaward
claude plugin update pandaward-windows@pandaward # or pandaward@pandaward on macOS and Linux
その後 Claude Code を再起動してください。/plugin にインストール済みのバージョンが表示されます。
アンインストール。 claude plugin uninstall pandaward-windows@pandaward(または pandaward@pandaward)を実行し、その後 claude plugin marketplace remove pandaward を実行します。結果は、削除するまで各プロジェクトの .pandaward/ ディレクトリに残ります。アンインストールガイドでは、CLI パッケージと PandaWard が作成するすべてのファイルについて説明しています。
次に、プロジェクト内で Claude にセキュリティをチェックするよう依頼するか、次を実行します。
/pandaward:start
これが唯一のコマンドです。Claude はプロジェクトをスキャンし、自動化では判断できなかった項目を専門レビュー担当者に確認させ、結果をトリアージし、修正計画を作成してレポートを書き、ライブチェックリストを表示します。最後に、計画を修正するか、トリアージ結果を記録するか、不足しているスキャナーをインストールするかを尋ね、選択した内容を実行し、修正のたびに再テストします。セッション中にコードが変更されると、その後は自動で再テストします。検出結果のステータスを変更するコマンドでは、引き続き確認プロンプトが表示されます。また、ネットワークテストには、必ずご自身のターミナルで承認したスコープが必要です。
個別のスキル
| スキル | 内容 |
|---|---|
/pandaward:init | .pandaward/ を作成し、検出された内容を表示します |
/pandaward:scan | 正直な要約を添えてパッシブスキャンを実行します |
/pandaward:review | 自動化では判断できなかった項目を、読み取り専用の専門エージェントが確認します |
/pandaward:fix-plan | 修正を順番に並べ、承認後に 1 つずつ適用します |
/pandaward:retest | 変更後に再スキャンし、差分を表示します |
/pandaward:report | HTML、Markdown、JSON、SARIF、CSV |
/pandaward:status | 評価の進捗と古くなった情報を確認します |
プラグインは、リリースワークフローが各バージョンタグで公開する
pluginブランチおよびplugin-windowsブランチの、ビルド済みでチェックサム検証済みのバイナリをインストールします(検証方法)。Claude Code を使わずに PandaWard を使用するには、以下を参照してください。
CLI として
パッケージマネージャーを使用する場合:
brew tap ratomirjovanovic/pandaward https://github.com/ratomirjovanovic/pandaward && brew install ratomirjovanovic/pandaward/pandaward # macOS, Linux
scoop bucket add pandaward https://github.com/ratomirjovanovic/pandaward; scoop install pandaward/pandaward # Windows
または、リリースページからバイナリをダウンロードしてください(Linux と macOS は amd64 および arm64、Windows は amd64 に対応)。Linux での例:
v=v0.2.7
curl -fLO https://github.com/ratomirjovanovic/pandaward/releases/download/$v/pandaward-linux-amd64
curl -fLO https://github.com/ratomirjovanovic/pandaward/releases/download/$v/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
chmod +x pandaward-linux-amd64 && sudo mv pandaward-linux-amd64 /usr/local/bin/pandaward
Windows(PowerShell)では、pandaward-windows-amd64.exe を PATH 上のフォルダーに pandaward.exe として保存してください。
Invoke-WebRequest https://github.com/ratomirjovanovic/pandaward/releases/download/v0.2.7/pandaward-windows-amd64.exe -OutFile pandaward.exe
(Get-FileHash pandaward.exe).Hash # compare with the line in SHA256SUMS
または、Go 1.26 以降を使ってインストールします:go install github.com/ratomirjovanovic/pandaward/cmd/pandaward@latest。バイナリに実行時依存関係はありません。
brew upgrade pandaward または scoop update pandaward で更新できます。ダウンロードしたバイナリの場合は、新しいリリースのファイルに置き換えてください。削除するには、brew uninstall pandaward または scoop uninstall pandaward を実行するか、バイナリを削除してください。pandaward version で現在のバージョンを確認できます。
次に、プロジェクト内で次を実行します。
pandaward assess # init, scan with progress, reports and a summary
pandaward findings # then dig in
pandaward fix-plan
リリースバイナリは再現可能なビルドで、チェックサム、CycloneDX SBOM、署名済みビルド来歴が付属します。docs/VERIFYING.mdでは、その確認方法を説明しています。
動作の仕組み
flowchart LR
subgraph Claude Code
S[Skills /pandaward:*] --> M[MCP server]
A[Read-only agents] --> M
H[Hooks] --> L
end
CLI[pandaward CLI] --> E
M --> E[Engine]
E --> I[Inventory<br/>read-only walk]
E --> AD[Adapters<br/>built-in + optional tools]
E --> P[Scope and policy<br/>fail closed]
AD --> R[Redaction]
R --> EV[Evidence store<br/>SHA-256]
E --> L[(SQLite ledger)]
L --> RP[Reports<br/>HTML MD JSON SARIF CSV]
- インベントリ作成では、リポジトリを読み取り専用で走査し、ファイル、ルート、マニフェスト、ワークフロー、IaC、モバイルマニフェスト、AI/MCP の使用状況を記録します。
- 計画では、コントロールカタログ(ドメイン A から R)を検出した内容に対応付けます。該当するアセットがないコントロールは、確認可能な理由とともに
NOT_APPLICABLEになります。 - アダプターを実行します。組み込みチェックはオフラインで動作し、常に利用できます。gitleaks、semgrep、osv-scanner、trivy、apktool は、インストールされている場合にのみ使用されます。apktool は、プロジェクト内で見つかった
.apkファイルをデコードします(リソースのみで、アプリのコードは対象外です)。これにより、マニフェストチェックを配布するものに対しても実行できます(K-005)。このマシンで MobSF を自分で実行している場合は、scan.mobsf_url(例:http://127.0.0.1:8000)を設定し、REST API キーをMOBSF_API_KEYとしてエクスポートします。PandaWard は、見つかった.apkファイルと.ipaファイルをそのサーバーにアップロードし、静的スキャンを実行して、MobSF の高リスク項目と警告項目を K-006(APK)および L-005(IPA)の仮説として報告します。MobSF がバンドルされたライブラリコード内でのみ報告し、アプリ独自のパッケージ名前空間の外にあるコードの検出結果は、レビュー用に一覧表示されます。ループバックアドレスのみが受け入れられ、プロキシとリダイレクトは無視されます。また、キーが証拠、ログ、レポートに表示されることはありません。このアダプターは MobSF 4.5.3 に対してテストされています。semgrep がインストールされている場合は、PandaWard に同梱されたオフラインルール(rules/README.mdを参照)に加えて、設定したルールも実行します。自分で実行したアナライザー(CodeQL またはその他の SAST ツール)の SARIF 2.1.0 ファイルは、.pandaward/sarif/*.sarifおよびscan.sarif_filesに指定したパスからインポートされます。PandaWard がこれらのツールを実行することはありません。インポートした結果はコントロール R-002 の仮説として扱われ、スニペットは SARIF からではなく、ファイルから読み取って秘匿化されます。inventory.exclude内のディレクトリ(.next/やdist/などのビルド出力、node_modules/など)はすべてのアダプターに適用されます。スキャナーがそのようなディレクトリで報告した結果は破棄され、サマリーのアダプター行に件数が表示されます。 - 検出結果は秘匿化され、フィンガープリントが付与され、証拠に関連付けられます。繰り返し実行するたびに、そのライフサイクルが更新されます:
OPEN、REMEDIATED、REOPENED、FALSE_POSITIVE、RISK_ACCEPTED。同じファイル内の同一の検出結果は位置で区別されるため、そのうちの1つを修正すると、その検出結果のみが修正済みになります。ファイルが移動または改名された検出結果は、ID とステータスを維持し、修正済みではなく移動済みとして報告されます。 - ドメイン間のエッジは、共有アセットからのみ作成され、関連付けられたコントロールのステータスを引き継ぎます。
- レポートには、確認済みの検出結果、疑わしいシグナル、ドメインごとのカバレッジ、未決定のすべてのコントロール、証拠インデックスが表示されます。
Claude Code では、フックがコマンドなしで台帳を最新の状態に保ちます。編集されたファイルは変更に応じて古い状態としてマークされ、Claude が編集を伴うターンを終えると、PandaWard は変更箇所のみを対象にしたパッシブ再テスト(最大40秒)を実行し、新規または再オープンされた検出結果を Claude に渡します。Claude はそれらを説明し、修正を提示します。再テストで問題がなければ何も表示されません。時間切れまたは失敗の場合は、修正済みであると主張する代わりに、その旨を伝えます。無効にするには、.pandaward/config.yaml で hooks.auto_retest: false を設定します。
専門レビュー担当が実行中の間、それぞれの進捗を確認できます。プロンプトの下にあるサブエージェントパネルの各行には、経過時間、読み取ったファイル、検索内容、記録した仮説、現在確認中のファイルまたはパターンが表示され、Claude Code によって更新されます。チャットでは、レビュー担当が開始したとき、仮説を記録したとき、または完了したときに Claude がメッセージを送り、その間は約1分ごとに短い要約を伝えます。また、レビュー担当から10分間応答がない場合は警告します。チャットのメッセージには Claude Code の Monitor ツールが必要です。Windows では Git Bash が必要です。フックは、pandaward:* という名前のサブエージェントについてのみ、これらの情報を .pandaward/private/progress.jsonl に記録します。記録するのはファイル名と検索パターンであり、ファイルの内容は記録しません。pandaward progress を実行すると、ターミナルでも同じ進捗を確認できます。
チェック対象
| ドメイン | 現在オフラインで自動化されている項目 | レビューまたは実行環境が必要な項目 |
|---|---|---|
| A インベントリとアーキテクチャ | ファイル名と行番号を含むエントリーポイント(pandaward routes):Express、NestJS、Next.js、Flask、FastAPI、Django、Go、Spring、Laravel、Rails、ASP.NET の HTTP ルート(ルーターのプレフィックスとマウントを解決);GraphQL スキーマのオペレーション;gRPC サービス;キューコンシューマーと cron ジョブ;モノレポ内のサービス;OpenAPI の差分 | 脅威モデル |
| B 認証 | JWT の none または未検証のデコード、Cookie のフラグ | 失効済みの認証情報が拒否されること(staging-active);ログイン、リセット、MFA のフロー |
| C 認可 | テスト用 ID を使ったオブジェクトレベルおよび機能レベルの認可(staging-active)、ルートのレビュー(手動支援) | |
| D インジェクション | eval、シェル、SQL の連結、安全でないデシリアライズ | ZAP のアクティブスキャン(staging-active、オプトイン) |
| E シークレットと暗号 | 特異度の高い 16 種類のシークレット形式、追跡対象の .env ファイルと鍵ファイル、TLS 検証の無効化、脆弱なハッシュまたは乱数 | |
| F ビジネスロジック | 不変条件、冪等性、競合状態(手動支援) | |
| G API と Webhook | Webhook の署名検証の有無 | コントラクトと実行時の比較 |
| H Web | 生の HTML シンク、認証情報付きの CORS ワイルドカード | セキュリティヘッダー(production-observe) |
| I サプライチェーン | ロックファイルの欠落、npm のインストールスクリプト、バージョンが固定されていない Python の要件 | osv-scanner によるアドバイザリ |
| J インフラストラクチャ | Dockerfile の root ユーザーとバージョンが固定されていないベースイメージ、特権コンテナー、Terraform のパブリックストレージと管理ポート | trivy |
| K, L モバイル | Android マニフェストのフラグとエクスポートされたコンポーネント、SharedPreferences 内の認証情報、全ユーザーが読み取り可能なストレージ;iOS の ATS、リリース用エンタイトルメント内の get-task-allow、Keychain のアクセシビリティと UserDefaults 内の認証情報 | apktool によるビルド済み APK;ローカルの MobSF サーバーによるビルド済み APK と IPA;エミュレーターまたはシミュレーター上のアプリストレージ内の平文の認証情報(local-runtime) |
| N CI/CD | バージョンが固定されていないアクション、スクリプトインジェクション、pull_request_target のチェックアウト、トークンの権限 | |
| O オブザーバビリティ | ログ呼び出し内の認証情報 | アラートのレビュー |
| P AI と MCP | モデル出力が exec シンクに到達すること、MCP サーバーのバージョン固定とインライン認証情報 | プロンプトインジェクションのテスト |
| R アシュアランス | エビデンスの完全性、インポートされた SARIF の結果 |
pandaward capabilities を実行すると、各アダプターの成熟度を含む完全なカタログが表示されます。現在、すべてのアダプターは implemented_unvalidated です。オプションのツールアダプターは、すべてのプルリクエストで CI 上にて gitleaks 8.30.1、semgrep 1.182.0、osv-scanner 2.7.0、trivy 0.76.1 を使ってテストされます。このジョブは同梱の脆弱なフィクスチャをスキャンし、アダプターが完了しない場合、またはパーサーが想定される検出結果を見落とした場合に失敗します。他のバージョンも動作する可能性はありますが、検証されていません。
pandaward benchmark は、すべての組み込みルールを、バージョン管理された脆弱および安全なケースのコーパスに対して実行し、ルールごとの TP、FP、FN、TN、適合率、再現率を表示します。ルールが脆弱なケースを見落とした場合、または安全なケースで検出した場合、CI は失敗します。また、各リリースには benchmark.json が添付されます。適合率と再現率がそれぞれ 0.95 以上で、脆弱なケースが少なくとも 3 件、安全なケースが少なくとも 3 件ある場合にのみ、ルールは implemented_and_benchmarked として扱われます。現在、すべてのルールに各 1 件しかないため、該当するルールはまだありません。このコーパスは PandaWard 独自のものであるため、数値が示すのはこれらのケースに対する結果であり、実環境での精度ではありません。Java 用の公開 OWASP Benchmark では、組み込みルールのスコアは 0.00 です。ルールは単一行に照合し、データフローを追跡しないため、そのテストケースをひとつも検出しません(誤検出もありません)。Java のインジェクション検出には、Semgrep などのデータフローを認識するアナライザーを PandaWard 経由で使用してください。docs/BENCHMARKS.md に数値と再現方法が記載されています。
コマンド
| コマンド | 機能 |
|---|---|
pandaward assess | ローカル評価を一度に実行します。必要に応じて初期化し、進捗バーを表示しながらスキャンし、レポートと概要を出力します |
pandaward init | 設定と非公開台帳を含む .pandaward/ を作成します |
pandaward plan | 適用対象のコントロール、ゲート、候補エッジ、インベントリの不足を表示します |
pandaward scan [--fail-on high] | .pandaward/sarif/ からの SARIF インポートを含むパッシブスキャンを実行します。ゲートに到達すると終了コード 4 を返します |
pandaward retest [--changed] | 前回のスキャン以降に変更されたファイルを再スキャンし、差分を表示します。--changed を指定すると、変更によって影響を受けるコントロールのアダプターのみを再実行します |
pandaward status | カバレッジ、未解決の検出結果、古いファイル、ブロッカー、次のアクションを表示します |
pandaward findings [show ID] | 検出結果の一覧表示または詳細確認を行います。apply --file を使うと、複数の判断をまとめて記録できます |
pandaward graph [--format mermaid] | ドメインとドメイン間のエッジを表示します |
pandaward routes | 検出されたエントリーポイント(HTTP、GraphQL、gRPC、ワーカー、cron)をファイル名と行番号とともに表示します |
pandaward fix-plan | 修正手順を順序付きで表示します |
pandaward report [--format ...] | HTML、Markdown、JSON、SARIF 2.1.0、CSV 形式で出力します |
pandaward evidence show ID | verify | 編集済みのエビデンスを読み取るか、検証します |
pandaward diff [FROM TO] | 2 つの評価間における新規、再オープン、修正済み、移動、古い、免除済みの検出結果を表示します(デフォルト:前回と最新の評価を比較) |
pandaward progress [--watch] [--json] | ガイド付きレビューのレビュアーサブエージェントの作業内容を表示します。--watch を指定すると、すべての処理が完了するまで、開始、仮説、終了のたびに 1 行ずつ表示します |
pandaward export --bundle out.zip | レビュアー向けに、レポートと編集済みのエビデンスを SHA-256 マニフェスト付きで出力します。ツールの生出力は含めません |
pandaward verify-bundle out.zip | バンドル内のすべてのハッシュを再計算します。表示されたマニフェストハッシュを送信者のものと照合してください |
pandaward scope init | validate | approve | revoke | ネットワークテストの認可を行います |
pandaward test --profile production-observe | 承認済みオリジンのヘッダーと Cookie を確認します |
pandaward test --profile local-runtime | 実行中のエミュレーターに設定済みの Android テストビルドを、起動済みのシミュレーターに iOS テストビルドを保存します。実機は拒否されます |
pandaward test --profile staging-active | テスト用 ID で認可を確認した後、承認済みのステージングオリジンに対して ZAP スパイダーとパッシブスキャンを実行します。マニフェストで許可されている場合はアクティブスキャンも実行します |
pandaward feedback false-positive ID | false-negative | summary | 誤検出または見逃された検出結果のレポートを作成します。事前入力済みの課題リンクを表示しますが、送信はしません |
pandaward doctor | オプションのスキャナーと、それぞれに必要なネットワーク環境を表示します |
pandaward benchmark | 同梱のコーパスに対する組み込みルールごとの TP、FP、FN、TN を表示します |
pandaward selftest | 敵対的なフィクスチャーリポジトリ(コメント、README、OpenAPI、MCP の説明、スキャナー出力内の指示)をスキャン、レポート、MCP、フックに通し、PandaWard が誘導されなかったことを確認します。CI と各リリースで実行され、いずれかのケースが失敗すると失敗します |
pandaward mcp | プラグインが使用するローカルの stdio MCP サーバー |
pandaward telemetry [on | off | show] | オプトインの使用状況カウンターです。デフォルトではオフで、on の実行には対話型ターミナルが必要です(送信される情報) |
人による判断は明示的に記録されます。
pandaward findings false-positive PW-0007 --by "Jane" --note "constant input, not user controlled"
pandaward findings accept-risk PW-0003 --by "Jane" --note "internal tool" --expires 2027-03-01
pandaward findings apply --file decisions.json --by "Jane" # many at once, all or nothing
decisions.json は {"finding_id", "action", "note", "expires"} の配列です。action には confirm、false-positive、expires が必須の accept-risk、または reopen を指定します。書き込み前に各エントリーが検証されるため、無効なエントリーが 1 つでもあるとバッチ全体が拒否されます。Claude Code では、ガイド付き評価のトリアージ結果をこの方法で記録します。検出結果ごとに 1 回ずつ確認を求めるのではなく、一覧全体が 1 つの確認プロンプトに表示されます。
ネットワークテスト
ネットワークテストは、自分で有効にするまでオフになっています。
pandaward scope init # writes .pandaward/scope.yaml, unusable as shipped
# fill in owner, written permission reference, purpose, targets, limits, acknowledged: true
pandaward scope approve --by "Jane" # interactive terminal only, bound to the file's SHA-256
pandaward test --profile production-observe
pandaward test --profile staging-active # staging or local targets, needs ZAP
エンジンは、設定されたレートで、リストされたオリジンに最大 max_requests_total 件の GET リクエストを送信します。リダイレクトには従わず、接続時に解決されたすべてのアドレスをチェックします。マニフェストでローカルのテスト用フィクスチャが明示的に許可されていない限り、ループバック、プライベート、リンクローカルのアドレスは拒否され、クラウドのメタデータアドレスは常に拒否されます。scope.yaml を編集すると承認は無効になります。また、承認はプロジェクト外に保存されたユーザーごとのキー(ユーザー設定ディレクトリ内の approval.key)にも紐付けられているため、リポジトリと一緒に配布されたスコープファイルや台帳が承認済みと見なされることはありません。
staging-active は、インストール済みの ZAP(Java 17 以降が必要です。PandaWard がインストールすることはありません)を、その自動化フレームワーク経由で実行します。スパイダーとパッシブスキャンで M-001 を判定し、マニフェストで zap.active_scan: true が設定されている場合は、アクティブスキャンでも D-005(インジェクション)を判定します。ZAP はループバック上の PandaWard プロキシに接続されます。このプロキシが TLS を終端し、各リクエストを同じスコープガードに通すため、オリジン、除外パス、許可されたメソッド、リクエストの予算、レート制限、アドレスチェックがすべての ZAP リクエストに適用されます。ガードは 429 または 5xx の応答が 3 回連続した場合も停止します。失敗した ZAP の実行結果は ERROR、予算またはガードによって途中で打ち切られた実行結果は INCONCLUSIVE です。また、environment: production とマークされた対象は拒否されます。ZAP が PATH にない場合や、デフォルトのインストール場所にない場合は、.pandaward/config.yaml に runtime.zap_path を設定してください。
staging-active は、ZAP の実行前にマニフェストの authorization_checks も実行します。テスト用 ID(名前、テナント、認証情報を含むヘッダー、認証情報を格納する環境変数。認証情報そのものをファイルに記載することはありません)と、テスト用に存在するオブジェクトまたは関数への読み取り専用リクエストを列挙し、それぞれにアクセスを許可された ID を指定します。
identities:
- {name: alice, tenant: acme, header: Authorization, value_env: PANDAWARD_ID_ALICE}
- {name: bob, tenant: beta, header: Authorization, value_env: PANDAWARD_ID_BOB}
- {name: carol, tenant: acme, header: Authorization, value_env: PANDAWARD_ID_CAROL} # an admin
- {name: alice-logged-out, tenant: acme, header: Authorization, value_env: PANDAWARD_ID_OLD, revoked: true}
authorization_checks:
- {name: acme invoice, kind: object, method: GET, path: /api/invoices/inv_acme_1, allowed: [alice]}
- {name: user admin, kind: function, method: GET, path: /admin/users, allowed: [carol]}
各チェックは、すべての ID について 1 回ずつ、さらに認証情報なしで 1 回送信されます。許可された ID が 2xx の応答を受け取らない場合、そのチェックは判定できず、INCONCLUSIVE になります。許可されていない別の ID も 2xx を受け取った場合は検出事項となります。応答本文が許可された ID のものと一致する場合は CONFIRMED、異なる場合は STRONGLY_SUPPORTED です。オブジェクトのチェックでは C-001(BOLA)、関数のチェックでは C-002 を判定し、revoked とマークされた ID ではすべてのチェックで B-004 を判定します。許可されているのは GET と HEAD のみなので、データは変更されず、後片付けも不要です。証拠として ID ごとにステータス、サイズ、コンテンツタイプ、本文のハッシュを保存します。ヘッダー、本文、認証情報は保存しません。認証情報の環境変数がない場合、最初のリクエストを送信する前に実行を停止します。
エミュレーターとシミュレーターのチェック
pandaward test --profile local-runtime は、テストビルドが実際に保存した内容を確認します。ネットワーク通信は発生しないため、スコープマニフェストは必要ありません。
# .pandaward/config.yaml
runtime:
android_package: com.acme.shop # debuggable test build on a running emulator
ios_bundle_id: com.acme.shop # test build in a booted simulator (macOS)
Android では、adb を使い、emulator-* のシリアルに加えて ro.kernel.qemu=1 も報告されることを確認し、run-as を通じてアプリの shared_prefs を読み取ります。これはデバッグ可能なビルドでのみ動作します。iOS では xcrun simctl get_app_container booted を使い、CoreSimulator 内のコンテナのみを受け入れたうえで、アプリの設定 plist を読み取ります。認証情報に似たキー(token、password、session など)に空でない値がある場合、K-003 または L-002 の検出事項となります。PandaWard はキー名を記録し、値は記録しません。実機は拒否され、エミュレーター、シミュレーター、ツール、または設定がない場合は、その理由とともにコントロールが BLOCKED になります。トランスポートセキュリティと Keychain のアクセシビリティは、実行時にはテストされません。
CI で
permissions:
contents: read
security-events: write
steps:
- uses: actions/checkout@<pinned-sha>
- id: pandaward
uses: ratomirjovanovic/pandaward@<pinned-sha> # v0.1.3 or later
with:
fail-on: high # empty to never fail on findings
new-only: "true" # on pull requests, gate only on findings the change introduces
- if: always()
uses: github/codeql-action/upload-sarif@<pinned-sha>
with:
sarif_file: ${{ steps.pandaward.outputs.sarif-file }}
このアクションはリリースバイナリをダウンロードし、SHA256SUMS と照合してからスキャンを実行し、SARIF、HTML、Markdown、JSON のレポートを pandaward-report/ に書き込み、件数のみを含む短いジョブサマリーを追加します(summary: full では検出結果が一覧表示されます。公開リポジトリのジョブサマリーは公開されます)。new-only を指定すると、ベースコミットを別のワークツリーでスキャンし、フィンガープリントが新しい検出結果のみを件数に含めます。入力と出力については action.yml に記載されています。
各コミットの前に
pre-commit を使う場合は、これを .pre-commit-config.yaml に追加し、プロジェクトで pandaward init を一度実行してください。
repos:
- repo: https://github.com/ratomirjovanovic/pandaward
rev: v0.2.7
hooks:
- id: pandaward-system # uses the pandaward on your PATH; use id: pandaward to build it with Go 1.26+
フックは pandaward scan --quiet --fail-on high を実行し、未解決の重大度が高またはクリティカルな検出結果がある場合、コミットをブロックします。ステージ済みファイルだけでなく、作業ツリーをスキャンします。
PandaWard が通知しないこと
- アプリケーションが安全であるということ。脆弱性が存在しないことを証明できるツールはありません。
BLOCKED、UNSUPPORTED、SUSPECTED、INCONCLUSIVE、ERROR、STALEと報告された制御に関する情報。- まだ実装されていないランタイムテストの結果:ログイン、リセット、MFA のフロー(B-003)、API コントラクトとランタイムの照合(G-002)、LLM エンドポイントに対するプロンプトインジェクションテスト(P-003)は、現時点では
UNSUPPORTEDと報告されます。
PandaWard のレポートは、自動化された技術的評価です。認証、保証、法的見解、または独立した署名付きペネトレーションテストではありません。
ロードマップ
| マイルストーン | 範囲 | 状態 |
|---|---|---|
| M0 Foundation | CLI、台帳、スコープポリシー、インベントリ、静的レポート | 完了 |
| M1 Public alpha | 組み込みアダプター、オプションのツールアダプター、同梱の Semgrep ルール、エッジ、HTML/JSON/SARIF、プラグイン、署名付き再現可能リリース | 完了(v0.1.1) |
| M2 Context-safe beta | ドメインごとの無効化、対象を絞った再テスト、エビデンスバンドル、差分レポート、悪意あるリポジトリのテストスイート | 完了 |
| M3 Runtime beta | ロールとテナントのフィクスチャを備えたステージングプロファイル、ZAP アダプター | 完了 |
| M4 Mobile and AI | apktool とエミュレーターまたはシミュレーターによるストレージチェック、リリースをブロックする悪意あるリポジトリのテストスイート、MobSF アダプター、LLM エンドポイントテスト | 進行中 |
| 1.0 | 凍結されたスキーマ(完了)、ルールごとに脆弱なケースと安全なケースをそれぞれ 3 件以上含むベンチマークコーパス、外部レビュー | 進行中 |
詳細はイシューをご覧ください。
PenSec からの移行
PandaWard 0.2.0 は、名称を変更した PenSec です。既存の結果は引き継がれます。
- プロジェクトで最初に
pandawardコマンドを実行すると、台帳、エビデンス、レポート、設定、スコープマニフェストとともに.pensec/が.pandaward/に移動されます。.pensec/config.yamlまたはscope.yamlをコミットしていた場合は、名前を変更したファイルをコミットしてください。 - 承認は引き続き有効です。承認キーは、ユーザー設定ディレクトリにある旧
pensecフォルダーから引き継がれます。 PANDAWARD_*環境変数が設定されていない場合は、引き続きPENSEC_*環境変数が読み込まれます。PSEC-0007など既存の検出結果 ID は引き続き使えます。新しい検出結果にはPW-ID が付与されます。
ツールを一度切り替えてください。
/plugin uninstall pensec-windows@pensec # or pensec@pensec
/plugin marketplace remove pensec
/plugin marketplace add ratomirjovanovic/pandaward
/plugin install pandaward-windows@pandaward # or pandaward@pandaward on macOS and Linux
CLI:brew uninstall pensec && brew untap ratomirjovanovic/pensec を実行してから、上記の手順で pandaward をインストールしてください(Windows では scoop uninstall pensec; scoop bucket rm pensec)。CI では uses: の参照先を ratomirjovanovic/pandaward に変更してください。GitHub は現在、旧名称からリダイレクトしていますが、新しい名称を指定してください。
誤検出または見逃された検出結果
お知らせいただければ、ルールを修正します。pandaward feedback false-positive <PW-ID> または pandaward feedback false-negative --rule <id>(あるいは Claude Code で /pandaward:feedback)を実行すると、ルールのメタデータのみを含むレポートが作成され、入力済みのイシューリンクが表示されます。送信するまで、何も送信されません。レポートはルールごとにまとめられ、自動的に優先順位が付けられます。また、修正のたびにベンチマークケースが追加されます。docs/FEEDBACK.md をご覧ください。
コントリビューションとセキュリティ
コントリビューションを歓迎します。CONTRIBUTING.md から始めてください。PandaWard 自体の脆弱性は、SECURITY.md の説明に従って非公開で報告してください。
ライセンス
PandaWard は、GNU Affero General Public License v3.0(AGPL-3.0-only)の下で提供される、無料のオープンソースソフトウェアです。
企業内での利用を含め、使用、調査、改変、共有が可能です。PandaWard またはその改変版を配布する場合、あるいはネットワーク経由で他者に改変版を使用させる場合(ホスト型のスキャンサービスとして提供する場合など)は、対応する完全なソースコードを同じライセンスの下で公開する必要があります。これらの条件を満たせない用途については、著作権者から商用ライセンスを取得できます。
PandaWard が呼び出せるサードパーティ製スキャナーには、それぞれ独自のライセンスが適用されます。このライセンスは、評価対象のプロジェクトや、PandaWard がそれらについて作成するレポートには適用されません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。