
PoC для CVE-2025-62518, демонстрирующий протаскивание tar-архивов через разбор PAX-заголовков в tokio-tar, создание вредоносных полезных нагрузок и уязвимого экстрактора для демонстрации инъекции в цепочку поставок.
Видео: https://youtu.be/EYBB4BHsp9E
./outputmalicious.tar с примером скрытого содержимого, комментарии объясняют, что делается шаг за шагом и блок за блокомИспользуйте предоставленный скрипт воспроизведения или сделайте это вручную
Запустите malicious-payload, чтобы сгенерировать пейлоад
malicious.tarПередача этого файла нашему приложению vulnerable-extract даёт:
/vulnerable-extract$ ll output/
total 12
drwxrwxr-x 2 airinei airinei 4096 Jan 19 22:40 ./
drwxrwxr-x 5 airinei airinei 4096 Jan 19 22:40 ../
-rw-rw-r-- 1 airinei airinei 0 Jan 1 1970 benign_file.txt
-rw-rw-r-- 1 airinei airinei 18 Jan 1 1970 sh_profile_hijack
В то время как запуск предоставленной ОС утилиты tar (в данном случае (GNU tar) 1.35) даёт:
malicious-payload$ tar -tvf malicious.tar
---------- 0/0 1024 1970-01-01 02:00 benign_file.txt
Обратите внимание, что она видит размер файла 1024
Альтернативно, использование astral-tokio-tar 0.5.6 вместо заброшенного tokio-tar 0.3.1 корректно извлекает архив.
CVE-2025-62518 (TARmageddon) — это уязвимость безопасности, найденная в библиотеке tokio-tar на Rust (уязвимость Rust 😮). Это логическая ошибка в том, как обрабатываются заголовки формата tar, позволяющая злоумышленнику скрывать файлы.
Ошибка находится в логике обработки расширенных заголовков PAX. В архиве TAR существуют разные типы заголовков:
USTAR: стандартный заголовок, содержащий имя файла, права доступа и размер.PAX (тип x): расширенный заголовок, используемый для предоставления метаданных (например, очень большого размера файла) для следующего файла в архиве.Когда присутствует заголовок PAX, анализатор должен определить фактический размер файла, отдавая приоритет метаданным PAX перед стандартным заголовком USTAR.
Но ПОЧЕМУ существуют 2 типа заголовков с приоритетами для, казалось бы, одного и того же? Потому что формат TAR старый (стандартизирован в 1988), и USTAR имеет свои ограничения (размер до 8 ГБ, имя файла до 256 символов). Это проблема, поэтому заголовок PAX был добавлен в 2001 году для поддержки больших файлов и более длинных имён.
В уязвимых версиях tokio-tar анализатор корректно использует размер из заголовка PAX для чтения содержимого файла, но неверно использует размер из заголовка USTAR для определения начала заголовка следующего файла.
Суть проблемы — несоответствие указателей. Когда уязвимая библиотека обрабатывает файл, она использует два разных внутренних "указателя" для чтения потока:
В обычном архиве эти два указателя согласованы. В TARmageddon мы заставляем их разойтись. Устанавливая размер PAX равным 1024, а размер USTAR равным 0, мы создаём парадокс:
benign_file.txt.0 в заголовке USTAR и думает: "Я уже в конце файла." Он остаётся ровно на том же месте.Следовательно, указатель анализатора обрабатывает данные внутри 1024-байтового блока как следующий набор инструкций. Если эти данные выглядят как действительный заголовок TAR, библиотека "обнаружит" и извлечёт второй файл, который технически не существует согласно глобальной структуре архива.
Скрытый пейлоад:
Пейлоад создаётся как последовательность 512-байтовых блоков. Вот структура, используемая в генераторе malicious-payload:
| Блок | Роль | Описание |
|---|---|---|
| 1 и 2 | Метаданные PAX | Утверждает, что следующий файл имеет длину 1024 байта. |
| 3 | Базовый заголовок | benign.txt. Критически важно: устанавливает размер в 0. |
| 4 | Скрытый заголовок | backdoor.sh. Спрятан внутри "области данных". |
| 5 | Скрытые данные | Вредоносное содержимое (например, псевдонимы оболочки). |
| 6 и 7 | EOF | Стандартное завершение нулевыми блоками. |
Поскольку стандартные инструменты (например, GNU tar) корректно следуют размеру PAX, они видят блоки 4 и 5 как безвредные двоичные данные, принадлежащие benign_file.txt. Они никогда не "выполняют" заголовок в блоке 4.
Как можно эксплуатировать эту уязвимость в крейте и почему файл, скрытый в архиве, имеет значение?
Злоумышленник протаскивает вредоносные файлы в систему сборки. Извлечение такого архива для разработки или на CI-машине может перезаписать легитимные файлы сборки, скомпрометировать эту машину и даже обмануть систему сборки, заставив её подписать вредоносные файлы.
Сканер проверяет .tar, сканируя его только в правильном режиме, но нежелательные файлы могут присутствовать при извлечении, хотя не были отсканированы
Вдохновлено этим описанием