什么是应用防护

应用防护功能基于RASP(Runtime Application Self-Protection)技术,通过在应用运行时检测攻击并进行应用保护,为应用提供安全防御。您无需修改代码,只需在主机或容器环境的应用中部署RASP探针,即可为应用提供强大的安全防护能力,并抵御绝大部分未知漏洞所使用的攻击手法。

功能原理

应用防护使用RASP技术,在应用程序内部通过钩子(Hook)关键函数,实时监测应用在运行时与其他系统的交互过程。当应用出现可疑行为时,应用防护会根据当前上下文环境识别并阻断攻击,有效地为您主机上的Web业务进程提供应用漏洞、0day漏洞和内存马攻击等防护能力。image.png

应用场景和优势

  • 保障应用内部安全:不关注流量来源,只关注应用行为,可防御南北向+东西向的威胁;伴随应用启动而运行,作为应用资产最后一道防线实现应用默认安全。

  • 轻松应对花式编码和多种加密流量:RASP能够看到应用的上下文,不管请求怎么变形,最终应用执行的动作保持不变,只要身份和行为不匹配,就可以检测到异常;相对于网络边界设备无法审计加密流量的问题,RASP可以从应用程序内部获取完整解密后的请求数据。

  • 低误报漏报可防御0day漏洞:RASP是从应用内部对关键函数操作的数据进行分析,可忽略无法真实执行的攻击,减少大量的误报和漏报;针对0day漏洞,无论攻击入口如何变化、攻击手段如何隐蔽,都无法绕开最终关键函数的执行过程,因此RASP可以有效拦截。

  • 攻击溯源漏洞定位修复:RASP还能为安全人员和开发人员提供详尽的攻击链路,包括攻击原始Payload、代码调用堆栈等信息,方便他们进行漏洞定位、复现以及修复。

  • 运维成本低:部署简单,只需在控制台接入,无需维护和更新具体规则。

使用限制

仅支持防护Java应用。支持在安装了云安全中心客户端的阿里云服务器、第三方厂商云服务器和线下IDC服务器中使用。支持的操作系统如下:

作系统类型

支持的操作系统

Windows(64位)

  • Windows Server 2022

  • Windows Server 2019

  • Windows Server 2016

  • Windows Server 2012

  • Windows Server 2008

  • Windows 11

  • Windows 10

Linux(64位)

  • Alibaba Cloud Linux

  • AlmaLinux

  • Anolis OS

  • CentOS 6、7、8

  • CentOS Stream

  • Debian 8及以上版本

  • Gentoo

  • OpenSUSE

  • Red Hat 6及以上版本

  • RHEL 6、7、8

  • Rocky Linux

  • SUSE

  • Ubuntu 14.04及以上版本

支持的能力

攻击检测

下表介绍应用防护可检测并拦截的攻击类型及相关防护建议。

攻击类型

说明

防护建议

JNI注入

JNI注入是一种通用的RASP(Runtime Application Self-Protection)绕过手段。当攻击者拿到代码执行权限后,可以通过Java Native函数去调用外部的恶意动态链接库,从而绕过Java层的安全防护,并隐匿具体的恶意行为。

您的服务器可能存在代码执行漏洞,请检查漏洞的位置并限制执行代码的功能。

SQL注入

SQL注入手段通过把SQL命令插入到页面请求或Web表单的查询字符串中,以达到欺骗服务器执行指定SQL语句的目的。它可以通过在Web表单中输入SQL语句,得到存在安全漏洞的网站上的数据。

SQL注入是由拼接SQL语句引起的。请尽可能使用预编译来处理传入的参数,或通过白名单和黑名单来限制参数的拼接。

XXE

指XML外部实体注入漏洞(XML External Entity Injection)。当XML文件在引用外部实体时,通过构造恶意内容,可以导致任意文件读取,命令执行和内网攻击等不良后果。

请检查应用程序在解析XML时是否需要加载外部实体。如果不需要,请在XML解析配置中禁用外部实体。

恶意DNS查询

恶意DNS查询存在多种利用方式。攻击者极有可能通过DNS协议来突破内网的网络限制,从而将敏感信息带出内网,也可能通过DNS协议去探测内网系统是否存在SSRF、JNDI注入等漏洞。

恶意DNS查询是由服务器向用户控制的参数发送请求所引起的。请检查参数并通过白名单进行限制。

恶意反射调用

RASP自保护模块,禁止攻击者通过反射的方式去修改运行时RASP的相关数据。

您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。

恶意外链

SSRF(Server-side request forgery)服务器端请求伪造漏洞指的是攻击者通过构造由服务端发起的请求,对网站内部系统进行攻击。

SSRF是由服务器向用户传入的参数发送请求所引起的。请检查参数并通过白名单进行限制。

恶意文件读写

Java提供RandomAccessFile,用于文件读写操作。当使用该Class进行文件读写的时候,如果未对文件路径、文件内容进行限制,攻击者可能读取到系统敏感文件,也可能上传木马文件。

请检查文件读取和上传是否正常。如果出现异常,请检查函数代码,并通过黑名单进行限制。

恶意文件上传

对于网站提供的文件上传功能,如果未对上传文件的类型进行限制,攻击者可能通过上传木马文件来获取服务器的更大权限,从而造成严重危害。

请限制上传文件的类型,禁止上传具有执行权限的文件,如JSP。

命令执行

命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令。

通常远程命令执行是由Web Shell或服务器的危险代码引起的。请检查命令执行的位置。如果是Web Shell,请及时删除。如果是服务器的正常功能,则可以通过白名单限制执行的命令。

目录遍历

网站自身的配置缺陷可能会使得网站目录被任意浏览,导致隐私信息泄露。攻击者可以利用该信息对网站进行攻击。

请检查目录遍历操作是否正常。如果异常,请检查函数的代码,并通过黑名单对相关命令(如“./”和“../”)进行限制。

内存马注入

内存马是一种新兴的木马技术,攻击者通过一些特殊的技术手段将木马注入到内存中,可以有效绕过WAF和主机防御的检测。

您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。

任意文件读取

对于网站提供的文件下载和读取功能,如果是直接通过绝对路径或目录穿越符对文件进行读取和下载,没有相关文件路径的限制,那么攻击者就可以利用这种方式获取敏感信息,并对服务器进行攻击。

请检查文件读取操作是否正常。如果异常,请检查函数的代码,并使用黑名单对传入参数(如“./”和“../”)进行限制。

线程注入

线程注入是一种通用的RASP绕过手段。当攻击者拿到代码执行权限后,可以通过新建线程的方式使RASP丢失掉运行环境的上下文,从而影响RASP的防御能力。

您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。

恶意Attach

Attach API是Java提供的动态修改字节码技术,该功能可以实现动态修改运行时应用的字节码。很多攻击者通过该手法进行Agent型内存马的注入,具有较高的欺骗性。

您的服务器可能存在代码执行漏洞。请检查漏洞的位置并限制执行代码的功能。

JNDI注入

当应用进行JNDI查询的时候,若查询的URL可以由攻击者控制,则攻击者可以使用服务器去查询恶意的链接使得服务器加载一些恶意class类,实现任意代码执行。

  • 若该漏洞源于第三方组件,请及时进行组件版本升级。

  • 若为自写JNDI查询代码,请对查询的URL进行限制,禁止一些危险协议的查询。

危险协议使用

若服务端进行访问的URL用户端可控,而应用本身又未对该URL的协议进行限制,那么攻击者可能通过file、netdoc等危险协议对服务器上的敏感文件进行读取。

请对URL可以访问的协议进行限制。

反序列化攻击

Java反序列是指把字符序列恢复为Java对象的过程,在对象生成过程中,若该对象包含一些危险度较高的代码,则攻击者可能通过控制生成对象的成员变量在对象进行反序列化的时候实现一些恶意攻击。

  • 及时升级存在漏洞的组件版本。

  • 若官方还未提供漏洞修复的组件版本,请暂时关闭该功能。

任意文件删除

对于网站提供的文件删除功能,文件删除的接口如果没有对文件路径进行限制,攻击者就可以通过绝对路径或目录穿越符对任意文件进行删除操作,从而对服务器进行攻击。

请检查文件删除操作是否正常。如果异常,请检查函数的代码,并使用黑名单对传入参数(如“./”和“../”)进行限制。

表达式注入

表达式组件提供了十分丰富的功能,支持在运行时查询和处理数据等,但很多表达式组件也提供了函数调用等权限较高的功能,如果未对这些功能做限制,而攻击者又能够控制表达式执行的内容,那么攻击者将很有可能通过表达式执行任意代码。

请对进入表达式的内容进行严格限制,禁止大部分Java函数的调用。若是第三方组件漏洞导致,请及时升级组件版本。

引擎注入

Java提供了较多的第三方引擎组件(如Rhino、Nashorn等JS引擎,Velocity、FreeMarker等模板引擎),这些引擎通常提供了函数调用等权限较高的功能,如果对这些功能未作限制,而攻击者又能够控制引擎执行的内容,那么攻击者将很有可能通过引擎执行任意代码。

请对进入引擎文件的内容进行严格限制,禁止大部分Java函数的调用。若是第三方组件漏洞导致,请及时升级组件版本。

恶意Beans绑定

Java存在一些框架支持对应用运行时Beans的参数绑定,如果未对绑定Beans的类型进行限制,攻击者就可以通过对一些敏感Beans值的修改,破坏应用的运行,甚至造成执行任意代码。

请对可以绑定的Beans的类型进行限制,禁止对类似于Class、Classloader类型的Beans值进行修改。若是第三方组件漏洞导致,请及时升级组件版本。

恶意类加载

现阶段,很多0day、WebShell的利用均依赖于恶意类的加载,一旦恶意类加载成功,攻击者便可以通过恶意类的初始化来取得代码执行权限,从而进行一系列的恶意操作。

  • 若恶意类的加载是通过WebShell控制,请及时删除WebShell。

  • 如果恶意类的加载是框架导致,请及时升级框架版本。

JSTL任意文件包含

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。当用户可控参数被直接拼接到JSTL标签中而未对该参数进行任何限制的情况下,攻击者可以构造特殊的攻击脚本造成任意文件读取、SSRF攻击。

尽可能不要将用户可控参数直接拼接到JSTL标签上,如果必须这样做,请对该参数的内容进行严格的白名单控制。

应用漏洞防御

应用防护功能可以有效防御应用漏洞、0day漏洞和内存马等攻击行为。在应用漏洞应急响应过程中,借助RASP的攻击防护能力,可以快速阻断攻击,为修复应用漏洞争取更多时间。应用防护功能还可以协助快速定位风险来源与影响范围。关于应用漏洞的更多信息,请参见查看和处理漏洞

如果您暂时无法修复应用漏洞,可先将应用进程接入RASP进行防护。您可以参考下述操作步骤为检测出应用漏洞的应用添加RASP防护。

  1. 登录云安全中心控制台。在控制台左上角,选择需防护资产所在的区域:中国全球(不含中国)

  2. 在左侧导航栏,选择风险治理 > 漏洞管理

  3. 应用漏洞页签,存在RASP支持实时防护标签的漏洞为应用防护支持防护的漏洞,单击对应漏洞操作列的立即防护

    image.png

  4. 应用防护接入面板,应用分组的下拉列表中选择需接入的应用分组,并选择需要接入的资产,然后单击确定

    如果不存在所需的应用分组,您可以在下拉列表中单击新建应用分组,输入应用分组名称,并单击确定,实现快速创建应用分组。此处创建的应用分组的防护模式防护防护策略组日常运行组

    image.png

    检测出漏洞的应用接入应用防护后,只有在应用漏洞完成了一次漏洞扫描时,在漏洞详情页的待处理漏洞列表中该服务器的状态才会显示为已防护

    image.png

应用行为分析

应用分析功能通过对接入的应用程序进行实时监测、收集和分析应用程序的行为数据,并生成报告和可视化展示,可以帮助您了解应用的攻防详情,进行系统安全加固。更多信息,请参见应用行为分析

内存马防御

应用防护的RASP技术通过分析内存数据可以实时检测内存马,并支持对内存马注入和内存马执行过程进行拦截。更多信息,请参见内存马防御

弱点检测

下表介绍应用防护可检测的应用弱点类型及相关修复建议。

弱点类型

风险等级

说明

修复建议

不安全的Fastjson配置

高危

应用的Fastjson开启了反序列化功能,该功能可能被攻击者利用,造成远程命令执行。如非必要,请关闭该功能。

请将Fastjson的safemode设置为true,或将autotype设置为false。

不安全的log4j配置

高危

您的log4j组件开启了lookup功能,攻击者可能通过该功能进行JNDI注入,从而造成远程代码执行漏洞。

请升级log4j到最新版本,或删除Jar包中的org/apache/logging/log4j/core/lookup/JndiLookup.class文件。更多信息,请参见Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)

不安全的启动参数

高危

当攻击者可以访问到JDWP调试端口的时候,可以通过该功能执行任意代码,造成远程代码执行。

如无特殊场景,请及时关闭JDWP端口或者避免将JDWP端口暴露在公网,谨防长期运行的应用开启了JDWP端口。

Shiro弱密钥

高危

Shiro应用使用了较弱的加密密钥,攻击者可能通过破解密钥,进一步进行反序列化攻击,从而造成远程代码执行。

请及时修改应用中的Shiro加密密钥。

不安全的JMX配置

中危

开启了JMX的远程链接,且在认证方面存在风险,攻击者可能会远程连接应用的JMX服务并造成命令执行风险。

请关闭JMX服务的远程连接,或者请使用较为安全的认证口令。

不安全的Rhino配置

中危

Rhino框架中包含了危险的properties,攻击者可能通过这些properties进行远程代码执行攻击。

先升级rhnio到最新版本,然后使用SafeStandardObjects定义rhino的上下文,防止JavaScript引擎调用Java代码。

下面是使用SafeStandardObjects定义Rhino上下文的示例:

 Context ctx = Context.enter();
// Scriptable scope = ctx.initStandardObjects(); // 不安全的写法
 Scriptable scope = ctx.initSafeStandardObjects(); // 安全写法
 ctx.setOptimizationLevel(-1);
 String str = "var test={};";
 str += "test.call=function(){return 'Successful!';};";
 str += "java.lang.System.out.println(test.call())";
 try {
 //传入并执行javascript代码
 ctx.evaluateString(scope, str, "", 1, null);
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 Context.exit();
 }

不安全的Spring配置

中危

Spring Actuator模块开启了部分端点:heapDump、env、restart、refresh、trace、jolokia、h2-console等,可能造成敏感信息泄露或者远程代码执行漏洞。

如无特殊场景,请关闭对应功能。

脆弱的登录凭证

中危

应用在登录口令安全性较弱,攻击者可能通过爆破弱口令登录您的系统,从而获取敏感信息甚至服务器权限。

请及时修改该应用的密码为复杂密码。

不安全的JNDI配置

低危

您的应用存在不安全的useCodebaseOnly/rmi-trustURLCodebase/ldap-trustURLCodebase参数设置,可能存在JNDI注入风险。

请将JDK升级到最新版本,如果无法升级,在应用启动时候添加启动参数:

-Djava.rmi.server.useCodebaseOnly=true -Dcom.sun.jndi.rmi.object.trustURLCodebase=false -Dcom.sun.jndi.ldap.object.trustURLCodebase=false

不安全的XML实体配置

低危

XML解析外部实体功能已开启,这可能导致您的应用遭受XXE攻击。

如果无特殊场景,请勿使用外部实体。

数据库弱口令

低危

应用连接数据库时使用弱口令,攻击者可能通过该弱口令连接您的数据库造成敏感信息泄露或远程命令执行。

请及时更改应用连接数据库的密码为复杂密码。

相关文档