В сентябре 2022 года компания Trellix опубликовала отчет об уязвимости в модуле tarfile. Это стандартная библиотека языка программирования Python, воспользоваться которой может любой желающий. Уязвимость позволяет записать в произвольную папку на жестком диске произвольный файл, а в некоторых случаях может приводить к выполнению вредоносного кода. Особенность данного исследования заключается в том, что проблема в Tarfile была обнаружена в августе 2007 года, почти ровно 15 лет назад! Но тогда ее не посчитали опасной. Давайте разберемся, почему так вышло и с какими проблемами в результате могут столкнуться разработчики софта на Python и пользователи этих программ.
Tarfile в деталях
Tarfile содержит код для работы с архивами формата tar. Этот формат широко используется в Unix-подобных операционных системах, а его история началась очень давно — в 1979 году. Tar — это простой способ упаковать большое количество файлов и папок. Изначально данная функциональность требовалась для удобной записи резервных копий на магнитную ленту. Теперь же в архивах tar может применяться и сжатие файлов, хотя это не обязательно. Модуль tarfile отвечает за создание и распаковку таких архивов, он используется разработчиками программ на языке Python как готовый инструмент для подобных задач.
Уязвимость в tarfile достаточно простая, она исчерпывающе описана в оригинальном багрепорте за август 2007 года. Это даже не совсем уязвимость: просто tarfile в точности воссоздает структуру папок, содержащуюся в архиве, при его распаковке. В том числе если имя файла в архиве представляет собой что-то вроде »../../../../../etc/passwd». Если распаковать такой архив от имени администратора системы, файл passwd запишется вовсе не в директорию, в которой расположен сам архив. Отрабатывая указатели »..», распаковщик сначала дойдет до корневой директории, а потом перезапишет файл passwd в директории etc. В Linux это будет означать стирание штатного файла с данными всех пользователей системы.
Опасность здесь в том, что пользователь программы, в которой применен модуль tarfile, не знает, чем закончится обычная распаковка обычного архива. Может, и ничем, а возможно, какие-то файлы появятся в неожиданном месте. Или документы пользователя будут перезаписаны. Автор багрепорта ссылается на такую же проблему в самом архиваторе tar, исправленную еще в 2001 году, больше 20 лет назад. Но в tarfile эта уязвимость так и не была закрыта.
15 лет ожидания
По результатам обсуждения потенциального бага в 2007 было решено… ничего не делать — по двум причинам. Во-первых, такая обработка файлов находится в полном соответствии с Unix-стандартом POSIX (и это действительно так). Во-вторых, «нет возможности практической эксплуатации». Ограничились предупреждением в «Руководстве пользователя», что распаковывать файлы из недоверенных источников с помощью tarfile не рекомендуется.
Справедливость этой оценки стала понятна в 2022 году: специалисты Trellix как раз показали, что возможность практической эксплуатации еще как есть. Причем не только записи данных куда попало — можно реализовать и запуск произвольного кода. Напомним, что речь идет о библиотеке для программистов, то есть возможность атаки зависит от конкретного ПО, в котором применен модуль tarfile. В Trellix показали два примера.

Уязвимый фрагмент кода в программе Universal Radio Hacker. Источник.
Первый — программа Universal Radio Hacker для анализа записей радиоэфира. Программа сохраняет данные в виде проектов, представляющих собой множество файлов, упакованных в tar. Исследователи продемонстрировали, как попытка открыть «подготовленный» архив приводит к записи исполняемого файла в директорию автозапуска Windows. Соответственно, при следующей перезагрузке системы этот код будет выполнен. Помимо прочего, данную уязвимость можно эксплуатировать на разных платформах.
https://www.youtube.com/watch?v=jqs8S51_ENg
Второй пример, показанный на видео, чуть сложнее. Среда разработки Spyder IDE сохраняет данные в архивах tar. При импорте этих данных исследователи сначала повторили эксперимент с «подкидыванием» файла, но потом сделали «круче»: реализовали запуск произвольного кода при следующем старте инструмента разработки Spyder. Конечной точкой этого эксперимента стал вывод запроса на выполнение произвольного кода уже с привилегиями администратора системы.
Непредсказуемые последствия
История 15-летнего бага еще раз показывает, что нельзя недооценивать уязвимости, позволяющие записывать данные куда угодно. Даже если это «делается по правилам» и пути эксплуатации сразу не особенно очевидны.
Tarfile входит в стандартную библиотеку Python и найдется практически в любой системе семейства Linux (и не только). Однако опасность представляет использование конкретной уязвимой функции. По большому счету, от уязвимости в tarfile может пострадать любой проект, разработанный на Python, если в нем используется этот модуль. С точки зрения конечного пользователя это непростая ситуация: у него работает потенциально уязвимая программа, при этом он даже может не знать, что внутри используется tar. Эксперты «Лаборатории Касперского» рекомендуют:
- ограничить обработку файлов из недоверенных источников;
- исполнять сторонние программы с минимальными привилегиями, чтобы минимизировать возможности атаки;
- произвести аудит установленного ПО наиболее критичных систем, чтобы выявить те, которые используют уязвимый пакет.
Для разработчиков данная проблема — повод провести аудит собственного кода, чтобы найти вызовы уязвимой функции и эти места заменить.