两年前最轰动的安全事件,差点让所有 Linux 发行版中招。
攻击者在 xz 压缩库里埋了后门,编号 CVE-2024-3094,CVSS 评分 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 Enumeration,Weakness 常被译成"弱点",说成人话就是一类毛病,它给每类毛病发编号。
一句话分清:CVE 是"哪道题错了",CWE 是"这类题错在哪"。 再具体一点:CVE 是错题本上的一道具体错题,CWE 是错题本里按知识点归类的标签。
CVE-2024-3094 是那道具体错题。它有时间、有影响范围、适合上头条。CWE-506 是知识点标签,它不问年月、不看热度,只问一个事:什么样的开发模式,会让恶意代码混进依赖里。
具体错题会淡出首页,知识点标签会换个编号再来。
AI 写代码,在复刻老错误
现在大量代码是 AI agent 生成的。agent 想得快、写得快,犯错也成体系。
它犯的错很少是新鲜的。
AI 训练的目标是让代码"能跑通"。而训练数据里能跑通的代码中,不安全写法占比很高。于是它很自然地复刻了 CWE 已经归纳好的老问题:
- CWE-79:XSS,把用户输入直接拼进页面;
- CWE-89:SQL 注入,把用户输入直接拼进查询;
- 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 把代码产量放大了很多倍,这两个习惯的价值也跟着放大了很多倍。前者让你知道出事了,后者让同样的事不发生在你身上。