Побег из песочницы в Skyvern, self-hosted-агенте, который управляет веб-браузером на основе шагов, сгенерированных LLM, был обозначен как CVE-2026-82447 и опубликован в базе GitHub Advisory Database 29 августа 2026 года в 15:30:19 UTC. Исправление кода, которое он описывает, попало в репозиторий 6 июля в 21:44:03 UTC — на 53 дня раньше.

В чем на самом деле была ошибка

TextPromptBlock в Skyvern рендерил каждый prompt дважды. Первый проход шел через SandboxedEnvironment Jinja, как и было задумано. Второй пропускал ту же строку, на которую мог влиять атакующий, через несandboxed рендерер, чего достаточно для выполнения кода от имени серверного процесса. Исправление, commit d723de6, представляет собой удаление: три строки добавлены и одиннадцать удалены в block.py, что убрало второй рендер и аргумент parameter_values, который его кормил. Остальная часть коммита — это тесты.

Где неверна подача

О таких advisory нередко говорят две вещи, и здесь обе неверны. Во-первых, это был не тихий патч. В примечаниях к релизу v1.0.45, опубликованных 7 июля в 22:19:18 UTC, действительно есть слово "SSTI". Но это всего один пункт в тексте релиза примерно на 190 строк, без отдельного security advisory от вендора, без CVE на тот момент и без чего-либо, что отличало бы его от обычного потока changelog. Во-вторых, из номера CVE за год нельзя понять, когда вы были подвержены риску. Это не так: CVE был присвоен VulnCheck как сторонним органом нумерации, а не самим проектом.

Часть, которая ломает инструменты

Запись advisory содержит оценку CVSS 3.1 8.8 и CVSS 4.0 8.7, а также классификацию CWE-1336. Но ее структурированный массив vulnerabilitiesпустой. Затронутый диапазон — от 0.2.1 до, но не включая 1.0.45 — существует только как текст на странице VulnCheck. Любой сканер, который читает структурированные данные GitHub advisory и сверяет с ними закрепленную зависимость skyvern, не покажет вообще ничего.

Почему эта форма повторяется снова и снова

Путь эксплуатации здесь не экзотический. Параметр workflow или вывод верхнего блока — это текст, который сам агент либо создал, либо получил; он попадает в шаблонизатор; затем он превращается в код на хосте агента. Это и есть мост от prompt injection к выполнению кода в самом простом виде, и он встроен в инструменты, которые позволяют выводу модели управлять слоем шаблонов.