“代码静态分析,我们自己跑个SonarQube不就行了?”这话听着没毛病。工具开源、规则现成,开发团队自己扫一遍,好像确实没必要花那个钱。直到你拿着自己扫的报告去交差,对方翻了两页,问了一句:“这份报告盖的是哪个机构的章?认可范围里有没有代码审计这一项?”
你答不上来。因为你自己扫的那份,本质上只是一份内部技术记录,在项目验收、等保测评、招投标这些正式场合,不具备合规效力。

静态应用程序安全测试
静态代码分析(业内叫 SAST,静态应用程序安全测试)完全可以外包,而且在国内不少场景里,自己跑一遍工具出的结果,叫“告警”,评审桌上是不认的。
而第三方出的东西,叫“审计结论”。这中间的差距,不在工具本身,在谁对结果负责。
原因很简单:等保 2.0(GB/T 22239-2019)对三级及以上系统明确要求开展代码安全审查和上线前安全检查;政务信息化项目验收、密评、招投标响应,也越来越多地把“第三方代码审计报告”写进资质条款。这些场合要的不只是“扫没扫”,而是谁扫的、依据什么标准、有没有独立签字。承建方自己出具的报告,属于“自己建自己验”,独立性问题一被追问就站不住。
另外,静态分析本身有个绕不过去的现实:工具扫出来的东西,误报率很高。一份原始扫描报告动辄上千条告警,开发团队通常的处理方式是“扫过了、报告存档了”,然后逐条都没修。第三方机构的价值恰恰在这里:有人逐条人工复核,把真正能利用的漏洞挑出来,剩下的标注为误报或编码风格问题,最后给你的是一份能直接派工的整改单,而不是一份吓人的清单。
1.静态分析(SAST):不运行程序,直接读源代码,像把房子的设计图纸摊开一根管线一根管线地查。擅长抓注入类漏洞(SQL、命令、LDAP)、硬编码密钥与密码、危险函数调用、未校验的输入、加密算法不合规(还在用 MD5/DES、RSA 密钥长度不足)、日志打印敏感信息等。
2.动态测试 / 渗透测试(DAST):对着运行中的系统发请求,看会不会报错、会不会吐出数据。它能发现“门没锁”,但不知道是哪行代码造成的。
3.人工代码走查:不看模式看逻辑,专抓工具看不懂的越权、流程绕过、状态机跳跃、并发竞态。比如“审批通过后还能撤回修改金额”这类问题,工具完全无能为力。
成熟的商业引擎如 Fortify、Checkmarx、Coverity,开源方案如 SonarQube、Semgrep,规则库基本都覆盖 OWASP Top 10 和 CWE Top 25(这是国际公认的最常见弱点列表,注入、失效访问控制、硬编码凭证常年排在前列)。但引擎再强也只是第一步,后面的人工复核才是决定报告质量的关键。
先给个真实量级的参考:一个约 10 万行、单一 Java 语言的项目,工具全量扫描通常在几小时内完成;真正吃时间的是后面的环节:人工复核、缺陷分级、写报告、三级审核、用章审批。
所以行业里的加急档大致是这样排的:常规 5~10 个工作日,极限能做到隔天

软件测试周期
1.必须给的:
可编译的完整源码,含全部子模块、前端工程、SQL 脚本、存储过程、配置文件。只给部分目录等于只审部分风险。
构建脚本与环境说明:Maven/Gradle/npm 配置、JDK 或 Node 版本、私有仓库地址与凭据。编译不过,扫描根本起不来。
第三方组件清单,供应链风险现在几乎是必查项,Log4j 那件事(CVE-2021-44228)就是教训:补丁两个月前就发布了,没人核对项目里到底引了哪个版本。
系统架构与部署说明:用了什么框架、有没有网关、鉴权怎么做的、数据流向。这决定了审计人员能不能看懂越权这类逻辑问题。
账号与测试数据:至少两套权限的账号(普通用户 + 管理员),用于配合验证权限类缺陷。
明确检测范围与排除项:哪些目录是自动生成的代码、哪些是第三方库不参与审计,提前说明能省下大量误报争论。
2.千万别给的: 生产环境的真实密钥、线上数据库密码、真实的客户数据。送检前把这些替换成测试值,一方面是真没必要冒这个险,另一方面,代码里如果还留着硬编码的生产密钥,这本身就是一条高危缺陷,留着只会让自己难堪。
3.商务层面要确认的: 保密协议(NDA)、源码交付与销毁方式、报告份数与交付形式、是否允许驻场(政务系统多在专网,远程连不进去)。
静态代码分析不仅能找第三方做,在验收、等保、入网这些场合还应该找第三方做,要的是独立性、资质章,以及那份能把一千条误报压成几十条真风险的复核功夫。想快,就把高危清零再送检、把材料一次给齐、把时间线倒排。
标签:第三方测试周期、静态代码分析