Уязвимость в NPM, приводящая к перезаписи файлов в системе
9 сентября 2021 года
Компания GitHub раскрыла подробности о семи уязвимостях в пакетах tar и @npmcli/arborist, предоставляющих функции для работы с tar-архивами и расчета дерева зависимостей в Node.js. Уязвимости позволяют при распаковке специально оформленного архива перезаписать файлы за пределами корневого каталога, в который осуществляется распаковка, насколько это позволяют текущие права доступа. Проблемы дают возможность организовать выполнение произвольного кода в системе, например, через добавление команд в ~/.bashrc или ~/.profile при выполнении операции непривилегированным пользователем или через замену системных файлов при запуске с правами root.
Опасность уязвимостей усугубляется тем, что проблемный код используется в пакетном менеджере npm при операциях с npm-пакетами, что позволяет организовать атаку на пользователей, разместив в репозитории специально оформленный npm-пакет, при обработке которого в системе будет выполнен код злоумышленника. Атака возможна даже при установке пакетов в режиме «--ignore-scripts», отключающем выполнение встроенных скриптов. Всего npm затрагивает четыре уязвимости (CVE-2021-32804, CVE-2021-37713, CVE-2021-39134 и CVE-2021-39135) из семи. Первые две проблемы касаются пакета tar, а остальные две пакета @npmcli/arborist.
Наиболее опасная уязвимость CVE-2021-32804 вызвана тем, что при очистке указанных в архиве tar абсолютных путей некорректно обрабатываются повторяющиеся символы «/» — удаляется только первый символ, а остальные оставляются. Например, путь «/home/user/.bashrc» будет преобразован в «home/user/.bashrc», а путь «//home/user/.bashrc» в «/home/user/.bashrc». Вторая уязвимость CVE-2021-37713 проявляется только на платформе Windows и связана с некорректной очисткой относительных путей, включающих неразделённый символ диска («C:some\path») и последовательность для возврата в предыдущий каталог («C:../foo»).
Уязвимости CVE-2021-39134 и CVE-2021-39135 специфичны для модуля @npmcli/arborist. Первая проблема проявляется только на системах, не различающих регистр символов в ФС (macOS и Windows), и позволяет записать файлы в произвольную часть ФС, указав в числе зависимостей два модуля '«foo»: «file:/some/path»' и 'FOO: «file: foo.tgz»', обработка которых приведёт удалению содержимого каталога /some/path и записи в него содержимого foo.tgz. Вторая проблема позволяет перезаписать файлы через манипуляцию с символическими ссылками.
Уязвимости устранены в выпусках Node.js 12.22.6 и 14.17.6, npm CLI 6.14.15 и 7.21.0, а также в отдельных выпусках пакета tar 4.4.19, 5.0.11 и 6.1.10. Получив информацию о проблеме в рамках инициативы «bug bounty», GitHub выплатил исследователям $14500 и просканировал содержимое репозитория, в котором не было выявлено попыток эксплуатации уязвимостей. Для защиты от указанных проблем GitHub также ввёл запрет на публикацию в репозитории NPM-пакетов, включающих символические ссылки, жёсткие ссылки и абсолютные пути.
Источники
правитьКомментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.