背景
主动式IAST、被动式IAST、DAST有什么不一样,名字很像,但是检测能力、使用方式和适用场景截然不同。
IAST :交互式应用安全测试(Interactive Application Security Testing),2012年被Gartner咨询公司列为网络安全领域的Top 10技术之一(网传),随着市场的孕育和发展,近两年,IAST逐渐成为了一款家喻户晓的工具。IAST分为主动式(Active)和被动式(Passive)两种,检测原理也很不一样,下文开始分开介绍
DAST:动态应用程序安全测试(Dynamic Application Security Testing),DAST是一种成熟的安全工具,目前市面上已经有很多优秀的产品。
图文无关,实在没找到2012年的文章
原理
主动式(Active) IAST:主动式就像是DAST的升级版,DAST是孤军奋战,主动式IAST是派了一个特务去应用内部盯着资源
- 组成
主动式IAST由发包器和agent两部分组成,发包器负责拿到流量并遍历替换流量的参数(输入点)为poc,并重放流量,agent的职责分为两部分,应用启动时:负责对应用中的目标方法或者函数(执行漏洞的方法或函数)进行插桩,给目标方法加上一个代理层,应用运行时:捕获进入应用的流量,在代理层捕获方法的参数。 - 过程
- agent对应用进行插桩
- 发包器读取收集到的流量,对流量进行改造,并将流量依次发送给应用
- agent收到流量且在代理层捕获到方法参数
- 在确认是来自发包器的流量后,agent将流量特征和方法上下文信息发送给发包器
- 发包器根据方法名、方法参数等信息判断poc是否能顺利打入目标方法来决定是否存在漏洞。
被动式(Passive):被动式的技术实现难度比较高,实现的技术思路较为大胆
组成
被动式IAST只有一个agent部分,职责也分为两部分,应用启动时:负责对应用中的目标方法或者函数进行插桩,给目标方法加上一个代理层,应用运行时:捕获进入应用的流量,在代理层进行污点分析。过程
- agent根据预先设计好的目标方法列表进行插桩
目标方法列表会把方法分为三类,source、propagate和sink,source:应用获取外界输入数据的方法,例如:request.getRequestParameter(string);propagate:应用内用于处理数据的方法,例如:String.substring(int,int);sink:执行漏洞的方法或函数,例如:Runtime.exec(string)。
- 用户正常使用该应用,或者进行业务测试,或者进行自动化脚本测试
- agent捕获进入系统的流量,进行污点跟踪和分析
- agent在sink点的代理层判断是否有外界的输入流向该sink点,如果有则认为该方法的参数可以被外界控制
DAST:DAST的原理较为简单,就是拿着流量一通输出
组成
DAST只有一个发包器部分,发包器负责拿到流量并遍历替换流量的参数(输入点)为poc,并重放流量,再根据返回包的情况判断是否存在洞过程
- 发包器读取收集到的流量,对流量进行改造,并将流量依次发送给应用
- 应用正常处理后,返回应答
优点
主动式IAST:
- 极地的误报率
- 相比于DAST,里应外合,可以发现无回显的漏洞
- 相比于DAST,可以使用一定的手段限制脏数据的产生
- 相比于被动式,主动式IAST可以规避应用内的过滤导致的误报
被动式IAST:
- 较低的误报率
- 无需发包,无脏数据产生
- 支持加密和一次性验签的场景
- 可以发现无回显的漏洞
不用发包了 666
DAST:
- 对应用环境无侵入性
- 在应用的外部检测漏洞,可以更准确的检测某些漏洞
- 无需兼容语言和框架
缺点
主动式IAST:
- 在有加密、验签和一次性资源消耗型的场景中很可能发不进去包
系统成熟了,也就打不进去了
被动式IAST:
- 太怕过滤,有过滤就有误报
- 测试覆盖率随着业务测试覆盖率而变,业务测试不充分也会导致漏洞测试不充分
DAST:
- 在有加密、验签和一次性资源消耗型的场景中很可能发不进去包
- 检测不了某些无回显的漏洞
疯狂输出就是了
适用场景
主动式IAST:主动式IAST更适合做漏洞验证类的工作,比如被动式IAST测试出了漏洞,主动式则发包做验证,判断输入点是否有过滤
被动式IAST:更适合配合自动化测试脚本工作,这样才能有最完善的测试覆盖率
DAST:更适合一些有前端动作的漏洞,比如xss,信息泄露等
未来展望
主动式IAST:
- 主动式IAST发的包还是很臃肿的(拿到流量,装上poc,一通输出),如果被动式IAST或sast能提供一份关于输入点可疑性的信息,那主动式IAST的发包精确度就会大大增加,发包数量也自然下降了,测试效率就提升了。
什么叫输入点可疑性,比如被动式IAST或sast对某个应用进行检测,检测完后,发现某个API的P1参数被传播到漏洞执行函数里面去了,那么就可以认为P1这个输入点比较可疑,值得做被动式IAST poc测试,如果发现P2这个参数从未被使用过,这认为P2可信,不进行下一步的被动式IAST poc测试。
- 为提升在加密、验签和一次性资源消耗的场景下的测试覆盖,可以尝试在客户端和服务器之间加一个代理(能在应用内部修改更佳),当有业务测试流量经过时,代理替换参数为poc
被动式IAST:
- 被动式IAST最怕的就是过滤,虽然被动式IAST一般都会提供安全函数功能,但安全函数并不能应对框架级过滤、业务逻辑过滤和类型转换过滤等场景,但是如果企业在做安全管理时,能将被动式IAST和安全sdk深度结合,则可以从管理层视角屏蔽过滤导致的误报的问题,也可以让两款产品互相赋能,走向更高的水平
- 被动式IAST是在应用内部工作的,它最清楚应用的情况,它能较为准确的获取到API、输入点、输入点可疑性和可能存在的漏洞类型等信息,这些信息如果能有效的共享给其他产品,那一定能提升其他产品的能力。
参考来源
https://www.synopsys.com/glossary/what-is-IAST.html
https://www.contrastsecurity.com/security-influencers/why-the-difference-between-sast-DAST-and-IAST-matters
https://hdivsecurity.com/bornsecure/sast-DAST-vs-IAST-all-you-need-to-know-about-ast-tools/