flawopen.com/Teardowns/cve-2026-97662-aws-security-agent-mcp-git-argument-injection
CVE-2026-97662: внедрение аргументов Git в AWS Security Agent MCP
CVE-2026-97662 позволяла трактовать управляемую вызывающей стороной ссылку Git в diff scan AWS Security Agent MCP как параметр команды. Это обходило ограничение workspace и позволяло записывать файлы на хосте. Обновитесь до версии 0.2.0 или новее.[1], [2]
Вектор CVSS
CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:N/VI:H/VA:H/SC:N/SI:N/SA:NСотруднику дают найти папку по ярлыку, но он принимает ярлык, начинающийся с управляющей команды. Архивная система выполняет команду вместо поиска папки. Здесь ссылка Git с начальным дефисом могла восприниматься как опция. Проверка и отклонение пустых ссылок и строк, похожих на опцию, до запуска Git закрывает этот вход. Речь идёт о разборе параметров Git, а не о произвольном выполнении команд оболочки.[2]
Ключевые понятия и термины
MCP-сервер- Локальный процесс, предоставляющий инструменты приложению ИИ через Model Context Protocol. Аргументы инструментов поступают в сервер как недоверенные данные.
Внедрение аргументов (CWE-88)- Программа командной строки воспринимает недоверенный ввод как опцию или разделитель, даже если процессу передан массив аргументов, а не строка оболочки.[2], [4]
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-88
- OWASP GenAI 2025 — LLM01:2025 Инъекция промпта
Анализ первопричины
AWS описывает контекстное внедрение аргументов в операции diff scan: переданная ссылка могла интерпретироваться как параметр командной строки, а не как ревизия Git. Upstream PR подтверждает, что start_diff_scan передавал base_ref командам git diff <base_ref> -- и git archive; пустые значения и значения с начальным дефисом могли трактоваться иначе. Это не внедрение метасимволов оболочки: список аргументов исключает разбор оболочкой, но вызываемая программа всё ещё может распознать опцию. Согласно AWS, это позволяло создавать, перезаписывать или обрезать файлы за пределами заданного workspace в рамках прав процесса. Влитое исправление проверяет base_ref до вызова Git и отклоняет пустые значения и значения, обрезанный текст которых начинается с -; тесты подтверждают отсутствие подпроцесса и загрузки при отклонённом вводе. Уязвимы версии >=0.1.1 и <0.2.0; версия 0.2.0 содержит исправление. В записи CVE указана оценка CVSS 4.0 6,9 (средняя); GitHub Advisory также приводит CVSS 3.1 8,2 (высокая). Эксплойт-полезная нагрузка здесь не воспроизводится.[1], [2], [3], [4]
Пошаговый сценарий атаки
Агент вызывает diff scan
Локальный MCP-сервер получает base_ref, на который может влиять вызывающая сторона. Риск возникает, если недоверенный репозиторий, содержимое или пользователь могут задавать это значение; prompt injection сама по себе не достигает этот путь автоматически.[2]
Трассировка границы: имя ревизии и параметры Git
Концептуальный поток данных, а не последовательность команд или воспроизведение эксплойта.
Два парсера — две отдельные границы
- Разбор оболочкой
- Массив аргументов не позволяет оболочке трактовать значение как её синтаксис и закрывает эту границу.[3]
Исходный код: Уязвимый vs Защищённый вариант
Это целевое сравнение точки вызова upstream, а не полный листинг сканера. Влитое изменение проверяет ссылку до Git; тесты проверяют пустые и начинающиеся с дефиса значения без подпроцесса и загрузки. Массив аргументов предотвращает разбор оболочкой, но не разбор опций самим Git. В этом фрагменте показан только вызов git diff; та же проверка должна защищать каждое использование base_ref, в том числе в git archive.[3]
def start_diff_scan(path: str, base_ref: str):
# Похожая на параметр ссылка попадает в Git до проверки.
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
def _validate_git_ref(base_ref: str) -> None:
if not base_ref or not base_ref.strip():
raise ValueError("base_ref must not be empty.")
if base_ref.strip().startswith("-"):
raise ValueError("base_ref must not start with '-'.")
def start_diff_scan(path: str, base_ref: str):
_validate_git_ref(base_ref) # Отклоняйте значение до запуска подпроцессов или загрузки файлов.
return subprocess.run(
["git", "diff", base_ref, "--"],
cwd=path,
check=False,
)
Чек-лист по защите системы для инженеров
- ✓Обновите
awslabs.security-agent-mcp-serverс версий 0.1.1–0.1.x до 0.2.0 или новее; проверьте версию работающего MCP-процесса.[1], [2], [6] - ✓Проверяйте каждую Git-ссылку, на которую может влиять пользователь или репозиторий, до запуска Git и отклоняйте пустые значения и значения с начальным дефисом до загрузок и иных побочных действий.[2], [3]
- ✓Добавьте регрессионные тесты, доказывающие, что ссылки с дефисом в начале и строки из пробелов не запускают подпроцесс, загрузку или удалённый вызов; проверьте допустимые
main,origin/mainиHEAD~1.[3] - ✓Используйте массивы аргументов вместо shell-строк, но отдельно проверяйте аргументы по грамматике опций вызываемой программы: экранирование оболочки не предотвращает внедрение аргументов.[3]
- ✓Запускайте локальные MCP-серверы с минимальными правами на файлы и в изолированном workspace. Это ограничивает последствия, но не заменяет обновление.[1]
- ✓Анализ FlawOpen: если рабочий процесс передаёт недоверенное содержимое в аргументы инструментов агента, проследите весь путь до вызова инструмента и реализуйте авторизацию и проверку в MCP-сервере.