AI 代码助手生成包含调试语句、硬编码凭证、注释掉的安全检查等脚手架,这些在开发时合理但生产环境成为漏洞,常规 code review 无法捕获。
每个 AI 编码助手都会产生两种输出:解决问题的代码,以及解决过程中积累的脚手架。Debug 打印语句把请求对象转储到标准输出。在本地运行时有效的硬编码数据库 URL。被 AI 在原型设计过程中绕过的注释掉的 @require_login 装饰器。这些工制物既不会导致测试失败,也不会触发 linter。但它们会被发布到生产环境。
问题不在于 AI 助手编写不安全的代码。问题在于它们生成的是可以运行的代码,但内部嵌入了开发阶段的快捷方式,而典型的代码审查流程中没有人在寻找这些快捷方式。
AI 编码助手会生成可工作的代码,但也会生成脚手架工制物——debug 打印语句、占位符凭据、注释掉的安全检查、硬编码的 localhost 端点——这些在开发时是合适的,但当代码发布时就成了生产隐患。BrassCoders 的 12 个扫描器可以捕获安全相关的子集:硬编码凭据、debug 模式配置标志和与已知密钥格式匹配的占位符值。
Debug 打印语句单独来看风险最低——除非它们在打印密码、令牌或 api_key。硬编码凭据处于中等风险:静态值不太可能轮转,造成的损害受凭据作用域限制。比如 Django 的 DEBUG = True 设置可能会暴露堆栈跟踪、禁用安全头、绕过缓存逻辑。注释掉的安全控制风险最高。注释掉的 @require_login 装饰器意味着开发者在开发期间绕过了一个控制,而 AI 保留了这个绕过。
OWASP 将 debug 模式配置错误和不安全的默认设置分类到 A05:安全配置错误,在 2021 年的十大风险中排名第五。这种模式在使用 AI 辅助构建的代码库中反复出现,因为这些助手优先考虑生成能运行的代码,而不是能安全发布的代码。
BrassCoders 将硬编码凭据和 debug 模式指标标记为其密钥和安全扫描的一部分,但代码审查遗漏工制物有一个结构性原因:审查者阅读相对于之前存在内容的差异,而 AI 生成的代码以一大块形式到达,其中工制物淹没在工作逻辑中变得不可见。
审查由 Claude Code 或 Cursor 生成的 300 行 PR 的审查者在评估逻辑是否正确、函数签名是否合理、测试是否覆盖边界情况。要在一个设置文件中的第三个文件中发现 DEBUG = True——在助手搭建配置时添加的——需要一种不同的注意力。审查者不会自然地在"这是否有效"和"助手是否留下了脚手架"之间切换。
这些工制物也被意图所伪装。硬编码的 postgres://localhost/dev 连接字符串看起来是有意的——它很具体、格式正确、某个时刻可能是有意的。diff 中没有任何东西表明它是应该是环境变量的开发占位符。代码审查会捕获看起来不对的东西。AI 脚手架往往看起来完全正确。
grep -r 'print|TODO|FIXME|localhost|debug' 扫描可以单独找到工制物,但会产生虚警,使信号失去意义——日志工具中的合法打印语句、测试配置中的有效 localhost 引用、文档中的 TODO。BrassCoders 的扫描器应用特定于模式的上下文来区分凭据形状的字符串和偶发匹配。
Yelp 的 detect-secrets(捆绑在 BrassCoders 中)在凭据层处理此问题。它对字符串字面量运行熵分析,并根据已知密钥格式进行匹配——AWS 访问密钥、GitHub PAT、Stripe 实时密钥、Slack 令牌、PEM 私钥、JWT。熵阈值过滤掉仅仅看起来像凭据的低熵字符串。虚警率下降到信号可操作的范围。
AI 模式扫描器添加第二遍来处理与已知凭据格式模式匹配的占位符值,但不是真实的密钥。AI 助手生成 FastAPI 示例时可能会写 api_key = "sk-1234567890abcdef"——不是真正的 OpenAI 密钥,但形状完全一样。扫描器会标记它。开发者验证并在占位符到达某个 PR 之前将其删除,在那里有人可能会将其误认为真实的密钥。
BrassCoders 的密钥模式扫描器捕获任何格式中的硬编码 API 密钥和令牌;安全扫描器标记 Django 设置中的 DEBUG = True 和其他配置反模式;AI 模式扫描器标记与已知凭据格式匹配的占位符值。
将 BrassCoders 添加到 CI,它在每次提交后运行:
pip install brasscoders
brasscoders scan .
输出是由你的 AI 审查者消费的 YAML 文件——Claude Code、Cursor 或你正在运行的任何助手。YAML 首先呈现工制物发现,包括扫描器名称、文件路径、行号和对标记内容的描述。你的 AI 审查者看到结构化列表,可以进行分类,而无需扫描整个代码库以查找脚手架。
BrassCoders 在发布的基准中捕获了 12 个 AI 生成的 bug 中的 11 个,相比之下单独使用 Bandit 只有 6 个。工制物类别——debug 模式配置、占位符凭据、注释掉的控制——属于这 11 个。Bandit 捕获它被设计来查找的安全模式。自定义扫描器捕获 Bandit 不是为了查找的 AI 特定脚手架模式。
覆盖范围的差距不是关于扫描器质量。而是关于每个扫描器被构建来检测什么。BrassCoders 在一次通过中编排全部 12 个,包括六个为 AI 生成的代码模式专门构建的自定义扫描器。OSS 核心是免费的,并采用 Apache 2.0 许可证。它以一个命令开始。
如需进一步采取行动,你可能需要阻止此人和/或举报滥用