Какую опасность несут 15-летние уязвимости?

Разработчики рядового модуля для Python недавно узнали на практике, чем опасны старинные незакрытые уязвимости.

Уязвимость в модуле tarfile

В сентябре 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. Источник.

Первый — программа Universal Radio Hacker для анализа записей радиоэфира. Программа сохраняет данные в виде проектов, представляющих собой множество файлов, упакованных в tar. Исследователи продемонстрировали, как попытка открыть «подготовленный» архив приводит к записи исполняемого файла в директорию автозапуска Windows. Соответственно, при следующей перезагрузке системы этот код будет выполнен. Помимо прочего, данную уязвимость можно эксплуатировать на разных платформах.

Второй пример, показанный на видео, чуть сложнее. Среда разработки Spyder IDE сохраняет данные в архивах tar. При импорте этих данных исследователи сначала повторили эксперимент с «подкидыванием» файла, но потом сделали «круче»: реализовали запуск произвольного кода при следующем старте инструмента разработки Spyder. Конечной точкой этого эксперимента стал вывод запроса на выполнение произвольного кода уже с привилегиями администратора системы.

Непредсказуемые последствия

История 15-летнего бага еще раз показывает, что нельзя недооценивать уязвимости, позволяющие записывать данные куда угодно. Даже если это «делается по правилам» и пути эксплуатации сразу не особенно очевидны.

Tarfile входит в стандартную библиотеку Python и найдется практически в любой системе семейства Linux (и не только). Однако опасность представляет использование конкретной уязвимой функции. По большому счету, от уязвимости в tarfile может пострадать любой проект, разработанный на Python, если в нем используется этот модуль. С точки зрения конечного пользователя это непростая ситуация: у него работает потенциально уязвимая программа, при этом он даже может не знать, что внутри используется tar. Эксперты «Лаборатории Касперского» рекомендуют:

  • ограничить обработку файлов из недоверенных источников;
  • исполнять сторонние программы с минимальными привилегиями, чтобы минимизировать возможности атаки;
  • произвести аудит установленного ПО наиболее критичных систем, чтобы выявить те, которые используют уязвимый пакет.

Для разработчиков данная проблема — повод провести аудит собственного кода, чтобы найти вызовы уязвимой функции и эти места заменить.

Советы