
CVE-2026-0300(PAN-OS User-ID 認証ポータルの露出)向けの読み取り専用監査ツール
CVE-2026-0300 用の読み取り専用監査ツール — PAシリーズおよびVMシリーズファイアウォールのPAN-OS User-ID認証ポータル(旧称「キャプティブポータル」)における未認証バッファオーバーフローに関するものです。
このリポジトリは、Tailwind Resource Group セキュリティアドバイザリ TRG-SA-2026-003 に付随するもので、以下を提供します:
audit_portal.py — ティア1: 単一ファイアウォールの監査audit_fleet.py — ティア2: Panorama駆動のフリートスイープ(並行処理)panos_audit.py — 両CLIで使用される共有ライブラリスクリプトは読み取り専用です。PAN-OS XML APIに対してshow形式のクエリを発行し、設定を変更することは一切ありません。APIキーはURLクエリパラメータではなくX-PAN-KEY HTTPヘッダーで送信されるため、PAN管理プレーンアクセスログ、TLS検査プロキシログ、監査者のプロセス引数には表示されません。
CVEレコードでは、最新の機能名「User-ID認証ポータル」が使用されています。PAN-OS XMLスキーマ、CLI設定項目、ドキュメントのURLパスでは、依然としてレガシーなcaptive-portalという語彙が使用されています。show config running | match authentication-portalでフリートを監査する運用担当者は、その文字列が設定要素として一切出現しないため、すべての設定を黙って見逃してしまいます。このツールは、設定が作成された時期に関係なく、スキーマ上正しい要素名を検索します。
この命名上の落とし穴に関するTailwindの完全な分析は、TRG-SA-2026-003「キャプティブポータルのレガシーフットプリント」に記載されています。
pip installは不要--insecureは一度限りの立ち上げ監査用にのみ提供されていますexport PAN_API_KEY="<key>"
./audit_portal.py --hostname fw1.example.com
テーブル出力の例:
vsys: vsys1
configured: True
enabled: True
redirect_host: auth-portal.internal.example.com
mode: redirect
bound: ethernet1/3(internal-trust), ethernet1/4(guest)
tls_verified: True
risk: EXPOSED_LIKELY
その他の出力形式: --output json または --output csv。
その他のフラグ: 単一vsys監査用の--vsys <name>、遅い上流システム用の--timeout/--retries、stderrへの詳細なエラー情報出力用の--debug。
export PAN_API_KEY="<panorama-key>"
./audit_fleet.py --hostname panorama.example.com --workers 16 --output csv > fleet-audit.csv
CSVの各行は、ポータルステータス、リダイレクトホスト、モード、インターフェースバインディング、リスク分類を持つ1つのデバイス-vsysです。スクリプトはPanoramaのtarget=<serial> APIパラメータを使用するため、管理対象ファイアウォールに直接接続することはありません — Panoramaへの1接続でフリート全体をスイープします。
注目すべきフラグ:
--workers N — 並行監査スレッド数(デフォルト8、最大32)。1000デバイスのフリートでも、シリアルスイープなら1時間以上かかるところを数分で完了します。--timeout, --retries — API呼び出しごとの設定。一時的なURLErrorとHTTP 5xxは、制限付きバックオフで再試行されます。--exclude-disconnected — デフォルトでは、切断されたデバイスはrisk=DISCONNECTEDとして含まれ、パッチ適用期間中も表示され続けます。このフラグを使用すると除外できます。--min-expected-devices N — PanoramaがN未満のデバイスを返した場合に警告(stderr)を出力します。既知のフリートサイズに対する応答の切り詰めを検出するのに役立ちます。--serial-filter '0007*' — シリアル番号でグロブフィルタリングし、サブセットを監査します。--debug — デバイスごとの詳細なエラー情報をstderrに出力します(上流のreason文字列を含みます。顧客向けCSVへのホスト名漏洩を避けるため、デフォルトではオフです)。出力のrisk列は次のいずれかです:
EXPOSED_LIKELYはヒントであり、判定ではありません — ゾーン名は運用担当者の慣例であり、強制ではありません。このスクリプトはセキュリティポリシーのウォークを置き換えることはできません。フリート出力を、最初に注意を向けるべき場所に分類するものです。
行うこと:
<captive-portal>ブロックをクエリします(スキーマ要素名は、UIの名称やPAN-OSバージョンに関係なく常にcaptive-portalです)。EXPOSED_LIKELY行がフリート出力で最初に表示されるようにします。X-PAN-KEYヘッダーでAPIキーを送信し、URLアクセスログやプロセス引数に残らないようにします。行わないこと:
PAN-OS APIキーは、それを生成したユーザーのロールと権限を継承します。
重要な注意点: PAN-OSには読み取り専用のXML API権限はありません。
XML APIタブのAdmin Role権限は、カテゴリごとにバイナリの有効/無効です — Configuration、Operational Requests、Commit、Export、Import、Report、Log、User-ID Agent。XML APIのConfigurationを有効にすると、
showとset/edit/delete/move/rename/cloneの両方のアクションが許可されます。Operational Requestsを有効にすると、<request><restart>を含む任意の<request>操作が許可されます。Web UIタブとREST APIタブでは読み取り専用がオプションとして提供されていますが、XML APIタブにはありません。これらのXML APIカテゴリを有効にして作成された「監査ユーザー」は、デバイス上で完全なXML API書き込み権限を保持します。生成されたキーは特権資格情報として扱ってください: 監査期間にライフタイムを限定し、シークレットマネージャーに保存し、作業完了時にユーザーを無効化してください。
正規のPANリファレンス: APIキーの取得(PAN-OS XML API)
ファイアウォール(またはaudit_fleet.pyを使用する場合はPanorama)上で:
Admin Roleを作成します。 Device > Admin Roles(またはPanorama > Admin Roles)に移動します。Addをクリックします。
audit-config-and-opという名前を付けます。監査ユーザーを作成します。 Device > Administrators(またはPanorama > Administrators)に移動します。Addをクリックします。
audit-cve-2026-0300。audit-config-and-opを選択します。新しいユーザーの資格情報でAPIキーを生成します。 PAN-OSはWebUIに「APIキー生成」ボタンを公開していません — keygenエンドポイントがサポートされているパスです。資格情報がURLアクセスログに記録されないよう、POST本文を使用します:
read -rs AUDIT_PW; echo
export PAN_API_KEY="$(curl -ksX POST "https://fw1.example.com/api/" \
--data-urlencode "type=keygen" \
--data-urlencode "user=audit-cve-2026-0300" \
--data-urlencode "password=$AUDIT_PW" \
| grep -oE '<key>[^<]+' | cut -c6-)"
unset AUDIT_PW
read -rsはパスワードを端末にエコーせず、シェル履歴にも残さずに読み取ります。スクリプトは結果のを環境から読み取り、 HTTPヘッダーで送信します — パスワードもキーも、スクリプト実行中にURLアクセスログやに表示されません。
read -rsはパスワードをカバーします。PAN_API_KEYのキーについては、ファイルから貼り付けるのではなく、上記のスニペットで対話的に設定することをお勧めします。ファイルからソースする必要がある場合は、セッションでset +o historyを使用してください。--insecureフラグは、TLSホスト名チェックと証明書検証を完全に無効にします。経路上の攻撃者は監査応答をMITMし、侵害されたデバイスに対してportal_enabled=Falseを報告できます。audit_fleet.pyスクリプトは、フリートスイープで--insecureと併用して--accept-mitm-riskを要求します。これは、改ざんされた応答の爆発半径がフリート全体に及ぶためです。0 — 監査されたvsysでポータルが有効になっていない2 — vsysが見つからない(一時的またはサポートされていない設定)3 — 少なくとも1つのvsysでポータルが有効(レビューが必要)4 — API呼び出しが失敗(認証、TLS、ネットワーク)「ポータル有効」で非ゼロ終了するのは意図的です — クリーンなシグナルを必要とするCI / フリートスイープパイプラインにスクリプトを配線できるようにするためです。
Apache License, Version 2.0の下でライセンスされています。完全な条件についてはLICENSEを参照してください。
商用利用は許可されています。帰属表示が必要です(二次的著作物に著作権表示とライセンスファイルを保持してください)。
Copyright 2026 Tailwind Resource Group.
| ラベル | 意味 |
|---|
INFO_NOT_CONFIGURED | デバイスに<captive-portal>ブロックがない。CVE-2026-0300の対象外。 |
INFO_DISABLED | ポータルは設定されているがenabled=no。脆弱なコードパスはアクティブではない。 |
REVIEW_POLICY_NO_BINDINGS | ポータルは有効だが、設定にインターフェースバインディングが見つからない。WebUIで確認してください。 |
EXPOSED_LIKELY | ポータルが有効で、名前が信頼できないネットワークへの露出を示唆するゾーン(untrust、dmz、guest、external、internet、wan、public)にバインドされている。最初に調査してください。 |
REVIEW_POLICY | ポータルが有効で、内部名のゾーンにバインドされている。セキュリティポリシーを確認して到達可能性を確認してください。 |
PAN_API_KEYX-PAN-KEYps auxww監査作業完了時にユーザーを無効化します。 Device > Administratorsに移動し、audit-cve-2026-0300を見つけて、Delete(またはユーザーの無効化)をクリックします。Commitします。これにより、そのユーザーに対して生成されたすべてのキーが無効になります。