别再盲目信任AI生成的代码了,这些逻辑漏洞你根本审不出来
别再盲目信任AI生成的代码了,这些逻辑漏洞你根本审不出来
最近"Vibe Coding"这个词在开发者圈子里火得不行。简单说就是:你跟AI描述需求,AI给你生成代码,你不用看懂,能跑就行。
听起来很美好对吧?我也这么觉得。直到上个月帮一家公司做代码审计,发现他们的核心业务模块全是AI生成的,里面埋的坑让我出了一身冷汗。
Karpathy(就是那个提出Vibe Coding概念的人)自己后来也转向了Agentic Engineering,说白了就是承认:纯Vibe Coding在逻辑上就站不住脚。
一个真实的审计案例
那家公司的用户权限系统是AI写的。我拿到代码后先看核心逻辑:
def check_permission(user, resource, action):
# AI生成的权限检查
permissions = get_user_permissions(user.id)
for perm in permissions:
if perm.resource == resource and perm.action == action:
return True
if perm.resource == '*' and perm.action == action:
return True
return False
看起来没问题?仔细看:perm.resource == '*'这个通配符逻辑,是AI自己"加戏"的。需求文档里根本没有通配符权限这个概念。但AI从训练数据里学到了"通配符是个好实践",就自作主张加上了。
更致命的是,数据库里压根没有*这个资源值,这个分支永远不会走到——但审计的时候如果只看代码逻辑,你会觉得它"覆盖了通配符场景"。
这就是AI代码最阴险的地方:看起来合理,实际上逻辑自洽但和业务不匹配。
AI代码常见的五类安全问题
经过这几个月的审计实践,我总结了AI生成代码最常见的安全漏洞:
1. 过度泛化的边界处理
AI喜欢"什么都考虑到",但经常考虑错:
# AI生成的输入校验
def sanitize_input(input_str):
if not input_str:
return ""
if len(input_str) > 1000:
return input_str[:1000] # 截断但没转义
return input_str # 完全没处理特殊字符
你以为它帮你做了安全校验,实际上SQL注入、XSS一个没防住。最怕的是开发者看到"有校验函数"就不再检查了。
2. 错误的安全假设
AI会从训练数据里学到一些"最佳实践",但应用场景常常搞错:
// AI认为这是安全的密码哈希
const crypto = require('crypto');
function hashPassword(password) {
return crypto.createHash('sha256').update(password).digest('hex');
}
SHA256不是密码哈希算法——没有salt、没有迭代、没有使用bcrypt/scrypt/argon2。但AI觉得"用了加密就是安全的"。
3. 静默的异常吞掉
这是最隐蔽的问题。AI为了让代码"不报错",经常加空的catch:
try {
// 处理用户上传的文件
processFile(upload.getInputStream());
} catch (Exception e) {
// AI加的注释:处理异常
log.debug("File processing skipped");
}
异常被吞掉了,文件处理失败后用户照样收到"上传成功"的提示。如果这个文件是恶意的,后续解析时再触发漏洞,日志里连痕迹都没有。
4. 时序竞争条件
AI不太擅长处理并发场景。我审过一个支付接口:
def transfer(from_account, to_account, amount):
balance = get_balance(from_account)
if balance >= amount:
# 这里有时间窗口,另一个线程可能也在扣款
set_balance(from_account, balance - amount)
set_balance(to_account, get_balance(to_account) + amount)
经典的TOCTOU(检查到使用)竞争条件。AI觉得"先检查再修改"逻辑没问题,但多线程环境下这会导致重复扣款。
5. 依赖注入的隐式信任
AI生成代码时喜欢引入各种库,但很少检查版本安全性:
# requirements.txt - AI自动生成的
flask==2.3.0
requests==2.28.0
pyyaml==5.3.1 # 这个版本有RCE漏洞
Jinja2==3.0.0 # 这个版本有沙箱逃逸
AI不关心CVE,它只关心"能跑起来"。
如何审计AI生成的代码
- 先跑再审:用SAST工具(Semgrep、CodeQL)扫一遍,AI代码的基本漏洞模式工具能抓到。
- 重点审逻辑:工具抓不到的是业务逻辑漏洞。问自己三个问题:
- 这段代码的假设是什么?
- 假设在什么情况下不成立?
- 不成立时会怎样?
- 盯紧异常处理:搜
catch、except,凡是空的或者只打日志的,标记出来。
- 检查依赖版本:用
pip audit或safety check扫一遍依赖。
- 压力测试:AI代码的并发处理基本都有问题,用并发测试工具重点压一下。
最后的忠告
AI是好工具,但不是好程序员。它可以帮你快速搭建原型,但生产环境的安全审计必须人工来做。
别被"AI写的代码比人写的少bug"这种话忽悠了。AI的bug更隐蔽——它不是语法错误,是逻辑层面的"看起来对但实际不对"。
Karpathy自己都放弃了Vibe Coding,你还在盲目信任AI输出吗?
关注「安全值班室」公众号
每天AI安全早报 + 实战攻防案例 + 网安学习路线连载
浙公网安备 33010602011771号