什么是RASP?
RASP:Runtime application self-protection(运行时自我保护)
RASP是一种应用安全保护技术,在运行时检测攻击并且进行自我保护。它将保护程序像疫苗一样注入到应用程序中,应用程序融为一体,能实时检测和阻断安全攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预。
RASP在后端代码运行时做安全监测,但又不侵入后端代码,就得切入Web后端解释器。
以Java为例,Java支持以JavaAgent的方式,在class文件加载时修改字节码,在关键位置插入安全检查代码,实现RASP功能。- 同样,PHP也支持对PHP内核做类似的操作,PHP支持PHP扩展,实现这方面的需求。
RASP vs WAF
- WAF主要通过分析流量中的特征过滤攻击请求,并拦截携带有攻击特征的请求。WAF虽可有效过滤出绝大多数恶意请求,但是不知道应用运行时的上下文,必然会造成一定程度的误报。并且WAF严重依赖于特征库,各种花式绕过,导致特征编写很难以不变应万变。
- RASP的不同就在于运行在应用之中,与应用融为一体,可以获取到应用运行时的上下文,根据运行时上下文或者敏感操作,对攻击进行精准的识别或拦截。于此同时,由于RASP运行在应用之中,只要检测点选取合理,获取到的payload已经是解码过的真实payload,可以减少由于WAF规则的不完善导致的漏报。
- WAF作为应用外围的防线,RASP作为应用自身的安全防护,确保对攻击的有效拦截。RASP带来的性能消耗在5%~10%之间,在一定程度上仍然是可以接受的。由于RASP需要运行在应用中,不能像WAF一样在流量入口统一部署。需要根据应用开发的技术不同使用不同的RASP。比如.net应用与Java应用需要不同的RASP产品,增加了部署成本。
PHP-RASP实现
php扩展
PHP核心由两部分组成,一部分是PHP core,主要负责请求管理,文件和网络操作,另一部分是Zend引擎,Zend引擎负责编译和执行,以及内存资源的分配。
php中的rasp实现
参考:TRASP的实现
PHP RASP作为PHP解释器的扩展,是一个动态库so文件,PHP语言中类似的动态库很多,比如:mysql.so,RASP和MYSQL扩展的加载方式和运行原理一样,集成在PHP解释器中。
三个步骤来实现PHP RASP扩展模块:
1、预加载
任何一个PHP实例都会经过Module init、Request init、Request shutdown和Module shutdown四个过程。
2、Hook Opcode 或 Hook 内部函数
RASP需要监控各个敏感函数的调用,在PHP中比较好的方式便是 Hook Opcode 和 Hook内部函数。
3、参数获取与分析
在完成对敏感函数调用行为的监控后,通过ZEND_CALL_NUM_ARGS和ZEND_CALL_ARG可以获取到函数的参数个数和内容,便可根据函数的参数制定相应的策略。如文件类可以关注是否读取了敏感文件, 数据库操作类是否语法结构发生了变化等等。
JAVA-RASP实现
Java RASP 实现的基本思路类似于 Java 中的 AOP 技术(AOP:面向切面编程),将 RASP 的 Hook 代码注入到需要进行检测的地方,根据上下文和关键函数的参数等信息判断请求是否为恶意请求,并终止或继续执行流。
Reference
腾讯:RASP攻防 —— RASP安全应用与局限性浅析
从0开始的PHP RASP的学习
一类PHP RASP的实现
鸟哥:taint