Zip Slip возвращается в Node.js

?v=1

Не так давно, в 2018 году, прогремел хорошо забытый новый вид атак — Zip Slip.

Zip Slip является широко распространенной критической уязвимостью распаковки архивов, позволяющей злоумышленникам записывать произвольные файлы в систему, что обычно приводит к удаленному выполнению команд. Она была обнаружена и раскрыта командой Snyk Security в преддверии публичного разглашения — 5 июня 2018 года и затронула тысячи проектов, в том числе HP, Amazon, Apache, Pivotal и многие другие.


Дополнительную информацию о технических подробностях Zip Slip можно найти на сайте.

С тех пор большинство фреймворков и языков, в которых были обнаружены эти уязвимости, были исправлены, и об уязвимости давно не было слышно.

Но совсем недавно появился новый случай не менее интересный, чем предыдущие.
Zip Slip в популярной библиотеке для Node.js — «decompress».
Автор удивил не столько самой уязвимостью, сколько техникой эксплуатации этой уязвимости при помощи Race Condition.

Race Condition (прим, Состояние гонки), также конкуренция — ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.


Прекрасные примеры эксплуатациия подобной уязвимости смотрите по ссылке.

Подробное описание уязвимости приведено в issues к репоозиторию проекта.

Что касается особенностей эксплуатации — вот что пишет автор:

Обратите внимание, что это не будет работать «из коробки» с .zip-архивами, так как yauzl будет бросать исключение, если имя файла содержит »…».

Однако поскольку этот пакет также поддерживает символические ссылки, мы можем использовать их вместо этого, чтобы обойти это ограничение.

Но простое добавление символической ссылки для нашей цели не поможет. Так как файлы архива распаковываются асинхронно, мы окажемся в состоянии гонки между распаковыванием символической ссылки и файлом, на который она ссылается.

Создавая каталог, и внутри него создавая символическую ссылку на его родительский каталог, продолжаем создавать сим. ссылки до / и файла с именем, используя зацикленную структуру всех сим. ссылок на объект. В итоге мы получаем что-то вроде:

mkdir generic_dir
ln -s ../ generic_dir/symlink_to_parent_dir
ln -s / symlink_to_root
touch generic_dir/symlink_to_parent_dir/generic_dir/symlink_to_parent_dir/[...]/symlink_to_root/tmp/slipped_zip.txt

Добавление этого в архив позволяет нам всегда выигрывать гонку!


А теперь попробуй представить как это работает! ;)

Для данной уязвимости был забронирован идентификатор: CVE-2020–12265.

Автор заметки: Егор Богомолов, Head of Information Security Servises, HackerU Russia

© Habrahabr.ru