# Wiz Red Agent 通过AI生成的 GitHub Copilot “自动修复”功能进入 Snowflake 内部 Jira 系统
来源:https://www.wiz.io/blog/red-agent-snowflake-copilot-cicd-bug
作为通过 Snowflake HackerOne 漏洞披露计划进行的持续安全研究的一部分,Wiz 研究部门的 "Red Agent"——一款自主的、AI驱动的安全研究工具——在 Snowflake 的一个公开仓库中发现了一个关键的 GitHub Actions 工作流漏洞。
这一事件凸显了软件开发中一个迅速浮现的现实:**AI 编码助手如何可能无意中引入工作流注入漏洞,以及自动化 AI 代理如何能在实际环境中迅速发现这些漏洞。**
Wiz 于 2026 年 6 月 23 日进行负责任的披露后,Snowflake 当天即修复了该漏洞,轮换了受影响的凭证,并通过详细的审计日志确认在暴露窗口期仅有 Wiz 一个操作者。Wiz 确认,在概念验证测试期间访问的所有数据均已安全删除。
## **概要**
Wiz Red Agent 在 `snowflakedb/snowflake-connector-net` (https://github.com/snowflakedb/snowflake-connector-net) 仓库中识别出一个脚本注入漏洞。该漏洞允许未经验证的用户通过创建一个带有特殊构造标题的 GitHub issue,在 GitHub Actions 运行器中执行任意命令。
关键的是,该漏洞是在 2026 年 6 月 18 日——即发现前仅五天——通过一个由 `Copilot Autofix powered by AI` 共同参与的提交引入的(PR #1218 (https://github.com/snowflakedb/snowflake-connector-net/pull/1218))。该 AI 助手移除了仓库现有的输入净化模式,并用 shell 脚本中的直接字符串替换。
屏幕截图展示通过窃取的令牌访问 Snowflake 的 Jira 门户。
## **暴露过程详解**
## 发现
Wiz Red Agent 的 CI/CD 功能扫描了 Snowflake 的 GitHub 组织,并将 `snowflakedb/snowflake-connector-net` (https://github.com/snowflakedb/snowflake-connector-net) 中的 `jira_issue.yml` (https://github.com/snowflakedb/snowflake-connector-net/blob/4a1b8cecd65b899540e4324715557d6b080ddeb5/.github/workflows/jira_issue.yml) 工作流标记为易受通过 `run:` 块中不受信任输入进行的脚本注入攻击。
**AI 助手 (Github Copilot) 的更改**
该工作流在 `issues: opened` 时触发——意味着任何 GitHub 用户都可以通过创建一个 issue 来触发它——并且将攻击者控制的 issue 标题直接插入到 shell 脚本中:
`sed` 转义发生在 GitHub 的模板扩展之后,标题中的单引号会破坏 `echo '...'` 的结构,从而允许任意命令执行。
该可注入模式仅在几天前,即 2026 年 6 月 18 日的提交 4a1b8ce (https://github.com/snowflakedb/snowflake-connector-net/commit/4a1b8cecd65b899540e4324715557d6b080ddeb5)(PR #1218: “SNOW-2069227: Update jira workflows” (https://github.com/snowflakedb/snowflake-connector-net/pull/1218))中引入,该提交由 `Copilot Autofix powered by AI` 共同参与。
引入脆弱模式的提交
它移除了仓库原有的安全模式,该模式将 issue 标题通过 `env:` 变量传递,并使用 `jq` 构建 JSON 负载。相反,它使用了上面展示的直接 `{{ github.event.issue.title }}` 插值。换言之,一个 AI “自动修复”提交创造了这个注入向量。
引入脆弱模式的代码更改
## 开放的“安全门”
该工作流有一个看似具有保护性的 `if:` 条件:
然而,在 issue 事件中,`github.event.pull_request` 始终为 **null**。
因此,该条件简化为 (`null != 'whitesource-for-github-com[bot]'`)。这始终为真,因此每个 GitHub 用户都能通过该检查。
开放的“安全门”
## 利用
我们构造了一个 issue 标题,在模板扩展后,它能跳出 echo 字符串并通过带外回调窃取 Jira 凭证:
关键的是,当 Red Agent 的 cicd 功能最初尝试使用标准注释字符 (`#`) 进行外泄时,运行器返回了 bash 语法错误,因为注释吞噬了 `TITLE=$(...)` 的右括号。Red Agent 并未停止或失败,而是:
1. 自主分析了语法执行错误
2. 调整了其负载以使用 `; echo '` 来正确关闭 shell 块,以及
3. 成功接收到了带外回调
几秒钟内,我们的监听器就收到来自一个 GitHub Actions 运行器(Azure IP `20.106.182.197`)包含 base64 编码凭证的回调。
在 Issue 标题中包含负载的概念验证 PR
**注意:** 我们最初的尝试使用了 `#` 来注释掉行的其余部分,这导致了意外的 EOF bash 错误,因为它也吃掉了 `TITLE=$(...)` 的闭合 `)`。解决方法是使用 `; echo '` 来正确关闭 shell 语法。
显示成功利用的工作流日志
被窃取的令牌链接到
[email protected]
被窃取的令牌以 `
[email protected]` 身份认证到 `snowflakecomputing.atlassian.net`,获得了对 Snowflake 工程、安全合规性和漏洞赏金跟踪项目的跨项目读取访问权限。
## **修复与取证**
1. **当日修复:** Snowflake 于 2026 年 6 月 23 日修补了该工作流(提交 1dc7766 (https://github.com/snowflakedb/snowflake-connector-net/commit/1dc7766),PR #1402),完全恢复了安全的 `env:` 变量和 `jq --arg` 解析模式。
2. **凭证撤销:** 相关的 JIRA 令牌已被撤销并轮换。
3. **取证验证:** 全面的审计日志分析证实,在为期 5 天的暴露窗口期内,没有外部第三方访问该端点。所有异常查询均严格匹配到 Wiz 的测试 IP。
## **关键要点**
- **AI 代码生成需要严格监督:** AI 编码工具基于概率模式预测代码,这可能无意中重新引入已弃用或不安全的 shell 模式。AI 生成的 PR 必须接受与人工代码相同的静态分析和安全审查。
- **发现窗口期缩短:** 该漏洞在活跃仅五天后就被自动化代理发现并验证。安全运营必须适应这样一个环境:自动化发现可在数小时内完成,这要求快速的补丁周期和短生命周期的凭证。
- **防止 AI 安全性回退:** 自动化 AI 助手通常缺乏关于为何选择特定代码模式的历史上下文。在本次事件中,一个自动化 PR 移除了原本为防止 shell 注入而明确实现的、安全的 `env:` + `jq` 解析模式。安全团队必须实施护栏,阻止 AI 代理用直接字符串插值替换结构化数据解析器。
## **披露时间线**
- **2026 年 6 月 18 日 -** 脚本注入模式在 `jira_issue.yml` 中由提交 `4a1b8ce`(PR #1218)引入,该提交由 `Copilot Autofix powered by AI` 共同参与。
- **2026 年 6 月 23 日** - Wiz 通过 HackerOne 识别、利用并向 Snowflake 报告了该漏洞(报告编号 #3819931)。
- **2026 年 6 月 23 日** - 向 Snowflake 安全团队发送了 Slack 通知。
- **2026 年 6 月 23 日(同日)** - Snowflake 修补了易受脚本注入攻击的工作流(提交 1dc7766 (https://github.com/snowflakedb/snowflake-connector-net/commit/1dc7766),PR #1402 (https://github.com/snowflakedb/snowflake-connector-net/pull/1402)),恢复了安全的 `env:` + `jq --arg` 模式。
- **2026 年 6 月 24 日** - Jira 令牌轮换完成。
- **2026 年 7 月 25 日** - 公开披露截止日期(根据 Snowflake 的披露政策,为问题解决后 30 天,即 6 月 25 日后)。
## **Snowflake 的回应**
> Snowflake 感谢 Wiz 通过我们的漏洞披露和漏洞赏金计划 HackerOne,对这些发现进行的负责任报告和协作。Wiz 研究部门报告了 Snowflake 一个公开 GitHub 仓库中的安全漏洞。该报告于 2026 年 6 月 23 日收到,我们立即进行了调查和修复,调查未发现未经授权访问的证据。保护我们的系统仍然是首要任务,我们致力于持续加强我们的软件开发和安全实践。我们正与 Wiz 合作,与更广泛的行业分享这些经验,以鼓励广泛采用这些安全最佳实践。