Библиотека simple-git позволяет программам на Node.js обращаться к системе контроля версий git. В коде этого пакета обнаружили уязвимость, связанную с неполной проверкой входных данных. Из-за неё удалённый злоумышленник может выполнить произвольные команды операционной системы на машине, где запущено приложение. Проблема зарегистрирована как CVE-2026-102829 и внесена в Банк данных угроз безопасности информации под номером BDU:2026-15880. Базовая оценка по CVSS 3.1 составляет 9,8 балла, по CVSS 4.0 - 9,2. Производитель подтвердил уязвимость и подготовил исправление.
Детали уязвимости
Ошибка затрагивает компонент parseEnv, отвечающий за разбор данных окружения. Внутри него работает функция vulnerabilityCheck(), которая сверяет значения с чёрным списком опасных конструкций. Список оказался неполным. Поэтому часть специальных символов и последовательностей проходит фильтр и попадает в командную оболочку. Классификация относит ошибку сразу к двум категориям. Первая описывает внедрение в команду операционной системы, вторая - неполный чёрный список. Обе категории давно известны, однако встречаются в коде регулярно.
Эксплуатация не требует учётной записи в приложении и не зависит от действий пользователя. По вектору CVSS 3.1 атака проводится по сети и отличается низкой сложностью. Четвёртая версия шкалы оценивает сложность как высокую, поскольку часть условий зависит от конкретной конфигурации и окружения. Сведения о готовом эксплойте пока уточняются. Данных о реальных атаках с использованием этой уязвимости на момент публикации нет. Способ эксплуатации относят к инъекции и манипулированию ресурсами.
Уязвимы выпуски simple-git до 2.0.1. Библиотеку применяют в инструментах разработки, скриптах автоматизации и конвейерах сборки. При этом процесс, работающий с git, обычно имеет доступ к репозиториям, ключам развёртывания и переменным окружения. Следовательно, успешное внедрение команды даёт злоумышленнику те же права, что и у самого процесса. Если библиотека подключена в конвейере непрерывной интеграции, последствия не ограничиваются одной машиной. Атакующий может добраться до сборочных артефактов и учётных данных, которые используются при доставке кода.
Отдельная сложность связана с тем, что simple-git часто попадает в проект не напрямую. Её приносят другие зависимости. Разработчик может не знать, что нужный пакет уже присутствует в дереве. Кроме того, автоматические сборки обновляют зависимости реже, чем требуется. Поэтому уязвимый код остаётся в проекте и после выхода исправления. Проверка полного дерева зависимостей помогает найти такие случаи, однако требует времени и подходящих инструментов.
Фильтр должен отсекать значения, которые git или командная оболочка способны воспринять как вызов программы. Неполный чёрный список решает эту задачу лишь частично. Синтаксис оболочек различается, а правила экранирования и подстановок допускают множество вариантов записи одной и той же команды. Поэтому защита перечислением запрещённых шаблонов почти всегда отстаёт от реальности. Надёжнее передавать аргументы напрямую, не собирая командную строку из внешних данных. Для проектов на Node.js это означает отказ от склейки строк при вызове сторонних утилит.
Найти библиотеку в проекте помогает проверка дерева зависимостей. Команда npm ls simple-git показывает, какая версия установлена и какой пакет её привёл. Для других менеджеров пакетов смысл тот же: нужно убедиться, что в сборке нет выпусков ниже 2.0.1. Такая проверка занимает минуты, а её отсутствие оставляет исправление неприменённым.
Производитель закрыл проблему в версии 2.0.1, исправление затрагивает разбор аргументов командной строки. Пользователям стоит обновить библиотеку и пересобрать зависимости проекта. Полезно проверить файлы блокировки, поскольку они фиксируют конкретные версии пакетов и мешают обновлению. Затем нужно пересобрать конвейеры и убедиться, что в них используется исправленный выпуск. Если сборка выполнялась на общей инфраструктуре, разумно просмотреть журналы на предмет необычных вызовов git и сменить долгоживущие токены доступа к репозиториям. Отдельно стоит уточнить, не работает ли уязвимая версия на машинах с широкими правами.
Уязвимость заметна на фоне более широкой тенденции. Библиотеки-обёртки над системными утилитами часто становятся точкой входа для внедрения команд. Они экономят разработчику время, но одновременно расширяют поверхность атаки. В конвейерах сборки такие пакеты работают с повышенными правами, а значит, ошибка в них обходится дороже. Своевременное обновление снижает риск, однако не устраняет причину. Пока проверка внешних данных строится на перечислении запрещённых шаблонов, ошибки этого класса будут появляться снова.
Ссылки
- https://bdu.fstec.ru/vul/2026-15880
- https://www.cve.org/CVERecord?id=CVE-2026-102829
- https://github.com/steveukx/git-js/security/advisories/GHSA-v5rq-49vh-5v5c
- https://github.com/steveukx/git-js/commit/68874c239f0c7a87f4a68c3d2c4a0d7c75bb27f4
- https://github.com/steveukx/git-js/pull/1201
- http://github.com/steveukx/git-js/releases/tag/@simple-git/argv-parser@2.0.1