Компания 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”, а путь “https://home/user/.bashrc” в “/home/user/.bashrc”.
Вторая уязвимость CVE-2021-37713 проявляется только на платформе Windows и связана с некорректной очисткой относительных путей, включающих неразделённый символ диска (“C:somepath”) и последовательность для возврата в предыдущий каталог (“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-пакетов, включающих символические ссылки, жесткие ссылки и абсолютные пути.