作者 | 坤硕&白玙
随着互联网成为日常生活的基础设施,企业的应用与服务遭受安全威胁和侵害的风险不断增加。这里面的风险不仅仅是网络层面的安全问题,更有应用本身的安全。在传统网络架构下,应用位于 IDC 内,有清晰的边界,应用威胁主要来自外部,边界内风险忽略不计,防护只需要关注边界入口处的南北向流量,传统上一般采用 WAF(即 web 应用防火墙)技术来拦截危险流量。
但随着微服务及容器化等技术发展,应用可以在 IDC/容器/公有云/私有云等多环境下部署,针对应用的威胁除了南北向还有来自东西向的横向威胁。网络环境日益复杂及漏洞攻击手段多样化,都造成产研团队牵扯更多精力修复问题,从而浪费公司大量研发成本。
现阶段典型的安全痛点如下:
- 审计不完的代码(数据统计显示平均 2 万行代码有 1 处漏洞,按照行业经验在交付的软件代码中 1000 行代码就有 1-25 处错误);
- 升级不完的三方组件,例如 fastjson,jackson,shiro,tomcat,struts2 等爆出多个 0day 漏洞需要紧急修复;
- 相同问题一犯再犯(例如注入,xss,csrf,broken auth 等依然在头部安全问题列表中反复出现);
- 总是被遗漏掉的应用(一些边缘历史应用长期无人治理以及存在大量未知应用悄悄上线,形同定时炸弹不可控);
- 网络架构约束下端到端加密、多重编码限制导致检测困难,以及被检测的流量需经过检测设备,否则可能会漏掉攻击);
- 远不止于 HTTP 协议攻击(大部分WAF 往往只能防御 HTTP 协议攻击,还存在 dubbo/thrift/rmi 等非 HTTP 协议以及各种私有协议也有被利用进行漏洞攻击);
- 代理攻击的无力(表现为一旦有一台内网机器被拿下,那么攻击者以这台主机为跳板,WAF 也无能为力);
- 漏洞扫描不友好(主要表现为黑盒的扫描器在进行漏洞扫描时候会对测试环境造成大量脏数据以及影响功能卡顿)。
如果我们的应用本身是否可以直接被加固,无需代码安全专家,无需额外代码修改,也无需复杂配置?对此,阿里云应用实时监控服务 ARMS 推出基于 RASP 的"应用安全"功能,让应用具备高水位的运行时安全防护,实现内生安全。
RASP 是什么?
2014 年,Gartner 将“Runtime Application Self-Protection”(简称 RASP)列为当年的应用安全关键趋势。作为在运行时检测应用程序攻击并进行自我保护的安全产品,RASP 将安全程序像疫苗一样注入到应用程序中,和应用程序融为一体,实时检测和阻断安全攻击,使应用程序具备自我保护能力。当应用程序遇到特定漏洞和攻击时,不需要人工干预就可以进行自动重新配置应对新的攻击。
以人体病毒防护举例,我们通过口罩来隔绝外部病毒进入人体,防火墙通过分析识别阻隔外部危险流量来保护系统。而 RASP 技术类似于人体疫苗抗体无需关心病毒进入的途径,部署在在服务端点上伴随应用启动,可以直接识别并拦截攻击。RASP 旨在缩小应用安全安全测试和网络边界控制所留下的空白地带,深入应用运行环境内部,实时了解数据和事件流,以监测或者阻止开发过程中无法预见的新威胁。
一般来说 WAF 在入口只能看到流量内容,即用户的原始请求,并不能感知应用最终会怎样执行这条请求。所以往往会产生一些误报漏报,例如用户在在线文档中上传一段 SQL 语句(误报)、利用PHP漏洞的报文打到了 JAVA 环境(虚报)、应用本身做过预编译,不存在 SQL 注入点(虚报)、ls 等短命令执行,极容易跟正常输入混淆(误报)。
而相比之下,RASP 只上报能利用成功的有效攻击。从原理上来说,RASP 关注运行时行为,不关心流量来源及形式,无需修改代码,以 Agent 方式随着应用启动,Hook 应用的底层关键函数以及参数内容,结合请求上下文,语义分析,基线等手段,判断当前的应用行为是否存在风险。从策略上来说,由于应用行为相对于千变万化的攻击特征来说是可穷举的,因此 RASP 针对 0day 以及各种变形攻击手法的防御效果要远好于 WAF 等以"特征"为检测对象的手段。另外,加密马等手段本质上也是对输入内容做变形以绕过基于特征的检测,RASP 同理也会无视,形成降维打击。
RASP 与 WAF 的差异
我们可以看到 RASP 与 WAF 一样都能检测流量和内容,也能够终止用户会话,但两者之间的差别在哪里呢?
接下来我们从场景,误漏报,维护性上等多个角度来对比 RASP 与 WAF 的差异特点。从上面的表格可以看到,例如 SQL 注入,XSS(跨站脚本),代码执行,webshell 等通用的 WEB 漏洞都具备一定的防御能力。由于 WAF 作为入口层比较擅长拒绝服务攻击,爬虫攻击,扫描器以及访问控制场景,而 RASP 与业务进程运行在一起,更擅长于 0day,复杂编码/加密流量,内存/加密码,非 HTTP 协议等场景,并具备以下特点:
- RASP 无视流量特征更关注应用行为,从误漏报上来说概率极低,只上报有效的攻击。
- RASP 部署在本地会消耗一部分服务器性能,而 WAF 仅消耗自身性能,对应用和源站无影响
- RASP 基本不依赖规则,无需联网,极少更新,反之 WAF 依赖规则需要联网更新或者进行云端运算
- 漏洞修复方面,RASP 通过虚拟补丁进行漏洞修复,同时能定位到漏洞利用的代码行,更胜一筹
总结来说,RASP 更接近云原生,可做为“分布式防火墙”,打破 WAF 边界防护局限性,符合零信任安全概念。而 WAF 基于边界安全,保护面广,RASP 针对 Nginx,Apache 等前置服务器的防护无法支持。
所以 RASP 跟 WAF 有各自擅长的场景,结合自身场景,通过互补形成多层纵深防御,才能达到最好的效果。
接下来,我们来了解下 ARMS 应用安全基于阿里云 RASP 能力提供了哪些安全防护手段以及通过一个反序列化漏洞来感受下功能。
ARMS 应用安全
随着业务容器技术、无服务器技术的发展,业务的研发周期和功能迭代频率越来越快,而安全能力的滞后性越来越明显。例如,存在漏洞的老旧中间件升级困难,引入三方组件评估不充分可能引入高危漏洞,代码存在安全漏洞需要快速溯源定位修复等。DevSecOps 作为 DevOps 的延伸,安全应该成为每个人的关注点,优秀的 DevSecOps 工具应该最大程度上实现安全的自动化能力,减小对业务侵入性。而 ARMS 应用安全关注应用发布上线以后阶段的安全,对 DevSecOps 友好,提供完整的运行时安全整体方案,提升业务 7x24 小时安全的同时不引入额外负担影响业务发展,一定程度上改变业务与安全的对立的局面。
ARMS 应用监控探针集成了阿里云安全 RASP 技术,通过深度埋点技术,为您的应用注入"安全疫苗",只需要一键开启接入应用安全,就能够轻松识别黑客的危险攻击行为进行拦截告警,而不影响正常的客户请求,就像隐形的安全卫士一样时刻守护着您的应用运行安全。接下来我们详细看下攻击防护统计以及危险组件检测功能。
1、攻击统计
在很多场景下,我们在流量层面收到安全告警后,但很难与实际漏洞代码位置产生关联,而 ARMS 安全在应用监控探针中集成了阿里云安全 RASP 技术,用户开启安全防护后,一旦发生安全攻击,就可以收到攻击告警。目前支持命令执行漏洞,文件访问漏洞,网络访问漏洞、内存马绕过、JN 注入、恶意反射调用等多达 15 种类型攻击场景检测。
ARMS 应用安全在攻击统计页面,提供了应用正常行为统计以及攻击行为统计数据,方便您了解近期是否存在攻击事件。如果被检测到攻击,在该页面还可以分页查看攻击发生时间、攻击类型、请求 URL、上下文数据以及本次攻击的处理结果(监控还是拦截取决于您的防护设置);点击详情可以查看攻击来源 IP、请求详细参数、机器等信息,通过分析代码堆栈进一步定位到代码漏洞位置进行修复。
2、危险组件检测
在 JAVA 应用中,往往会依赖大量的三方开源组件以及各种中间件框架,往往这些组件存在未知漏洞难以发现和盘点,应用不清楚自身是否存在高危漏洞暴雷的可能。ARMS 应用安全提供的危险组件检测功能则可以帮助解除这方面的担忧,应用一旦集成探针并接入应用安全后,ARMS 会检测应用的三方组件依赖,自动分析关联权威的 CVE 漏洞库,并区分不同的漏洞危险等级。客户可以根据详情中的漏洞修复建议,优先升级组件解决高危漏洞。
针对尚未纳入 CVE 的漏洞,当新的漏洞报出来时,客户还可以第一时间通过"全量组件自查"功能,利用关键词搜索快速检查自身依赖的组件版本是否涉及到该安全漏洞,做到心中有数,确定是否需要处理。
漏洞防护示例
接下来,我们通过 fastjson 反序列化漏洞的攻击场景来演示 ARMS 应用安全的实际防护效果,fastjson 的反序列化过程主要如下:
User类:
package com.test;public class User { private String name; public void setName(String Name) { this.name = Name; } public String getName() { return name; }}
恶意类:
package com.test;import java.io.IOException;public class Evil { //恶意Setter public void setCommand(String command) throws IOException { Runtime.getRuntime().exec(command); }}
反序列化内容:
{ "rand": { "@type": "com.test.Evil", "command": "open /System/Applications/Calculator.app/" } }
反序列化漏洞代码:
public static void main(String[] args) { //指定User为所需要的类型,但成功反序列化了Evil类型,并执行了命令 User user = JSON.parseObject("{\"rand\":{\"@type\":\"com.test.Evil\",\"command\":\"open /System/Applications/Calculator.app/\"}}", User.class); }
当执行上述代码时,在反序列时设置 User 属性时会触发命令执行,本文会打开某个内部应用程序,在真实攻击场景下可能会获取系统配置以及访问敏感信息等造成的危害更大。
在开启了 ARMS 应用安全时,当发生上述反序列漏洞时,ARMS 应用安全会识别到序列化漏洞产生的命令执行行为,可以直接阻断该反序列化动作并发送告警通知,在攻击详情可以进一步分析攻击源以及漏洞代码位置。
fastjson 反序列化的利用核心,还是在于寻找可以造成代码执行的类,实际上在 java 庞大的 jdk 类库以及第三方类库中存在着大量的可利用类,传统流量产品如 WAF,往往需要在防御时去穷举这些可能被利用的类(经常会出现遗漏),而 ARMS 应用安全基于 RASP 的上下文分析能力与基于行为的攻击发现方式,将会捕获掉所有由 fastjson 造成的代码执行、恶意文件上传、敏感文件读写等行为,而无需去针对特定代码实现做精准匹配,所以完全不会存在被绕过的可能性。
结合以上案例,我们可以看到 ARMS 应用安全的整体产品优势,ARMS应用安全全面支持 0day 防御,攻击告警以及溯源,支持危险组件检测,并提供漏洞修复建议。一键开启接入,无需修改代码,支持软熔断逃生避免影响应用以及观察模式体验实际效果。通过压测来看,开启应用安全防护模式后 CPU 平均开销增加低于 1%,内存占用低于 30M,平均 RT 耗时毫秒级,对系统性能影响极低。通过防护设置您可以选择观察/拦截模式、自定义勾选攻击检测类型、自定义检测超时时间,进一步降低性能影响。
通过集成 ARMS 应用安全运行时自我防护能力,为您的应用注入"疫苗",实现应用默认安全,抵御日常 OWASP 攻击,默认防御 fastjson 等新漏洞(0day)以及内存马,加密马等。还可以自动发现三方组件高危漏洞,溯源攻击行为精准定位修复问题。一键开关,稳定低消耗运行,运维无负担,为您的业务安全保驾护航!
目前 ARMS 应用安全正在公测中,欢迎钉钉扫码加入钉群(34833427)或关注 Apache RocketMQ 官方公众号,了解更多产品详情。