AI 写代码犯的错,早被写进了错题集
两年前最轰动的安全事件差点让所有 Linux 发行版中招。攻击者在 xz 压缩库里埋了后门编号 CVE-2024-3094CVSS 评分 10.0。这件事上过每一篇安全头条三个月后却没人再提。但它归类的 CWE-506 还在那里。下一次同类事件出来换个 CVE 编号背后的毛病是同一个。x-cmd 最近发布的 v0.9.14 里主要改了两个模块x cve和x cwe前者是在命令行查 CVE 编号的接口后者是用来查 CWE 类别的接口。借这个钩子正好把 CVE 和 CWE 的分工讲清楚。CVE 是哪道题CWE 是哪类错这两个编号的全称很少有人能一次说全。CVE 是 Common Vulnerabilities and Exposures给每一个公开漏洞发编号。CWE 是 Common Weakness EnumerationWeakness 常被译成“弱点”说成人话就是一类毛病它给每类毛病发编号。一句话分清CVE 是“哪道题错了”CWE 是“这类题错在哪”。再具体一点CVE 是错题本上的一道具体错题CWE 是错题本里按知识点归类的标签。CVE-2024-3094 是那道具体错题。它有时间、有影响范围、适合上头条。CWE-506 是知识点标签它不问年月、不看热度只问一个事什么样的开发模式会让恶意代码混进依赖里。具体错题会淡出首页知识点标签会换个编号再来。AI 写代码在复刻老错误现在大量代码是 AI agent 生成的。agent 想得快、写得快犯错也成体系。它犯的错很少是新鲜的。AI 训练的目标是让代码“能跑通”。而训练数据里能跑通的代码中不安全写法占比很高。于是它很自然地复刻了 CWE 已经归纳好的老问题CWE-79XSS把用户输入直接拼进页面CWE-89SQL 注入把用户输入直接拼进查询CWE-22路径穿越用用户输入拼接文件路径CWE-798硬编码凭证把密钥写死在代码里CWE-20输入校验不足默认用户输入总是善意的。这些不是新坑是老坑被 AI 用新代码又写了一遍。人也一样会犯这些错但人的产量有限AI 的产量几乎无限。于是同一个老问题在更大的代码基数里被更快地复刻出来。CWE 的价值从“事后翻错题集”变成了“事前检查清单”。我觉得更实际的用法是把 CWE 前置到 agent 的计划阶段。让它动手写代码之前先对照相关类别检查自己的方案把整类毛病在设计层面排除掉而不是等写完再扫漏洞。MITRE 每年发布的 CWE Top 25就是现成的检查顺序。人审 AI 写的代码也是同一个逻辑。逐行 review 几千行生成代码不现实但按类别过一遍“有没有踩这几类坑”是可行的。把事件和类型一起查漏洞刷屏时多数人不需要成为安全专家。只需要快速搞清楚两件事这个编号说的是什么它归哪类毛病。只知道“出了个满分漏洞”不知道该慌还是该看戏。顺着编号看到它属于 CWE-506再看到这一类毛病的典型后果和官方缓解建议才能判断自己的系统是不是暴露在同一种风险下。x cve和x cwe做的就是把这两步合成一步。把编号交给它事件的影响范围、归类的毛病、有没有正在被利用一次出来想再顺着类别翻下去把 CWE 编号给它就行。数据来自 NVD、MITRE 和 CISA 的公开目录。更实际一点的用法是接进 agent 的工作流。agent 自己查 CVE 编号、翻 CWE 描述、看缓解建议比让它去搜索引擎翻一堆过时博客靠谱。你不需要背编号也不需要先把安全学一遍。只需要让 agent 知道有这个数据源可以用。新闻会过时错题集不会我觉得安全素养不是背漏洞编号而是两个习惯。一个习惯是追事件出了事能第一时间知道是什么、多严重、跟自己的技术栈有没有关系。CVE 负责这一步。另一个习惯是翻类别动手写代码、或者审 AI 写的代码时记得那些毛病类别一直都在换着编号重演。CWE 负责这一步。新闻会过时类别不会。AI 把代码产量放大了很多倍这两个习惯的价值也跟着放大了很多倍。前者让你知道出事了后者让同样的事不发生在你身上。