1.RASP技术概述
RASP(Runtime application self-protection,运行时应用自我保护)是一种新型应用安全保护技术,能实时检测和阻断攻击,使应用程序具备自我保护能力,当应用程序遭受到实际攻击伤害,就可以自动对其进行防御,而不需要进行人工干预,并且应用程序无需在编码时进行任何的修改,只需进行简单的配置即可。
用户访问Web应用时,首先经过防火墙、waf等边界防护设备,然后该请求才会到达应用服务器,而RASP的检测和保护功能就是在应用程序运行的系统上运行的,它会拦截从应用程序到系统的所有调用,确保它们是安全的,并直接在应用程序内验证数据请求。
1.1.Java RASP和PHP RASP
Java和PHP的相似之处在于,在编译与执行过程中,编译器首先会将源代码转换为字节码指令流再使用对应的解释器执行字节码指令,区别在于PHP生成的中间代码是可以由zend引擎执行的opcode,而java则是生成可以由JVM执行的字节码。PHP的opcode也可看作一种字节码的表示形式,与java的字节码类似,均为编译过程中产生的中间代码。
而RASP技术的关键就是在执行指令前对字节码(opcode)指令进行修改从而hook关键函数进行安全检测。
1.1.1 Java RASP
Java支持以JavaAgent的方式,在服务器启动时,动态修改Java字节码,对敏感操作的函数进行hook,比如:数据库操作、文件读取、写入操作、命令执行等等。其架构如下图所示:
启动时首先会进入 javaagent 的 premain 函数,该函数会在 main 函数之前预先执行。java提供一个名为Instrumentation的API接口,可用于类定义动态改变和操作。开发者可以在一个普通Java程序(带有 main 函数的 Java 类)运行时,通过 – javaagent参数指定一个特定的 jar 文件(包含 Instrumentation 代理)来启动 Instrumentation 的代理程序。
接着进行初始化配置,对load class 操作进行插桩,当有类被 ClassLoader 加载时候,会把该类的字节码先交给自定义的 Transformer 处理。
自定义 Transformer 会判断该类是否为需要 hook 的类,如果是会将该类交给ASM处理。ASM框架(一个比较方便的字节码操作框架,可用于实现动态修改字节码的操作)会逐步解析每个方法,对需要hook的方法进行字节码的修改通常会在方法的开头或者结尾插入进入检测函数的字节码。
最后,把hook好的字节码返回给Transformer从而载入JVM执行。
1.1.2 PHP RASP
同样,PHP也支持对PHP内核做类似的操作,PHP支持PHP扩展,可以利用Zend引擎API来hook opcode,监控敏感函数。
(1)预加载
PHP的任何扩展模块,都会依次执行模块初始化(MINIT)、请求初始化(RINIT)、请求结束(RSHUTDOWN)、模块结束(MSHUTDOWN)四个过程。RASP预加载主要在MINIT阶段实现。
(2)hook函数并检测
在PHP中,hook函数中比较好的方式有两种,分别是 Hook Opcode 和 Hook内部函数,PHP RASP可以使用这两种方式来hook传播污染的函数。
1)Hook Opcode
实现Hook Opcode 功能只需要改变 Hook Opcode 对应的处理函数即可, Zend引擎提供了一个现成的接口:zend_set_user_opcode_handler,在模块初始化(MINIT)调用该接口对opcode进行劫持从而改变代码的运行结构转而执行检测函数
2)Hook内部函数
通过修改zend_internal_function的handler来hook PHP中的内部函数,handler指向的函数用C或者C++编写,可以直接执行。通过修改zend_internal_function结构体中handler的指向,待完成检测函数的操作后再调用原来的处理函数即可完成hook。
这两种方式皆可实现Hook函数,hook opcode方法只需要对几种Opcode类型进行hook,后续Hook的敏感函数可以自行添加,因此实现简单;而hook 内部函数需要对敏感函数进行逐一替换,比较繁琐,但由于该方式修改的是全局函数表的handler,相对于hook opcode方法更底层,可检测到越过Opcode进行的函数执行,比起第一种方式更为可靠。
在完成对敏感函数调用行为的监控后,便可根据函数的参数制定相应的策略,对不同类型的关键函数进行安全检测,如文件类可以关注是否读取了敏感文件, 数据库操作类是否语法结构发生了变化等等。
由于RASP技术在opcode层面hook了敏感函数,因此可以对抗常见的一些加密、拼接、编码等混淆技术。以下是一个经过拼接以及base64双重编码的一句话木马:
使用vld扩展对该木马进行opcode提取,可以得到如下的opcode序列,可以看到opcode序列还原了eval函数所对应的字节码指令。
1.2 关键技术
1.2.1 动态污点跟踪
动态污点跟踪技术常被用于代码调试和分析中,其主要思想就是先认定一些数据源是可能有害的,被污染的,从而对恶意代码进行分析。动态污点跟踪的三个要素是污染源、污染传播策略和沉降点。
在RASP中,污染源可以看作是所有的HTTP输入,随着这些被污染变量的复制、拼接等一系列操作,其他变量也会被污染,即污染的传播。这些被污染的变量作为参数传入敏感函数以后,可能导致安全问题,这些敏感函数就是沉降点。而污染传播策略的制定影响对RASP的准确性有很大的影响。传播策略过于严格会导致漏报,传播策略过于宽松会增加系统开销。
RASP的污染传播策略是变量的复制、赋值和大部分的字符串处理等操作传播污染。动态污点跟踪的一个好处是如果一些敏感函数的参数没有被污染,那么我们就无需对它进行安全检查。污染的传播过程其实就是hook对应的函数。
1.2.2 基于词法分析的检测算法
RASP可以和传统WAF一样,使用规则匹配对输入进行检测,但是对于大多数的代码注入漏洞,RASP采用的是利用词法分析来检测漏洞。
代码注入漏洞,是指攻击者可以通过Web请求将payload注入某种代码中,导致其被后台当做代码执行而产生的漏洞。而这些代码一旦被攻击者注入,则会改变原有的代码逻辑,也必然会改变代码的抽象语法树结构,而抽象语法树是token根据一定语法结构组合而成的,因此,只需要对代码部分进行词法分析,判断HTTP请求中的输入是否在词法分析的结果中占据了多个token,就可以判断是否形成了代码注入。
以SQL语句为例,词法分析的主要作用是将SQL语句分割成数据和代码。经过词法分析,Web层就可以判断对SQL语句的字符串处理是否改变了SQL的逻辑。百度的开源软件OpenRASP使用的SQL注入检测算法,就是通过词法分析实现的。如当攻击者发起以下请求:
?id=1’UNION SELECT passwd FROM users
在后台执行该SQL查询语句,OpenRASP会检测到包含攻击者注入代码的完整SQL语句:
SELECT * FROM users WHERE id='1' UNION SELECT passwd FROM users
OpenRASP便可以关联数据库的查询语句和Web请求参数,实现零规则SQL注入检测。具体实现如下:
首先通过词法分析将SQL语句解析为token序列:
['SELECT','*','FROM','users','WHERE','id','=','1','UNION','SELECT','passwd','FROM','users']
然后解析SQL语句在去掉用户输入后的token序列:
[ 'SELECT','*', 'FROM', 'users', 'WHERE', 'id', '=' ]
当token个数相差超过2,即表明当前的查询语句逻辑发生了改变,也就意味着这里就存在SQL注入漏洞。
词法分析通常通过有限状态机(DFA)来完成,不同的代码注入使用的DFA是不一样的,命令注入的DFA是基于shell语法构建的,文件包含的DFA是基于文件路径的词法构建的。
2. RASP与WAF
2.1产品特性
RASP
WAF
部署
单独部署在应用服务器上,嵌入在应用程序内部,应用代码无感知(如java程序启动时加上–javaagent rasp.jar参数即可);开发语言强相关,但防护插件可共用
外部边界入口统一部署;支持透明(串联)、旁路、反向代理三种方式;需要进行大量测试和配置,才能充分涵盖应用程序
准确性
只在可能发生攻击的关键函数调用处检查是否有恶意内容输入。并且监视输入和输出数据以及整个数据逻辑流。
基于模式匹配等方式对所有输入内容均进行检测。
可靠性
不会在高负荷情况下进入“失效开放”状态——无论服务器负载如何,总会对代码进行检测。
可能成为单一故障点;可能会在高负荷情况下进入“失效开放”状态。
可视性
可以向开发人员提供详细的攻击路径和攻击信息。
没有提供有关应用程序的详尽信息。
网络协议
不受协议限制,可以轻松地处理各种协议,如HTTP、HTTPS、AJAX、SQL和SOAP
只能处理能解析的协议
语言涵盖情况
理论上不限制语言,但每种语言需要开发单独的探针
不限语言;不受程序设计语言类型的限制
2.2 RASP相比于WAF的优势和劣势
2.2.1 优势
(1)更少的误报
WAF基于请求特征监测攻击,通常无法得知攻击是否成功,对于扫描器的踩点行为、nday扫描,一般会产生大量报警。RASP运行在应用内部,失败的攻击不会触发检测逻辑,所以一旦报警都是成功的攻击。
(2)更少的漏报
以SQL注入为例,WAF等边界设备只能看到请求信息。RASP不但能够看到请求信息,还能看到完整的SQL语句,并进行关联。如果SQL注入让服务器产生了语法错误或其他异常,RASP引擎也能够识别和处理。
(3)可以对抗未知漏洞。
发生攻击时,WAF等边界防护设备无法掌握应用下一步的动向。RASP技术可以识别出异常的程序逻辑,比如反序列化漏洞导致的命令执行,因此可以对抗未知漏洞。
(4)更多的应用覆盖(HTTP/HTTPS/AJAX/SQL与SOAP,无视编码和加密)
2.2.2 劣势
(1)技术栈太多时使用不方便,存在技术难度
(2)对服务器性能有一定的影响且需要在每个服务器上部署
(3)RASP自身代码的漏洞无法检测
比如,OpenRASP在某版本中使用了受漏洞影响的FastJson库来处理相应的json数据,那么当攻击者在发送FastJson反序列化攻击payload的时候就会造成目标系统被RCE。所以在最新的OpenRASP中,统一使用了较为安全的Gson来处理json字符串。
3. RASP产品
3.1. 百度OpenRASP
https://rasp.baidu.com/doc/usage/web.html
3.1.1 主要功能
(1)OWASP TOP10攻击检测
(2)服务器安全基线检查,如后台弱口令、php的配置审计等
(3)应用加固
(4)统一管理后台
(5)SIEM/SOC集成
3.1.2 支持的服务器
目前支持 Java 和 PHP 两种开发语言,支持 Tomcat 6-11, JBoss 4-16, Jetty 7-9, SpringBoot 1-2, WebSphere 7-9, WebLogic 10-12, PHP 5-7 等服务器。另外,OpenRASP 提供的IAST解决方案,相比于与传统的DAST方案有着极大提升。漏洞检测无需动态爬虫或者旁路代理,扫描更全面;结合应用探针准确的识别漏洞类型,通过针对性扫描大幅度提升检测效率;商业版新增的动态污点追踪能力,还可以在不扫描的情况下,预判接口是否存在漏洞。
3.2. 国内其他RASP产品
3.2.1 灵蜥安全
http://www.lingxe.com/introduction.html
灵蜥安全是一款云安全应用防护系统,与应用程序的运行环境和开发语言无缝结合并高度融合。通过修复应用自身内部缺陷与漏洞,使应用具备攻击免疫能力,并以可视化的方式呈现攻击与防御情况。
灵蜥由系统云端与嵌入式安全脚本两部分构成,嵌入式安全脚本部署于受防护Web服务器,以加密通讯方式通过Internet网络与云端建立通信,组成以平台端为核心的星型网络拓扑结构;同时具备自我防护能力,免学习、低误判、高精度、抗干扰,可图形呈现、统一管理、可视化分析全局把控;保持网络原有架构,即插即用方便快捷,实时安全告警,威胁及时掌握,从而抵御未知威胁。
3.2.2 安数云RASP
http://www.datacloudsec.com/#/product-4
安数云RASP的主要功能如下:
(1)WEB攻击实时防御
有效防御SQL注入、XSS跨站脚本、木马上传、防扫描、防Structs2攻击、防命令注入、防任意文件删除、防任意文件读取、防任意文件上传、防CSRF攻击等, 实现了HTTP协议校验、XPATH注入防护、SSRF命令注入防护、反序列化攻击防护等、 敏感信息泄露、cookie安全防护、错误页面安全防护、请求方法限制防护等。
(2)智能精准实时防控
安数云RASP WAF采用B/S架构,提供了简单易用WebUI操作界面,用户登录之后能够对RASP WAF进行详细的配置管理,能够添加、编辑及删除被防护主机及对应的安全策略,能够管理系统统计日志及报表,能够实现对系统的远程管理及维护。
3.2.3 云鲨RASP(悬镜)
云鲨RASP可监控和阻止绝大多数类型对应用程序的攻击。除了全面覆盖OWASP TOP10及其它常见漏洞外,还可以抵御传统WAF无法识别的攻击,如针对未知漏洞和业务逻辑漏洞的利用攻击。
相比于传统WAF,云鲨RASP具有以下特点:无需频繁调整、无需规则匹配、无误拦误报、超低性能消耗、无需停机或源代码更改即可修复CVE、防御非HTTP攻击、防御未知缺陷、防止绕过。
3.3 国外RASP产品
3.3.1 Prevoty(Imperva)
https://www.imperva.com/products/runtime-application-self-protection-rasp/?redirect=Prevoty
(1)功能
该产品可以预防0day攻击,支持OWASP TOP10的攻击检测,主要有以下几种防御功能:
1)攻击:点击劫持、HTTP 响应拆分、HTTP 方法篡改、大量请求、格式错误的内容类型、路径遍历、未经验证的重定向、软件供应链攻击
2)注入:命令注入跨站脚本、跨站请求伪造、CSS & HTML 注入、数据库访问冲突、JSON & XML 注入、OGNL注入、SQL注入
3)脆弱性:不安全的 Cookie 和传输、记录敏感信息、未经授权的网络活动、未捕获的异常、易受攻击的依赖项、弱认证、弱浏览器缓存、弱密码
(2)支持的平台
3.3.2 Fortify Application Defender
Application Defender 可以防止生产应用程序中的攻击。支持区分 Java 和 .NET 应用程序中的危险攻击和合法请求;具有代码级的可见性,通过为开发人员提供代码行详细信息,提供了日志记录可见性。无需更改源代码,即可向任何 SIEM 或日志管理器发送日志,实现合规和更广泛的应用程序安全可视性;强大的分层防御,抵御各种应用安全攻击、利用尝试和其他安全违规行为,比如 SQL 注入、跨站脚本攻击和侵犯隐私。
3.4 RASP产品总结
现有的RASP产品大都支持OWASP TOP10攻击的检测与防御。但目前国内成熟的RASP产品相对较少,现有的RASP产品大部分仅支持Java 、PHP、python、Nodejs、Ruby等语言中的一种或几种,覆盖面还不够广,对于开发支持多种语言的RASP有一定的技术难度,仍需进一步完善。
4. OpenRASP demo演示
由于百度的OpenRASP是开源的,因此我们使用该产品来进行demo的演示,从而更加直观地感受到RASP产品是如何防护应用程序免受外部攻击的。
4.1 php服务器
在php服务器上搭建并部署OpenRASP,使用如下图所示的官方测试用例进行演示。测试用例包含常见的web应用攻击,包括列目录、任意文件读取、命令执行、ssrf、文件上传等。
以第一个测试用例为例,演示当部署了OpenRASP之后,攻击者的scandir手段是否会被检测并拦截
点击Linux不正常调用,发现被rasp拦截并返回了以下页面:
在rasp日志中可以看到本次拦截所记录的日志
4.2 tomcat服务器
在tomcat服务器上搭建并部署OpenRASP,使用官方测试用例和fastjson反序列化用例进行演示。测试用例包含常见的web应用攻击,包括目录遍历、命令执行、ssrf、fastjson反序列化等。
遍历目录攻击演示:
Fastjson反序列化攻击演示:
5. 总结
传统的网络安全架构重点在于网络边界防护,通过在边界上部署防火墙、WAF、IDS/IPS等安全产品进行重重防护,而内网安全却没有受到重视。RASP不仅服务于南北向流量风险,还可以防护东西向流量,它可以嵌入在应用程序内部,应用代码无感知,更了解应用程序上下文,方便定位漏洞信息,产生更少的误报和漏报,对各种绕过手法具有更强的防护能力;但RASP会对服务器的性能造成影响,推动部署落地相对困难,且对不同的技术栈需要开发相应的探针,具有较大的技术难度。不过随着DevSecOps框架的发展以及云、容器等基础设施和技术的不断成熟,未来可能有更优的RASP部署方案,为web应用提供更细致入微的安全检查与防护。