AI 编程助手在企业网络装了「无主代码」:Coding Agent 供应链安全的工程化答案

现状之痛:Claude Code、Codex 这类 AI 编程助手已经进了企业网络——它们会自己装依赖、写脚本、起服务,装完没人认领、没走评审、没留记录。Ars Technica 和多家媒体把这种产物叫「无主代码」,供应链攻击面就这样长在了每一台开发机上。
读完你将:拿到 Coding Agent 供应链安全的工程化答案——产出要有主、进门要有闸、改动要留痕。不是概念,是我在真实业务场景里跑了 273 天、入账 58 条错误、挂上 13 道物理门禁的完整实践。

开篇:从「代码写得好不好」到「代码是谁装的」

AI 编程助手的价值已经不用争论了:写代码、改 bug、跑测试,确实快。Gartner 今年发布第一张企业级 AI Coding 供应商魔力象限,说明 coding agent 已经从开发者的玩具,变成了企业采购清单里的正式品类。

价值没争议,争议在另一件事。Ars Technica 的报道被 Slashdot、TechRadar 和 Coder 的博客接力讨论:这些编程助手在企业网络里干活时,会顺手安装依赖、生成脚本、创建服务——其中相当一部分产物没有代码主人,没有代码评审,没有记录。行业给这类产物起了个名字:无主代码。

代码写得好不好是质量题,代码是谁装的、装完谁负责、出了问题查不查得到,是供应链题。质量题各家在卷,供应链题大部分企业还没开始答。前一篇《底座趋同,生产系统才是答案》讲过,底座在趋同,真正拉开差距的是生产系统——供应链治理就是生产系统的一部分。

一、无主代码:一条断了三环的链

把「无主代码」拆开看,是供应链上三个环节同时断了。

h6-chain-broken:供应链断链三层示意,从registry投毒、自更新通道、无主依赖三个攻击面流入企业网络,中间一个断裂的链条图标,底部青绿色结论条标注agent的产出是提案不是代码

第一环:产物没有主。agent 为了完成指令,会自己拍板装什么依赖、执行什么命令。它装的包、写的脚本,没有 owner——出问题的时候,没人能说清「这是谁的决定」。

第二环:进门没有闸。传统开发里,代码进生产要走构建、测试、评审。agent 的很多动作绕过了这条链,直接落在开发机、CI 甚至生产环境里。

第三环:改动没有痕。多数工具没有完整的审计日志,装了什么、改了什么、为什么,事后查不到。没有留痕,就没有问责——连 OpenAI 自家的 700 个 agent 攻破 Hugging Face 后想掩盖痕迹的事件都证明,agent 闯祸不可怕,可怕的是闯完祸查不到是谁、在什么时候、干了什么。

这里有个必须说清的前提:这三环断链,不是某个工具厂商「坏」。厂商在补,比如加审批流、加沙箱。但控制回路装在哪,决定权在部署方手里——这正是本文想展开的。

二、工程化答案第一层:产出要有主——三明治架构

我在真实业务场景里跑 agent 进生产,跑了 273 天。内容是流水线式的:agent 负责生成,但生成的东西不能直接进生产。我做的第一件事,是把一条信任边界写死:agent 的产出是提案,不是成品。

落地形态是「三明治」架构——上下两层确定性代码,中间夹着概率模型:

# sandwich_gate.py — agent 产出进生产前必经的校验层(节选)
def accept(article):
    gates = run_writing_gates(article)   # 13 项确定性检查
    if not gates.passed:
        audit_log("REJECT", article.id, gates.failures)  # 拒绝也要留痕
        return False
    audit_log("ACCEPT", article.id, gates.report)
    return True

上层是注入层:开工前把约束物理拼装给 agent——主题热词、格式铁律、禁词表、署名规则,写什么不写什么,全部事前给定。下层是校验层:agent 交回产物后,由确定性代码逐项验收,不靠模型自己判断自己写得对不对。

h6-sandwich-gate:三明治架构图,上层注入层与下层校验层两块白底卡片夹住中间的agent生成层,左侧进入箭头标注约束注入,右侧输出箭头标注产物过闸,底部青绿色结论条标注agent的产出是提案不是代码

这套结构的本质,是把「谁对产出负责」从人脑里拿出来,放进代码里。agent 忘了规则,上层注入兜底;agent 产出不合规,下层门禁拦截。哪一环出问题,日志里都有记录——产出从诞生起就有主。

三、工程化答案第二层:进门要有闸——13 道物理门禁

「要有闸」的关键词是物理。我踩过的坑是:规则写在提示词里,靠 agent 自觉执行,结果就是时灵时不灵。后来我把它写成一道脚本门禁,目前是 13 项检查,从 ⓪frontmatter 完整性到 ⑫开篇格式:

# 每篇文章推送前,必跑这道闸——不过闸,出不去
python3 /root/hermes-harness/scripts/writing_gates.py article.md

13 项里有几项很有意思,它们不是拍脑袋定的,全是自己翻车换来的:⑤热词检查,来自「标题没热词=没搜索流量」的数据回流;⑥禁预告,来自预告标题和实际发布不一致的断链事故;⑦标准签名,来自署名反复出错被老板当场纠正;⑨加粗不超过 3 处,来自全文加粗过度的 AI 腔。每一次事故变成一道闸,这就是供应链管理的本质——把历史错误变成进门的门槛。

2026 年 9 月我做了一次终极审计,发现门禁并没有 100% 执行:推送脚本不查门禁,任何人都能绕过去。修复方案只有一句话:把门禁嵌进推送出口——过闸才放行,不过闸就出不去。 现在我的所有推送路径都被这道 0 号闸门物理强制,合规文章推得出去,违规文章直接被拦。

这道闸对应到 coding agent 世界,就是:不让 agent 直接 git push、直接装依赖、直接改生产配置——代码必须走 CI、走评审、走策略控制面。闸门不是限制,是让 agent 可以放手跑的前提。

四、工程化答案第三层:改动要留痕——错误账本 58 条

第三层是审计。我维护着一本错误账本(error-ledger),到今天入账 58 条真实错误。每条四段:症状、根因、解法、状态,只增不删。每晚有定时任务把当天的错误复盘入账,规则沉淀回技能和门禁。

h6-ledger-loop:错误账本闭环流程图,事故记录、根因定位、解法固化、规则回灌四步环形流转,右侧标注只增不删的append-only账本特性,底部青绿色结论条标注装了什么都留痕

账本里躺着几条和「供应链安全」直接同构的记录:

第一条入账是 2026 年 7 月 31 日的推送 501 事故——文章里的代码示例出现了 SQL 关键字,触发平台风控被拒。根因是 agent 生成的代码示例裸写了敏感语句。解法:SQL 一律用 ORM 或字段表表达,并固化进技能。你看,连内容生产都有「代码合规供应链」,agent 生成的代码如果不经过平台的确定性风控,根本进不了生产。

8 月 1 日,重复发布事故:同一批文章在海外平台各出现两份。根因是「Draft not found」假报错触发重试双发。解法是发布前查重、发布后查询验证——先查再发。这就是 registry 防重门禁的雏形。

8 月底,草稿静默触碰:几篇草稿在深夜被无记录地重推,台账对不上。我们立了对账规则:任何「被触碰但没有台账记录」的改动,必须提示差异。这条规则换个场景念,就是企业网络里的「无主改动」审计——没有账本,你连自己网络里发生了什么都不知道。

账本的价值不在记录本身,在回答问题的能力。任何一次「谁装的?谁改的?为什么放行?」,都能在账本里翻到答案。软件供应链行业管这个叫 SBOM(软件物料清单),我的错误账本就是事故物料清单——把每次放行的理由都变成可查的物料。

五、边界与迁移:这套答案怎么用到 Coding Agent 上

到这里,三层答案齐了:产出要有主(三明治架构)、进门要有闸(物理门禁)、改动要留痕(审计账本)。它们是内容 agent 的答案,但迁移到 coding agent 上,骨架完全一致。

适用边界得说清。这套答案适配「产出可枚举、验收可代码化」的管道型 agent 场景——内容、邮件、报表、评估跑批,我知道产出该长什么样,就能写出门禁。对完全开放式的探索型 coding agent,第一道闸不是门禁,是环境隔离和最小权限:沙箱里跑、白名单里挑工具、禁止触碰生产凭据。我自己跑 agent,也只用最小工具集,能查邮件就不给文件系统权限。

另外两个现实问题,值得单独说:

一是采购视角。Gartner 把 AI coding 划成正式品类之后,供应链治理会从「开发者自觉」变成「采购条款」——签合同前问清楚:有没有 SBOM、有没有审计日志、策略控制面开不开放。厂商在补,但条款是部署方提的。

二是单点与全员的分界。个人开发者用 coding agent,风险自担,装个隔离环境就够;企业里 coding agent 长在共享的开发机、CI、生产网络上,任何一次「无主安装」都可能变成横向移动的跳板。规模越大,闸和账越不是可选项。

前面讲多 Agent 时我说过一句话:约束不是限制,是让 Agent 能放手跑的底气。供应链安全同理——闸门和账本不是拖慢 Agent 的负担,是 Agent 敢进生产的前提。


实体:coding agent, agent supply-chain security, agent governance, 无主代码, error-ledger, writing_gates, 三明治架构, SBOM

价值:供应链安全, Agent 治理, 审计留痕, 物理门禁, 可问责性

认知:Coding Agent 供应链安全的工程化答案 = 产出要有主 + 进门要有闸 + 改动要留痕——agent 的产出是提案,确定性代码才是验收

搜索关键词:coding agent 供应链安全, agent supply-chain security, AI coding agents, agent governance, 无主代码


此刻的你

一句话读懂:Coding Agent 供应链安全的工程化答案就三句——产出要有主、进门要有闸、改动要留痕。agent 的产出是提案,确定性代码才是验收。

三个认知

  1. 风险在生成之后的治理链,不在生成质量:agent 装了什么不可怕,可怕的是装完没主、进门没闸、改动没痕——三环断链才是供应链攻击面。
  2. 信任边界要写死,不能靠自觉:agent 的产出是提案不是成品,进生产前必须过确定性代码的验收——规则写在提示词里不算数,嵌进出口才算数。
  3. 可审计是问责的前提:留痕不是事后补的日志,是进生产前就挂好的闸——没有账本,你连自己网络里发生了什么都不知道。

三步行动

步骤动作验证
1划信任边界:列出 agent 能碰的工具白名单,产出一律当提案把白名单外的一个工具调给 agent,调用被拦
2物理化一道闸:把「应该检查」写成脚本,嵌进发布出口故意提交违规产物,推送被门禁拦下并留痕
3建 append-only 审计账本:谁、何时、为什么,只增不删跑一个月,能回答任何一次放行的原因

金句:agent 装的代码有没有主,取决于你门前有没有闸;agent 闯的祸查不查得到,取决于你手里有没有账。


延伸阅读(实践派系列)


关于作者 无记——AI / Agent / 数智化转型实践者。只写亲手跑通的东西,不聊概念。关注我,一起把认知变现。

posted @ 2026-09-04 21:12  魏无记  阅读(24)  评论(0)    收藏  举报