CVE-2025-11001 - Arbitrary Code Execution
Эксплойт позволяет обойти привилегии и выполнить произвольный код на системе, где 7-Zip используется с повышенными правами (например, в сервисах или автоматизированных задачах). Может привести к компрометации системы, краже данных или эскалации привилегий, особенно в enterprise-средах, где 7-Zip часто применяется для обработки архивов.
Сообщество THREAD предупреждает, что перед запуском предоставленного программного обеспечения необходимо проявить особую осторожность. Для защиты рабочих станций от возможного заражения рекомендуется использовать виртуальную машину или песочницу.
Все осуществляется на ваш страх и риск!
Технические детали
- Пораженные версии: 7-Zip 21.02 — 25.00.
 - Платформы: Windows (требует административных привилегий для эксплуатации).
 - Тип уязвимости: Arbitrary Code Execution через злоупотребление симлинками (CWE-59, symlink traversal).
 - CVSS v3.1: 7.8, вектор: CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H, так как требует локального доступа и повышенных привилегий, но позволяет выполнение кода от имени процесса.
 - Точка входа: Обработка архивов в 7-Zip (7z.exe), уязвимая к созданию симлинков при извлечении ZIP-архива.
 - Метод эксплуатации: Создание ZIP-архива с вредоносными симлинками, которые при извлечении с правами администратора приводят к записи в произвольные файлы и выполнению кода (например, через копирование исполняемого файла).
 - Ограничения: Работает только на Windows; требует запуска 7-Zip с административными правами (например, от сервисного аккаунта); не эксплуатируется на других ОС.
 
Влияние
Скрипт позволяет записывать произвольные файлы (например, исполняемые) в целевые директории (например, Desktop) за пределы зоны распаковки через crafted ZIP-архив. Это может привести к начальной компрометации системы, если 7-Zip запускается с повышенными правами (например, в сервисах или автоматизированных задачах). Уязвимость особенно опасна в сценариях, где ZIP-файлы обрабатываются автоматически.
- Использует стандартные Python-модули: zipfile для создания ZIP-архивов, os и shutil для манипуляций с файлами, argparse для обработки аргументов командной строки.
 - Константы: Неявные, такие как пути к временным файлам и payload'ам.
 - Параметры: Принимает целевой каталог (-t), выходной ZIP-файл (-o) и файл данных (например, исполняемый файл для внедрения, --data-file).
 
- Основная логика в exploity.py: Создаёт ZIP-архив с симлинком (data/link -> C:\target), затем директорией и файлом (data/link/file.exe).
 - add_symlink: Добавляет симлинк в ZIP с Linux-стилем, содержащий абсолютный Windows-путь.
 - add_file_via_symlink: Добавляет файл, который будет извлечён через симлинк, вызывая запись в target.
 - Вывод: Генерирует ZIP-файл для последующей распаковки в 7-Zip.
 
- Принимает целевой путь, выходной файл и data-file через аргументы.
 - Пример: python3 exploity.py -t "C:\Users\pac\Desktop" -o demo.zip --data-file calc.exe.
 - Создаёт ZIP, готовый к распаковке в уязвимой версии 7-Zip.
 
- Уязвимость: 7-Zip некорректно конвертирует Linux-симлинки в Windows во время извлечения, не распознавая абсолютные пути как опасные из-за ошибок в парсинге (CLinkInfo::Parse устанавливает isRelative=true для путей вроде "C:" из-за Linux-чеков).
 - Техника: Path traversal via symlink — симлинк создаётся первым, обходя IsSafePath (путь считается relative после префикса директории ZIP), затем файлы пишутся по симлинку без финальной проверки (проверка только для директорий).
 
data/link (симлинк: C:\Users\YOURUSERNAME\Desktop) data/link/ (директория, создаваемая после симлинка) data/link/calc.exe (файл, записываемый в Desktop)
- Симлинк в ZIP: Linux-style с содержимым "C:\target" (байты для symlink). Обход:
 - relatPath = ZIP_dir_prefix + linkPath ("data/" + "C:\target") проходит IsSafePath как relative; финальная проверка пропускается (!IsDir).
 
Проверяет возможность создания симлинка
if (linkInfo.isRelative) { relatPath = GetDirPrefixOf(_item.Path); // "data/" relatPath += linkInfo.linkPath; // "C:\target" if (!IsSafePath(relatPath)) { return error; } // Проходит как safe }Финальная проверка пропускается
if (_item.IsDir) { // Симлинк не IsDir, skip if (linkInfo.isRelative) { // Проверка уровней и абсолютности, но не вызвана } }