Sqreen 作为一款IAST产品,用户在项目中导入他们的agent,之后可在控制台查看检测到的安全风险,并进行防御(RASP)。
技术介绍
如下图所示,Sqreen主要由三个组件组成,MicroAgent、Security Engine和Sqreen Platform,Security Engine部署于MicroAgent内部,开发者只要在启动应用时倒入MicroAgent即可,Platform主要用于接收Agent信息并且可视化给用户。
可见MicroAgent是其主要部件,主要有以下功能:
- 动态插桩
- 监控程序并收集信息
- 根据安全引擎指示执行安全响应
- 与Platform通信
防御技术
从下图可以看到Sqreen使用多层次保护应用程序,这里主要介绍In-App WAF 和 RASP。
In-App WAF
应用内WAF是第一道防线,和外部防火墙一样,主要通过模式匹配来检测和阻止恶意流量,但与外部WAF不同的是,应用内WAF可以根据当前应用的数据库、框架和编程语言应用不同的规则,提高效率。
如下图,在新建一个规则时,可以选择匹配报文的哪些字段(其实感觉跟外部WAF一样)
接着可以选择对字段的匹配规则
其中hasSQLinjection和hasXSSinjection这两个实际上是预定义的正则,类似下图所示:
下图可以看出In-App WAF与外部WAF的区别,即与本应用无关的其他技术被Disabled:
RASP(Runtime Application Self-Protection)
RASP是存在很久的概念了(目前还没深入学习,后期会补上技术原理),这里系统支持以下漏洞的防御:
In-App WAF v.s. RASP
从技术原理上可以看到两者的区别,In-App WAF本质还是WAF,通过正则规则匹配拦截恶意流量,而RASP则是hook了关键api,通过动态污点分析等方式实现高精度的防御。
用法
申请适用后,点击“Connect a new application”:
进入部署引导界面,选择语言和项目名称,点击“show instructions”后可以看到部署的java agent:
按右侧指示操作即可,同时可以看到对于java是使用javaagent实现的,估计是hook了一些函数。
对于Java项目,下载agent,并加参数重启应用(产品上线时可以用SDK集成的方案,详情见https://docs.sqreen.com/java/user-monitoring/):
1
2curl https://download.sqreen.com/java/sqreen.jar -o sqreen.jar
java -javaagent:sqreen.jar -Dsqreen.token=env_org_dd05c0b8eb3317bbbc7857420ec86abe2ea5aa347ffc6c3efc8ef060 -Dsqreen.app_name=JavaDemo -jar java-sec-code-1.0.0.jar
可以看到Web页面最下面,有应用上线了:
![image-20200604170231764](iast-Sqreen初探/image-20200604170231764.png)
试用结果
Java方面尝试了一下JavaSecCode,反射型/存储型XSS、SQLi、命令注入、XXE都没能检测到,估计是WAF那边估计是规则问题,RASP因为文档里没有介绍具体原理,不好给出解释。
Nodejs方面原本想尝试用NodeSecCode试一下的,但是测试发现Sqreen并不支持egg框架,在app.js加入require后会报如下错误:
1 | It seems that the following modules have been required before Sqreen: |
于是手写一简单的express服务,含一个反射xss代码,SqreenAgent可以成功部署,但是仍没有发现该漏洞。
总结
Sqreen 主要利用动态插桩技术实现了IAST,但是实际测试来看效果并不是很好(不论Java还是Nodejs都没有发现漏洞),官方推荐是配合Nikto进行扫描,也就是说,本产品由于规则和设计等原因,还是需要结合传统黑盒扫描的爬虫或Payload才能有效果。
相关资料
Sqreen官方文档,https://docs.sqreen.com/
Sqreen GitHub,https://github.com/sqreen