代码审计软件
去年帮一个做电商的代码朋友看他们刚上线的支付系统,代码里有一行 `if (user.isAdmin || request.getParameter("debug").equals("true"))`,审计直接把我干沉默了。软件这玩意儿要是代码被人扫到,整个后台数据随便拿。审计他们团队六个人,软件写了八个月,代码上线前没人发现这行代码。审计后来花了三千多块买了个商业代码审计工具跑了一遍,软件报告出来四十七个高危漏洞,代码这行就在第三页。审计 代码审计软件干的软件就是这种事——把人眼容易漏掉的东西翻出来。它不编译、代码不运行,审计直接读源码,软件像法医解剖一样顺着数据流走。输入从哪来,经过哪些函数,最后有没有做过滤,全给你标出来。好的工具能追到 `Runtime.exec()` 这种危险调用,也能发现硬编码在配置文件里的数据库密码。 市面上主流的几款,用下来感觉差别挺大。Fortify 老牌,规则库厚,但误报多得让人想砸键盘。Checkmarx 对 Java 支持好,C# 项目就有点吃力。SonarQube 便宜甚至免费,但安全规则偏弱,更适合查代码风格。国内像 Seay、代码卫士这些,对国产框架和中间件理解更深,Struts2 那些老漏洞识别得准,但界面和报告嘛……能用就行。 说个真事。前年某银行内部搞代码审计,用工具扫出一个反序列化漏洞,位置在一个很老的日志组件里。开发团队说这组件三年前就不用了,代码没删而已。结果渗透测试的人直接构造 payload 打进去,服务器权限到手。工具报的是“潜在风险”,人判断是“死代码”,两边都没错,但合在一起就是事故。 所以别指望工具能替你思考。它擅长的是模式匹配——看到 `select * from` 加字符串拼接就标 SQL 注入,看到 `eval()` 就标代码执行。但业务逻辑漏洞它基本抓瞎。比如优惠券可以无限领、订单金额能改成负数、越权查看别人订单,这些工具报不出来,得靠人对着业务流程一点点捋。 配置也很要命。默认规则全开,一个十万行的项目能报出两千个问题,开发看一眼就关了。得根据项目语言、框架、部署环境调规则集。Java Web 项目就把反序列化、JNDI 注入、表达式注入的规则权重调高,把 XSS 里对 JSON 接口的误报关掉。这活儿没干过几轮,调不明白。 成本方面,商业工具按代码行数或开发者人数收费,一年几万到几十万不等。开源方案省钱但费人,得自己写规则、集成 CI、处理误报。小团队用 SonarQube 加 FindSecBugs 插件,再配个 Seay 扫一扫,基本够用。大厂直接买 Fortify 或 Checkmarx,再养个安全团队专门看报告。 有个细节挺有意思。很多工具扫出来的漏洞,开发修的时候只改表面。比如工具报 `Runtime.exec(cmd)` 有命令注入,开发就把 `cmd` 里的分号过滤掉,但没管 `|` 和 `$()`。下次扫描工具不报了,漏洞还在。所以审计软件得配合人工复核,不然就是自欺欺人。 说到底,代码审计软件就是个放大镜。它能让你看清代码里的坑,但填坑还得靠人。别把它当银弹,也别当摆设。买之前先想清楚:团队有没有人看得懂报告,有没有流程保证漏洞被修,有没有机制防止新代码引入老问题。这三个问题答不上来,工具再贵也是白买。