17 августа 2026 г.
Copilot Autofix в дыре у Snowflake не виноват: уязвимые строки написал инженер
Подпись «Copilot Autofix powered by AI» приехала в PR из соседнего коммита при squash-мёрже, а дыру открыли руки инженера.

Заголовок GitHub-issue с парой лишних символов вынес наружу Jira-токен Snowflake.
Workflow-файл `jira_issue.yml` в публичном репозитории snowflake-connector-net подставлял название issue прямо в шелл-команду. Кто открыл issue, тот и выполнял свой код на раннере. Дыра прожила пять дней, с 18 по 23 июня 2026, и нашёл её автономный Red Agent компании Wiz.
Из раннера утёк Jira API-токен аккаунта qa@snowflake.net. По нему открывались проекты инженерии, security compliance и трекинг bug bounty на snowflakecomputing.atlassian.net.
Wiz вынес в заголовок, что уязвимый код сгенерировал GitHub Copilot Autofix. Через сутки GitHub показал, что подпись AI в коммите не доказывает ничего.
Подпись приехала с соседнего коммита. GitHub провёл своё расследование и проследил маршрут строки «Copilot Autofix powered by AI». Она пришла из другого коммита, по файлу `jira_close.yml`, и squash-мёрж склеил её с чужой работой.
Уязвимые строки лежат в коммите 094038e от 25 августа 2025 за именем инженера Snowflake sfc-gh-hpathak. По формулировке GitHub, человек написал контрибуции, приведшие к уязвимости, а Copilot Autofix их не рецензировал и в них не участвовал.
CTO Wiz Ами Луттвак отыграл назад 19 августа. Конкретные строки, вызвавшие уязвимость, Copilot не создавал, PR писали несколько участников, и разделить авторство человека и AI, по его словам, становится всё труднее. Пост Wiz поправили тем же вечером, формулировка стала осторожной — неясно, был ли код AI-assisted.
Сканеры молчали. GitHub Advanced Security при скане вытащил `jira_issue.yml`, но инъекцию не пометил. Защитный `if:` в самом workflow проверял `github.event.pull_request.user.login`, а на событии issues это поле всегда null, так что гейт был мёртвым.
Чинится одной переменной. Недоверенное значение не идёт прямо в `run:`, а проезжает через env: `env: TITLE: ${{ github.event.pull_request.title }}`, а в скрипте остаётся только `"$TITLE"`. Значение живёт в памяти и не попадает в генерируемый шелл-скрипт. Недоверенных полей github-контекста GitHub насчитывает десять, среди них title, body, head_ref и message.
Workflow-файлы проверяет статический анализатор zizmor. Ставится одной командой, `brew install zizmor` или `uvx zizmor`, и ловит template injection, лишние permissions и неприпиненные actions. GitHub советует ещё три хода: вынести логику в JavaScript-action, включить workflow-шаблон CodeQL и урезать permissions у GITHUB_TOKEN до минимума.
Snowflake закрыл дыру за сутки. Репорт через HackerOne пришёл 23 июня, патч ушёл в тот же день (PR #1402, возврат к связке `env:` и `jq --arg`), Jira-токен ротировали 24-го.
Авторство кода в репозитории держится на co-author-строке, а она переживает squash-мёрж и уезжает к чужой работе.
Первоисточник