AI编码工具可能在早期commit中写入真实API密钥,即使后续移除也会永久留在git历史中,攻击者可从公开仓库扫描获取。
你的开发速度很快。周末就完成了一个真实的应用。AI 写了大部分代码,你把它连接到 GitHub,然后 push 了上去。
但 UI 上不会显示的部分是这样的:你的 git 历史是一条永久的时间线。它会记住你曾经提交过的每一个文件的每一个版本。
当 AI 在第一天帮你写配置文件时,它可能在里面放了一个真实的 API key,好让代码能跑起来。之后你把它移到了环境变量里。文件当前的版本是干净的。但是第一天的那个提交还在,那个 key 也还在。
当你 push 一个提交时,那个提交就成为了仓库永久历史的一部分。如果你之后删除文件或者轮换 key 并 push 一个新提交,旧的提交依然在那里。
任何 clone 了仓库的人都会获得完整的提交历史,包括那些旧的提交。自动化扫描器专门在公开的 GitHub 仓库中搜索这种模式。如果六个月前泄露的 key 没有被轮换过,它依然是一个可用的 key。
私有仓库也并非免疫。被攻陷的账号、意外的可见性变更、或者你不再信任的外包人员——这些都会让私有历史变成一次暴露。
编程助手写的代码能跑。在你的会话期间,它们会填充各种值让代码运行。那些值有时候会进入提交中。
AI 并没有在犯安全错误。它只是在做你要求的事:让东西跑起来。安全决策属于你,而且必须在你 push 到共享基础设施之前完成。
这个差距不是 AI 工具的问题。这是「能跑」和「可以安全发布」之间的差距。这个差距一直存在。AI 只是让前半部分变得更快了,这让主动弥合这个差距变得更加重要。
在 AI 构建的仓库中,四种模式最常出现:
配置文件中的 API key 或 token,即使你之后已经把它们移到了环境变量里
在加入 .gitignore 之前就被提交的 .env 文件
早期开发过程中使用的数据库连接字符串
serverless 或云函数文件中的硬编码服务账号 key
一个粗略的手动检查方法:git log -p | grep -iE "api_key|secret|password|token|sk-|AKIA"。这能捕捉到明显的模式,但会漏掉不在这些字符串范围内的一切。
在你把一个 AI 构建的仓库连接到真实基础设施或者将其公开之前:
对完整的 git 历史运行密钥扫描。不是只扫描当前文件,而是每一个提交。
轮换任何出现的凭证,即使它们看起来已经过期或者只是测试用途。
如果你想彻底清理历史,git filter-repo(git filter-branch 的现代替代品)可以重写提交,在源头删除密钥。
如果你想跳过手动工作,RepoFortify 可以扫描你完整的 git 历史,在提交级别标记密钥。免费试用。无需安装:在浏览器中粘贴你的仓库 URL,它就会运行。
问题不在于 AI 编码工具是否引入了安全风险。所有加快开发速度的工具都比开发者脑海中的安全审查走得更快。问题是你是否有一个在出问题之前就会运行的检查。
完整的 git 历史扫描只需要几分钟。它属于你在 push 到生产环境之前要做的事,而不是在收到第一份事件报告之后。