聊聊最近挺热的RASP技术

最近这段时间,笔者接到一个私活,涉及安全防护相关的,对于一般的安全防护的做法来说,一般我想在其前端架设一个安全防护过滤的机制,说白了就是防火墙,例如下图:

基于防火墙的技术是比较传统的一种技术形态,在web流量进入web应用服务器之前,防火墙先对web流量进行分析,基于配置的一些安全规则和恶意攻击行为进行检验;

与客户进行了交流之后,发现防火墙这一需求还真是满足不了,其原因就是客户要的这种安全防护是一种与业务绑定非常紧的防护;例如,需要在请求流程中运行时的业务处理的一些数据作为输入,然后基于这些数据进行安全规则的防护;

而我们了解到的防火墙其是放在web服务器的前面,它只针对于http的web请求流进行规则解析,但无法和业务相绑定,因为应用是跑在web服务器中,而不是运行于防火墙中,只有运行到web服务器,甚至应用内部,这种防护才有效;

其次,对于黑客来说,防火墙是可以绕过的,而一旦web服务器和应用自身没有什么保障的话,那相当于主要过了防火墙,黑客玩你就和肉鸡一样了;

基于此需求,客户又不像在业务逻辑中加入大量的安全规则校验的代码,因此,有的专家提出了是不是采用RASP的方式,我一看发现正合适,本文就带着大家看看什么是RASP;


什么是RASP呢?

Runtime Application Self-Protection

Gartner在这两年提出了一个概念,在2014年应用安全报告里将 RASP 列为应用安全领域的关键趋势,原文引用如下:「Applications should not be delegating most of their runtime protection to the external devices. Applications should be capable of self- protection (i.e., have protection features built into the application runtime environment).」(应用程序不应该依赖外部组件进行运行时保护,而应该具备自我保护的能力,也即建立应用运行时环境保护机制。)


怎么理解这个“自我保护”呢?

实时应用自我保护。RASP运行在应用程序的内部,它的安全保护控制点通常放在应用程序和其他系统的交互连接点上,包括和用户、数据库、网络以及文件系统的连接点,从而,实时监测并拦截漏洞攻击。RASP 的亮点在于「自我保护」,能够在运行时结合上下文采取相应的保护方案。


好,那么捞点干的说,RASP究竟怎么实现呢?

1.使用servlet filter技术去实现

Filter技术在web服务器中的请求链中,和业务贴的非常的近,可以在这里面写安全规则校验;

但同一个问题又来了,filter主要是起到业务逻辑过滤的,大量的规则校验都占据请求调用时间,如果规则集非常多,或者根本上这个安全校验仅仅是业务的一部分,你在filter中加这些东西,对整个链条的时间有很大的损耗,这不一定合适,而且我们要的是和业务相关联的安全规则校验,主要该业务没有执行,不能为了该业务而影响整个请求调用链路的性能,因为每一次请求调用未必会执行该业务;

其次,filter的本意是过滤,和业务相关,在这里做安全规则校验,不一定合适;


2.采用java agent机制去做RASP

这个也是最普遍的做法,也是难度比较低的做法;

我们在做应用链路性能分析的时候,经常会遇到APM,其实APM就是以java agent,字节码修改来对原有的逻辑进行增加,在方法前后加上method_begin和method_end,从而可以统计出该业务的时间;

而RASP其实也是利用这种思路,只不过干的活不同,不是统计时间,而是对其业务规则进行安全校验:

如上图所示,请求进来之后,通过字节码的方式将业务进行修改,当触发需要进行安全校验的业务的时候,直接进入RASP的探针代码中进行执行,执行规则集的逻辑,当出现问题的时候,进行响应的Log或者拒绝策略的处理;


对于class的修改,可以看看JVM加载class的过程,在如下位置:

示意图如下:

当然,通过字节码修改的方法有很多,如:

都可以进行class文件的修改;


值得一提的是,这种思路目前有国内公司做了,蓝海讯通基于这个思路做了据说是国内第一家RASP产品,叫做OneRASP:

该产品据说可以提供一些规则集的定义和维护,完全达到前面讲的RASP的效果,并提供了一些易用性的界面可以进行展示:



甚至做的好的话,可以基于一些漏洞通过agent机制去打一些补丁:


从OneRASP产品提供的效率来看:

请求时间增加了5%左右,数量级并不大,至少是在一个数量级上的;

不过,这个数字我们不能这么看,其数量级的增长和你制定的安全规则集是有很大关系的,当你的规则集越多,规则越复杂的时候,增长时间越大‘;

笔者认为OneRASP给出的仅仅作为参考,至少可以得出一个结论上,当你的安全规则集设计合理的时候,至少这种思路是可用的,不会对响应时间增长为不同的数量级;


而是不是还有更好的办法呢?

当然是有的;


3.通过植入JVM内部去进行安全规则校验

从这张图的架构就可以看出,这种思路的好处就是植入到JVM中,因此效率也奇高,JVM提供了一个安全控制层,该层之上可以在每一次访问java类的时候,对其规则进行逻辑校验和拦截,这种机制的好处恰恰和前面的filter,探针这两种是异曲同工之妙,只不过其由于效率和性能的考量,采用植入JVM中进行运行,以JVM的插件形式进行拦截;

如上述架构,基于安全控制层可以做你的RASP容器,并制定拦截规则;

甚至我们看到,对于一些JRE的一些漏洞,这里可以提前进行发布;

而JVM的安全控制层是遵循JVM虚拟机规范的,因此这种思路其实可以做成通用的产品,基于不同的JVM版本,都可以加入,可以以打增量包的形式存在;


这种思路目前国内没有实现的,蓝海讯通 据说目前正要做,当然做这个东西需要对JVM深入了解的,有这样一个公司,waratek:

该公司其实就是和cloudVM的产品一个公司,并赢得了RSA2015年的世界大奖;


好吧,总结一下吧,本文首先描述了一下防火墙和RASP的区别,不能说防火墙就没有用了,笔者认为其和RASP有不同的应用场景,当与应用业务更耦合的时候,RASP貌似更合适一些‘;’

当然,使用java技术有很多的RASP的实现方式,filter是一种,目前主流的是采用探针的方式,如蓝海讯通的产品;而考虑到效率问题,最好的实现当然是JVM虚拟机的一层做了,而这个就是waratek了;

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院