思想
代码审计是从软件测试发展而来,早起一般采用常规软件测试与渗透测试的手段来发现源码漏洞,但是随着软件规模的越来越大,架构越来越复杂,安全漏洞和后门也越来越多越来越隐蔽,这使得传统的软件测试方法很难检出源码源码中的安全漏洞,于是通过源码来识别程序中安全漏洞的思想开始出现。可以说代码审计的出现有效解决了传统测试与渗透测试无法“细致入微”经常出现漏测的问题。
要求
既然是通过源码来识别程序中的漏洞,那么对于人员也就有了较高的要求,总结来讲以下四点,我们可以有针对的进行学习。
1、漏洞理解能力;
对于漏洞成因的深入理解,是Web漏洞挖掘的基础,而且Web应用中的漏洞在不同语言中表现形式基本一致,这使得这项能力的培养性价比非常高。
2、源码阅读能力;
能够通过阅读源码,理解其中逻辑。并且能够通过阅读文档和提问解决遇到的问题。
3、动态调试能力;
在代码逻辑复杂的情况下,通过多次调试或关键位置设置断点辅助理解源码逻辑。
4、工具使用能力;
主要为自动化代码审计工具与开发工具,因为当前代码审计的开展方式一般采用自动化+人工的方式进行,所以自动化审计工具与开发工具都需要会用。
方法
据统计,由输入数据引发的安全问题,在源代码安全漏洞中占比高达90%。所以源码审计的核心思路在于跟踪这些外部输入,是否被安全的处理。具体方法有。
通读代码法
通读代码的主要是使用先整体后局部的方法,对的整体架构以及具体业务功能进行分析;
先整体
源码框架分析
了解源码使用的底层框架(如gin,spring,django等),根据底层框架不禁可以快速推测其使可能存在的安全问题,并且可以帮助我们更加快速的厘清源码的目录结构。
源码依赖分析
根据依赖提供的API推测系统可能存在的功能,以及根据依赖判断其可能存在的开源组件漏洞(如fastjson反序列化)。
配置文件分析
通过对于配置文件的分析,可以推测系统可能存在的功能,并且可以关注配置文件中的关键key值是否加密处理,避免被结合其他漏洞进行利用。
源码路径分析
根据文件夹名称推测程序实现了哪些功能,了解一些常用框架的目录组织方式可以帮助我们更好的应对源码路径分析。
如果能找到对于源码的说明文档,建议优先快速浏览一遍,好的文档可以帮助我们快速了解一个项目。
后局部
过滤文件分析
过滤文件(功能)在代码审计中有着至关重要的地位,其直接关系到不同漏洞挖掘的优先级,以及漏洞是否会被真正的利用成功。如nginx的代理规则分析,网关服务的过滤规则分析,服务的filter链分析等;
接口权限梳理
通过了过滤规则的分析,即可对于授权接口与未授权接口进行区分梳理,通常情况下未授权接口的分析与测试优先级要优先于授权接口,因为其利用成本更加低廉,危害更大。
身份认证分析
分析完接口后一般会对于身份认证进行优先分析,如突破身份认证的屏障后后续漏洞的利用成本也会相应变低。
具体功能分析
按照自己的喜好开始分模块的阅读源码。或者止步与身份认证的分析,开始采用危险函数或功能点定向审计的方式进行分析,因为有了前面的分析,我们对于代码的架构,过滤,权限等关键设计已经有了一定的了解,这使得使用危险函数回溯与功能点定向审计的准确率,与审计效率大幅度提升。
危险函数回溯审计法
危险函数回溯方法,是以危险函数或危险配置的关注字入手,逆向追踪参数传递过程,如果参数在传递过程可以被用户操纵且没有得到过滤处理则可以初步判断存在问题。
功能点定向审计法
功能点定向审计是先根据要测试的功能,先找到它的前端调用接口,再逐步跟进排查后端代码逻辑与调用关系,以发现代码执行过程中的漏洞,通常情况下需要我们对于系统功能有一定的了解,且对于功能点可能会有哪些漏洞有一定的了解。这样才不至于盲目乱测。
自动化审计法
自动化代码审计核心为使用工具对于源码进行扫描,再通过人工去对于审计内容进行核查,选择工具需要重点考察其两个能力;
1、污点识别能力,污点识别能力决定着测试的漏报情况
2、污点最终能力,污点追踪能力决定着测试的误报情况
目前较为常用的自动化工具有:SemGrep,CodeQL,Fortify_SCA。
综合来看
1、SemGrep:漏报少,误报多,因为是纯静态的污点识别,几乎无污点最终能力;
2、CodeQL:漏报多,误报少,因为基于ast分析,所以误报少,但是其污点识别的规则较为有限,需要长期的积累完善,较为适合扫描有限几个漏洞,且有专人维护的场景;
3、Fortify_SCA:漏报适中,误报适中,因为是商业化工具,整体来讲比较均衡,适合不想折腾又有自动化代码扫描的需求;
``这个比较建立再已知所有功能的情况下,因为部分测试方法在不知道有对应功能的情况下是很难展开的
良好: 该方法很有可能发现漏洞;
一般: 该方法有机会发现一些漏洞,但不被认为是一个好的选择;
较差: 该方法几乎没有或根本没有机会找到列出的漏洞;
以上为对于代码审计的常用方法的说明,在测试不同类型时选择最合适的技术是测试人员的基本素养,一般情况下想完整完成一个项目各种代码审计技术会相互结合使用,而且代码审计也会与渗透测试结合使用。当前以源码为主导的渗透测试手段在某些特定场景下已经开始逐渐替代传统的黑盒渗透测试,所以学习好代码审计已经变得比较重要。