最近在实施SDL项目想改进下自动化扫描的方式提高扫描的准确性,鉴于已经有相对成型的IAST产品于是就想分析下IAST的原理。互联网上对RASP分析文章比较多,但是对于IAST的原理分析实在很少。之前采用的是代理模式进行黑盒扫描,比如常用的AWVS,相信大家都有体会黑盒误报率非常高,在实施SDL过程中就需要投入大量人力去验证漏洞。IAST的好处就是能实现扫描漏洞0误报。要分析IAST就少不了要分析RASP原理,鉴于RASP的原理分析已经有很多文章了,为了文章的连贯性我会在另外一篇文章中再简单介绍下。
这里测试2个正常的url,通过IAST和AWVS进行扫描。其他的扫描大家可以自行测试。
http://10.57.131.36:8080/vulns/005-file-write.jsp?filename=123.txt&filedata=some-report-data
AWVS扫描结果,识别不出来是漏洞。
IAST识别出来是任意写文件漏洞
http://10.57.131.36:8080/vulns/004-command-1.jsp?cmd=”openraspcmd”
AWVS扫描出来一大推误报
IAST识别出来是命令执行漏洞
这里简单介绍下扫描区别为什么这么大,因为黑盒主要是通过构造payload请求分析请求response来判断是否为漏洞,比如对于盲注的命令执行漏洞,由于正常请求和带payload的请求响应的结果差不多,所以黑盒也就无法判断是否为漏洞了。那么IAST是如何判断的呢?接着往下看。
IAST架构图:
扫描模块包括三个模块:预处理模块(Preprocessor)、扫描模块(Scanner)、监控模块(Monitor)
预处理模块即图中HTTPServer部分,用于接收agent插件的http请求,处理、存储、分发http请求信息
扫描模块用于运行扫描插件,执行漏洞扫描逻辑
监控模块用于定期获取其他模块的运行时信息,调整参数,提供控制台的HTTP服务等
rasp上需要安装iast插件,iast扫描器要配合iast插件使用。
正如所有的程序都一样有个入口点。iast的入口点是run 然后调用start函数。我们从入口开始一步步往下走。
启动的时候会去读配置文件
然后会判断初始化一些信息,比如python大于3.7,数据库表初始化。
测试是否可以连接云控
通过pid判断iast的进程是否开启
这里可以看到即将启动了Preprocessor、Monitor以及n多个扫描模块。
接着先开始启动preprocessor和monitor模块
所有模块启动都依赖基础模块
BaseModule基础类,所有module继承自此类
断点进入到preprocessor模块
tornado是一个可以处理http请求的框架
开启httpserver服务用于接收agent插件的http请求,处理、存储、分发http请求信息
加载监控模块,用于监控预处理模块、各个扫描模块、监控模块
启动监控台端口18664
这个就是IAST扫描的监控后台
循环检测各个模块是否存活,如果有模块没存活就结束掉结束其他所有模块。
开始加载扫描模块
扫描初始化所有扫描插件
通过动态加载模块遍历加载所有扫描插件plugin_module =__import__(plugin_import_path,fromlist=[plugin_name])
加载完各个模块后,就等着接收扫描请求了。发起正常请求, httpserver获取到rasp agent发过来的原始请求。
这是一个正常的xml请求
http://10.57.131.36:8080/vulns/007-xxe.jsp?data=<?xml version="1.0"encoding="UTF-8"?> <note> <to>Tovde</to><from>Jani</from> <heading>Reminder</heading><body>Don't forget me this weekend!</body> </note>
这里接收的来自rasp传给iast的原始请求,这里hook_info为空,因为是正常请求还未触发执行函数。
通过日志分析也是一样的。几处标红的地方。1、用户发送正常请求到raspagent所在的服务器,2、rasp的底层http将流量hook下来发送给iast3、iast加入恶意payload发送到rasp4、rasp上的iast插件将hook信息返回给iast,iast判断是否存在漏洞
遍历http请求中所有的参数,header、body、 get 里面的参数,加上payload。
这里与黑盒还有个区别就是不用太多的payload,只要一个payload,能判断返回的信息有hook_info即可判断是否有漏洞。
遍历payload发起请求
检查漏洞是否触发
对比hook信息的hook_type是否为xxe以及entity是否是IAST发出去的payload既可以判断是否存在漏洞。
SDL大致有这么几个阶段,需求评审、开发、测试、发布、上线。每个阶段对应的重要的安全活动有,威胁建模、代码扫描、自动化安全测试、CICD发布拦截、上线依赖漏洞识别和威胁情报收集。
根据我实施SDL的经验来看,需求评审阶段最重要的是出具安全需求文档,生成的这个安全需求文档是纯粹的指导性意义,没有任何可以自动检查的手段,容易流于表面。开发阶段采用代码扫描即是SAST,SAST最大的问题就是误报和漏报同样突出。一个系统,有5个漏洞,SAST扫描一下可能报告100个漏洞,其中2个是真的漏洞98个是误报,还需要投入大量人力来排查。测试阶段通常采用自动化扫描,正如文章开始介绍的IAST与黑盒扫描的区别,黑盒扫描误报率太高也无需要花费大量人力去验证漏洞,通过部署IAST产品,QA完成本职工作的质量测试时,IAST系统自动完成一份安全报告,而且还能保证安全测试的准确性从而大量减少人力成本,我觉得IAST在SDL中是个大大的加分项。至于上线之后就是些日常扫描与监控,各家玩法都差不多。
*本文作者:hackeryeah,转载请注明来自FreeBuf.COM