企业拿到源码后 第一次安全审查和代码走读该怎么做 全是干货
很多人刚拿到源码第一反应就是赶紧找漏洞,上来就堆工具扫,扫完出一堆报告就觉得完事了。
真不是这样。
你拿到源码的场景不一样,要查的重点完全不一样。是收购了小团队拿到的项目源码?还是外包开发完交付的成果?还是开源项目二次开发改了一堆东西要上线?
不同场景下,安全风险的来源天差地别。
外包交付的你得重点查有没有留后门,有没有埋恶意代码,是不是直接抄了开源项目没遵守License。收购来的老项目,得重点查历史遗留的漏洞,比如多年没更的依赖包,硬编码在代码里的数据库密码。开源二次开发的,就得重点查开源组件的已知漏洞,还有自己改的代码有没有引入新问题。

第一次审查别贪多,先把核心风险兜住再说。上来就要把所有问题都找出来,不仅时间不够,团队也扛不住,最后反而漏了最关键的问题。

很多人觉得代码走读就是人工一行行看,那几十上百万行的项目,看到猴年马月去。第一次审查,先把能用自动化解决的问题都解决掉,把明显的问题都筛出来,再给人工聚焦重点。
先扫什么?第一就是敏感信息泄露。这个是最容易查,也是危害最大的。源码里硬编码的数据库密码、API密钥、云服务的AccessKey,甚至是开发人员留在注释里的内网地址、测试账号,这些东西一抓一个准。
现在有很多开源工具都能做,只要配置好规则,跑一遍就能把90%以上的硬编码敏感信息找出来。别嫌麻烦,我见过太多项目上线半年,才发现数据库密码直接写在配置文件里推到了公有代码库,被爬虫爬下来直接拖库,哭都来不及。
然后就是扫已知漏洞,尤其是开源组件的漏洞。现在哪个项目不带十几个几十个开源依赖?NPM、Maven、PyPI随便拉一个依赖,说不定就带一个已经公开的CVE漏洞,等级还是高危的。你不用工具扫,人工根本不可能知道哪个版本有问题。
这里一定要注意,别只扫直接用的依赖,传递依赖也要扫。很多高危漏洞就是藏在深层的传递依赖里,你自己没直接用,但是你用的组件用了,一样能打到你。
最后再扫代码的常见安全缺陷,比如SQL注入、XSS跨站脚本、路径遍历、命令注入这些常见的漏洞类型。现在的静态代码分析工具已经很成熟了,能把大部分常见的风险点都标出来,给人工走读缩小范围。
自动化跑完,别直接就拿着报告给开发,工具误报率其实不低,尤其是规则配置不好的时候,一半都是误报。先让人把误报筛一遍,剩下的真问题,再分类排优先级。

自动化筛完,剩下的核心逻辑,就得人工走读了。第一次走读,别面面俱到,就盯着几个核心风险点啃,吃透了比你囫囵读完全部代码有用多了。
第一个重点就是入口和权限校验。所有对外暴露的接口,所有用户能传参的地方,都得停下来看一看。有没有做参数校验?有没有做权限控制?
我之前看过一个外包做的项目,用户修改个人信息的接口,直接传一个userid就能改任意用户的信息,后端根本没校验当前登录用户有没有权限改这个id。这种问题,工具不一定能扫出来,但是人工一看,就能发现大问题。
第二个重点就是核心业务逻辑。比如支付、下单、权限这些核心流程,顺着走一遍,看看逻辑有没有漏洞。有没有可能绕过流程?比如下单的时候能不能改商品价格?提现的时候能不能改收款人账户?这些逻辑问题,自动化工具根本查不出来,只有人工顺着业务流程走一遍才能发现。
第三个就是之前自动化扫出来的高危问题点,人工盯着确认。工具说这里有个SQL注入,你就得进去看看代码,到底是不是真的,有没有做过滤,危害有多大。
还有最容易被忽略的一点,就是后门和恶意代码。尤其是外包交付的项目,一定要留个心眼。看看有没有奇怪的接口,比如名字叫什么test.php、debug.aspx,还没做权限校验,能直接执行命令的。看看有没有奇怪的加密字符串,解码之后是敏感操作的。之前就见过外包给政府做项目,留了个后门,能直接拿服务器权限,过了两三年才被发现,多吓人。

第一次走读,不用所有人把所有代码都读一遍。找几个懂安全又懂业务开发的人,分模块,每个人盯自己负责的核心部分,效率最高。别让一堆人挤在一起读同一段代码,浪费人力还没效果。

很多人审查完,攒了一堆问题,往那一堆就完事了。那你做这个审查有什么用?
第一次审查结束,一定要输出清晰的结果,把问题按高危、中危、低危分好类。高危的必须上线前改,比如留了后门、有硬编码密钥、核心权限有漏洞,这些不改绝对不能上线。中危的可以排期改,低危的可以记下来后续迭代慢慢修复。
更重要的是,要把审查过程中发现的问题,整理成你自己团队的规范。下次再拿源码,下次再开发新功能,就能避开这些坑。比如这次发现好几个硬编码密钥的问题,那下次就把敏感信息检加入CI流程,每次提交代码自动扫,就不会再犯了。
还有,要是你拿到的是老项目,第一次审查之后,别觉得就一劳永逸了。代码会更,依赖会更,新的漏洞会不断出来,定期还要再扫,定期还要再查。尤其是依赖的漏洞,每个月更一次都不为过。

很多企业第一次做源码安全审查,上来就想搞一套完美的流程,找一堆人,花几个月时间,最后反而搞不下去。
真没必要。第一次做,先把核心流程走通,先把最危险的问题找出来,就已经赢了。先查敏感信息,再查开源漏洞,再走读核心逻辑,就这三步,就能挡住80%以上的常见安全风险。
你就算第一次没找全所有问题,也比什么都不做强。慢慢迭代流程,慢慢补全检查点,越做越顺。
源码安全这东西,从来都不是一锤子买卖,是一个持续的过程。第一次审查做好了,后续的维护和迭代就有了基础,不会动不动就爆出来一个让人措手不及的大漏洞。
现在供应链攻击越来越多,拿到源码不做审查就直接上线,真的相当于把家门钥匙随便放在门口,不出事才怪。把该做的步骤做到位,该查的点查到,才能睡得安稳。

夜雨聆风