Уязвимость в GNU tar, позволяющая перезаписать сторонние файлы

В утилите GNU tar выявлена уязвимость (CVE-2016-6321), позволяющая при раскрытии архива осуществить запись вне целевого пути, заданного в командной строке. Например, запуск распаковки одного файла, может привести к перезаписи другого файла или раскрытию файлов в обход заданным маскам и исключениям.

Подготовив специальным образом архив атакующий может добиться записи сторонних файлов при распаковке, например, подменить ключ входа по SSH или сценарии автозапуска bash при распаковке в домашнюю директорию. В случае если архив распаковывается пользователем root возможно организовать перезапись системных файлов и получить полномочия суперпользователя (например, переписав crontab). Интересно, что информация о проблеме была отправлена сопровождающему GNU tar ещё в марте, но из-за специфичных условий её проявления сопровождающий не посчитал указанную проблему уязвимостью, поэтому проблема на момент публикации эксплоита остаётся неисправленной. Представители Red Hat признали проблему и присвоили ей средний (moderate) уровень опасности.

Уязвимость связана с некорректным вырезанием символов «..» из путей в архиве — при наличии «..» перед распаковкой осуществляется удаление части пути, предшествующей «..», но проверка соответствия маскам осуществляется по исходному варианту. Например, подготовив архив с файлом «etc/motd/../etc/shadow», атакующий может переписать etc/shadow в случае попытки раскрытия файла etc/motd (tar удалит «etc/motd/../», но оставит «etc/shadow», который будет обработан, несмотря на то, что явно инициирована распаковка только etc/motd).

Условием успешного проведения атаки является необходимость соответствия части присутствующего в архиве пути с задаваемой при распаковке целевой директорией, т.е. часть до символов «..» должна совпадать с заданным для распаковки файловым путём или соответствовать маске распаковки, заданной через опцию «—wildcards». Данное ограничение сужает область применения атаки системами с предсказуемыми путями распаковки, например, приложениями распаковывающими архивы в заранее известные директории.