
Доказательство концепции, демонстрирующее обход пути через жёсткие ссылки в npm-пакете tar, позволяющее перезаписывать файлы за пределами каталога извлечения с помощью специально созданных архивов.
Исследование: Joshua van Rijswijk
Этот репозиторий содержит Proof of Concept (PoC) для CVE-2026-29786 — уязвимости в npm-пакете tar, которая позволяет специально созданному архиву создать жёсткую ссылку, указывающую за пределы целевой директории извлечения.
Проблема возникает, когда tar-архив содержит цель ссылки, зависящую от диска, например C:../target.txt. Из-за порядка, в котором библиотека выполняет проверку и нормализацию путей при извлечении, защита от обхода директории может быть обойдена.
После нормализации путь становится ../target.txt, что позволяет цели ссылки выйти за пределы настроенной директории извлечения.
При записи в извлечённый файл внешний файл изменяется, поскольку оба пути ссылаются на одну и ту же жёсткую ссылку.
Уязвимость возникает в логике извлечения, отвечающей за обработку абсолютных путей (Unpack[STRIPABSOLUTEPATH]).
Обнаружение обхода директории выполняется удаления абсолютного пути.
Пример вредоносного значения заголовка
linkpath: C:../target.txt
Порядок обработки:
Путь разбивается на сегменты для обнаружения обхода директории.
Проверка обхода ищет сегменты "..".
Поскольку сегмент выглядит как "C:..", проверка не срабатывает.
Функция stripAbsolutePath() позже удаляет префикс диска (C:).
Результирующий путь становится:
../target.txt
Это позволяет пути выйти за пределы корневой директории извлечения.
Злоумышленник может перезаписать файлы за пределами директории извлечения с правами процесса, выполняющего извлечение.
Возможные реальные сценарии включают:
• Инструменты командной строки, извлекающие недоверенные tar-архивы • Сборочные конвейеры, обрабатывающие сторонние артефакты • Сервисы, импортирующие предоставленные пользователем tar-файлы • Менеджеры пакетов или плагинные системы, распаковывающие архивы
npm install [email protected]
node poc.cjs
Скрипт генерирует вредоносный tar-архив и демонстрирует, что запись в извлечённый файл приводит к перезаписи файла за пределами директории извлечения.