方法

Vibe-Coded 软件

一款大部分由 AI 工具生成的 App,其安全关键路径没有任何人读过。它演示得很干净,崩坏得很可预测:缺失授权、未校验的输入、泄露的密钥。最常见的严重缺陷,是一个能用的登录界面,却没有任何服务端检查阻止用户 A 读取用户 B 的数据。

最近审阅: 审阅人Christof Jori wiki ↗

Vibe-coded 软件是 vibe coding 的产物:一款大部分由 AI 工具构建的应用,其中对安全要紧的部分没有任何人读过。它的定义不在于是 AI 生成的。它的定义在于,在那些一旦出错就会损失真实金钱、真实数据或造成真实泄露的路径上,缺少人工评审。大量 AI 生成的代码是经过评审、加固、完全安全的。Vibe-coded 软件是其中没有做这些的那个子集。

它的标志性特征是:演示得干净,崩坏得可预测。演示干净,是因为模型非常擅长让 happy path 跑起来,也就是你在演示里走的那条路。崩坏可预测,是因为故障每次都聚集在同样的那几个地方:只检查你是否登录、却不检查你是否有权看这条记录的授权;被信任而不是被校验的输入;硬编码或被发到浏览器的密钥;没有限流;除了一个通用 catch 之外没有错误处理。审计过一个 vibe-coded App 的人,在打开下一个之前就能猜到它的发现项。

举个例子,最典型的那个。一款订票 App 有一个干净的登录。进去之后,App 从 /api/bookings/1234 拉取你的订单。把 1234 改成 1235,你就看到了别人的订单,他的姓名、他的地址、他的支付凭证。登录让人感觉安全,所以没人去查。服务器从未验证过登录用户是否拥有 1235 这张订单。这叫做对象级授权失效(broken object level authorization)漏洞,它是 vibe-coded 软件里最常见的严重缺陷,因为演示从不会去走"一个用户去够另一个用户数据"这种情形。

诚实的取舍:vibe-coded 软件确实更便宜、更快产出,对一个原型来说这恰恰正确。代价是,省下的成本被提前了,而账单晚些才到,形式可能是一次泄露、一起 GDPR 事件,或一次重写。指出这一点不是反 AI 的清高。一旦把缺失的那 10% 补回来,代码可以完全没问题。错误在于把那 90% 上线,并假定演示已经证明了另外那 10% 的存在。

Wavect 在 Software Quality Assurance 下,正是按这个画像来审计 vibe-coded 软件。我们先读授权路径,因为最糟糕、最常见的漏洞就住在那里,然后是输入校验、密钥和错误处理,再补上回归测试套件,以及那道阻止下一次改动重新捅开窟窿的 CI/CD 闸门。这不是重写。这是把工具留下的技术债变得可见,然后偿还其中会伤到你的那一部分。

// FAQ

常见问题

一个能用的登录界面,却没有服务端授权。App 检查你是否登录,却不检查你是否有权看你请求的那条具体记录。改一下 URL 里的 ID,你就读到了另一个用户的数据。演示从不测试这一点,所以在被人利用之前没人会发现。
去读授权路径。如果登录是唯一的访问检查,单条记录又不针对当前用户做校验,那它几乎肯定是 vibe-coded。其他迹象:密钥在客户端打包里、没有输入校验、一个通用的 catch-all 错误处理器,以及没有一套配得上这个名字的测试套件。
不是。它意味着没人读过安全关键路径。生成的代码在 happy path 上往往是干净、合理的。问题出在缺失的那 10%,也就是提示词从没要求过的授权、校验和密钥处理。把这部分补回来,同一份代码库就可以是可上生产的。