首页> 中国专利> 反序列化0day安全风险防御方法、装置与设备

反序列化0day安全风险防御方法、装置与设备

摘要

本申请提供一种反序列化0day安全风险防御方法、装置与设备,该方法包括:在基于java实现的业务系统的运行过程中,利用java探针对所述业务系统运行状态进行监控;依据所述java探针监控到的信息,以及,所述指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定;其中,所述指定反序列化攻击方式对应的判定规则依据所述指定反序列化攻击方式下的攻击特性设置;在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理。该方法可以包括有效实现反序列化零日0day安全风险防御。

著录项

  • 公开/公告号CN116628694A

    专利类型发明专利

  • 公开/公告日2023-08-22

    原文格式PDF

  • 申请/专利号CN202310918994.4

  • 发明设计人 陈群华;王滨;万里;

    申请日2023-07-25

  • 分类号G06F21/56(2013.01);G06F21/55(2013.01);H04L9/40(2022.01);G06F8/53(2018.01);G06F11/30(2006.01);

  • 代理机构北京博思佳知识产权代理有限公司 11415;

  • 代理人杨春香

  • 地址 310051 浙江省杭州市滨江区阡陌路555号

  • 入库时间 2024-01-17 01:23:59

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-09-08

    实质审查的生效 IPC(主分类):G06F21/56 专利申请号:2023109189944 申请日:20230725

    实质审查的生效

  • 2023-08-22

    公开

    发明专利申请公布

说明书

技术领域

本申请涉及软件技术领域,尤其涉及一种反序列化0day安全风险防御方法、装置与设备。

背景技术

当前java(一种面向对象编程语言)项目应用广泛,并且也会复用越来越多的开源软件,然而在享受使用这种软件带来的便捷的同时,也会引入很多安全风险,其中通过反序列化带来的任意命令执行可谓是最致命的安全风险,当前大部分情况都是通过软件提供商设置的被限制对象名单或被信任对象名单进行防御,但是事实上这样的方式并没有阻止类似的0day(零日)安全风险再次出现。

因而,如何有效防御0day安全风险成为一个亟待解决的技术问题。

发明内容

有鉴于此,本申请提供一种反序列化0day安全风险防御方法、装置与设备。

具体地,本申请是通过如下技术方案实现的:

根据本申请实施例的第一方面,提供一种反序列化0day安全风险防御方法,包括:

在基于java实现的业务系统的运行过程中,利用java探针对所述业务系统运行状态进行监控;其中,所述java探针针对java函数库中与指定反序列化攻击方式关联的java函数设置;

依据所述java探针监控到的信息,以及,所述指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定;其中,所述指定反序列化攻击方式对应的判定规则依据所述指定反序列化攻击方式下的攻击特性设置;

在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理。

根据本申请实施例的第二方面,提供一种反序列化零日0day安全风险防御装置,包括:

监控单元,用于在基于java实现的业务系统的运行过程中,利用java探针对所述业务系统运行状态进行监控;其中,所述java探针针对java函数库中与指定反序列化攻击方式关联的java函数设置;

判定单元,用于依据所述java探针监控到的信息,以及,所述指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定;其中,所述指定反序列化攻击方式对应的判定规则依据所述指定反序列化攻击方式下的攻击特性设置;

防御单元,用于在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理。

根据本申请实施例的第三方面,提供一种电子设备,包括处理器和存储器,其中,

存储器,用于存放计算机程序;

处理器,用于执行存储器上所存放的程序时,实现第一方面提供的方法。

本申请实施例的反序列化0day安全风险防御方法,通过在java函数库中针对于指定反序列化攻击方式关联的java函数设置java探针,并依据指定反序列化攻击方式下的攻击特性设置指定反序列化攻击方式对应的判定规则,在基于java实现的业务系统的运行过程中,利用java探针对业务系统运行状态进行监控,并依据java探针监控到的信息,以及,指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定,进而,在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理,实现了底层的反序列化攻击自动识别(针对java函数库中的java函数进行监控),不需要关注上层具体是那种类型的组件,此外,从被攻击前期就分析出可能出现攻击行为,而不是等到真的被攻击了再去分析,有效实现了反序列化零日0day安全风险防御。

附图说明

图1为本申请一示例性实施例示出的一种反序列化零日0day安全风险防御方法的流程示意图;

图2为本申请一示例性实施例示出的一种invoke场景下的反序列化攻击检测方式;

图3为本申请一示例性实施例示出的一种readObject场景下的反序列化攻击检测方式;

图4为本申请一示例性实施例示出的一种forName场景下的反序列化攻击检测方式;

图5为本申请一示例性实施例示出的一种URLClassLoader场景下的反序列化攻击检测方式;

图6为本申请一示例性实施例示出的一种反序列化零日0day安全风险防御装置的结构示意图;

图7为本申请一示例性实施例示出的一种电子设备的硬件结构示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。

在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。

为了使本领域技术人员更好地理解本申请实施例提供的技术方案,下面先对本申请实施例中的涉及的部分技术术语进行解释说明。

1、java序列化:将java对象的属性或者方法转换为字节序列的过程,广义的字节序列还包括json(JavaScript Object Notation,JavaScript对象表示法)、xml(eXtensible Markup Language,可扩展标记语言)等,一般情况下会把序列化后的数据存放在文件或者数据库中。

2、java反序列化(简称反序列化):将java字节序列恢复为java对象的过程,由于恢复成java对象后可能会被其他逻辑调用,从而触发此java对象中的函数执行,因此如果这个java字节序列来自外部,则可能会被恶意用户利用对系统进行攻击。

3、java探针:java探针是指利用hook(钩子)技术,在class(类)字节码信息通过classLoader(类加载器)加载到JVM(java虚拟机)时动态修改对应的函数或者属性,一般情况下会在函数的第一行增加函数调用用来监控输入参数(简称入参),或者在函数的最后一行增加函数调用用来监控返回信息。

4、0day安全风险:是指被发现后立即被恶意利用的安全风险。通俗地讲,即安全补丁与瑕疵曝光的同一日内,相关的恶意程序就出现。这种攻击往往具有很大的突发性与破坏性。

5、Java包装流:在原始字节流或字符流的基础性,为了提高读写效率进行再次处理的流,称为包装流/处理流,而流解包装是值利用反射机制逆向得到原始流对象的过程。

为了使本申请实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本申请实施例中技术方案作进一步详细的说明。

需要说明的是,本申请实施例中各步骤的序号大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。

请参见图1,为本申请实施例提供的一种反序列化零日0day安全风险防御方法的流程示意图,如图1所示,该反序列化零日0day安全风险防御方法可以包括以下步骤:

步骤S100、在基于java实现的业务系统的运行过程中,利用java探针对业务系统运行状态进行监控;其中,java探针针对java函数库中与指定反序列化攻击方式关联的java函数设置。

本申请实施例中,为了在底层实现反序列化0day安全风险防御,可以依据指定反序列化攻击方式,在java函数库中针对于指定反序列化攻击方式关联的java函数设置java探针,以便从底层对反序列化0day安全风险进行检测。

在基于java实现的业务系统(下文中简称为业务系统)的运行过程中,可以利用所设置的java探针对业务系统运行状态进行监控。

示例性的,指定反序列化攻击方式可以包括但不限于invoke方式、readObject方式、forName方式,以及,URLClassLoader方式等方式中的一个或多个。

在一个示例中,指定反序列化攻击方式可以包括invoke方式、readObject方式、forName方式,以及,URLClassLoader方式等方式中的至少两种,从而,可以多个不同场景检测反序列化0day安全风险,更好地提升业务系统运行的安全性。

例如,指定反序列化攻击方式可以包括invoke方式、readObject方式、forName方式,以及,URLClassLoader方式,即从4个不同场景检测反序列化0day安全风险。

步骤S110、依据java探针监控到的信息,以及,指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定;其中,指定反序列化攻击方式对应的判定规则依据指定反序列化攻击方式下的攻击特性设置。

本申请实施例中,为了实现反序列化攻击的自动识别,可以依据指定反序列化攻击方式下的攻击特性,设置指定反序列化攻击方式对应的判定规则,以便依据所设置的判定规则进行反序列化攻击判定。

相应地,在基于java实现的业务系统的运行过程中,可以依据java探针监控到的信息,以及,指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定,确定是否存在指定反序列化攻击行为(即指定反序列化攻击方式的反序列化攻击行为)。

步骤S120、在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理。

本申请实施例中,在按照上述方式确定存在反序列化攻击的情况下,即存在指定反序列化攻击行为,可以进行反序列化攻击防御处理。

示例性的,进行反序列化攻击防御可以包括但不限于进行告警和/或对指定反序列化攻击行为进行拦截等。

可见,在图1所示方法流程中,通过在java函数库中针对于指定反序列化攻击方式关联的java函数设置java探针,并依据指定反序列化攻击方式下的攻击特性设置指定反序列化攻击方式对应的判定规则,在基于java实现的业务系统的运行过程中,利用java探针对业务系统运行状态进行监控,并依据java探针监控到的信息,以及,指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定,进而,在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理,实现了底层的反序列化攻击自动识别(针对java函数库中的java函数进行监控),不需要关注上层具体是那种类型的组件,此外,从被攻击前期就分析出可能出现攻击行为,而不是等到真的被攻击了再去分析,有效实现了反序列化零日0day安全风险防御。

在一些实施例中,与invoke方式关联的函数包括invoke函数,针对invoke函数设置的java探针用于监控invoke函数运行时的调用者caller和方法method的实际名称。

示例性的,invoke是反射类java.lang.reflect.Method的函数,其参数有两个,一个是实际的对象caller(调用者),第二个是实际的参数列表。因此,这类场景的java探针需要放在invoke函数中,用以监控caller以及具体method(方法)的名称。

其中,invoke函数就是调用类中的方法,第一个参数是obj(对象),在实际应用过程中用到的是类,类是对象的一个集合,第二个参数是args(参数),是调用invoke这个方法所使用的参数,使用的一般是类中的方法(method),因此invoke函数可以理解为:invoke(class,method),相当于把类中的方法参数化。

其中,反射类java.lang.reflect.Method是 Java 编程语言中的一个类,它用于描述类或接口中的方法。通过Method对象,可以获取和操作一个类或接口中定义的方法的信息。

在Java中,使用反射机制可以在运行时动态地获取类或接口的信息,并在不知道类名的情况下调用它们的方法。Method类就是在这个过程中扮演着重要角色的类之一,主要提供以下功能:

1)、获取方法的名称、返回值类型、参数类型等信息;

2)、反射调用方法,并传递方法参数;

3)、获取方法的修饰符等。

在一些实施例中,与readObject方式关联的函数包括readObject函数和getInputStream函数,针对readObject函数设置的java探针用于监控readObject函数运行时的实际流类型,针对getInputStream函数设置的java探针用于监控返回的流对象。

示例性的,readObject是java.io.ObjectInputStream的函数,主要是将入参流对象进行反序列化,这类场景需要在readObject函数中进行hook(即设置java探针),用以监控运行时的实际流类型,此外,还需要在javax.servlet. ServletRequestWrapper的getInputStream函数中进行hook,用以记录返回的流对象。

其中,java.io.ObjectInputStream.readObject()方法从ObjectInputStream中读取一个对象。读取对象的类,类的签名,以及类的非瞬态和非静态字段及其所有超类型的值。可以使用writeObject和readObject方法覆盖类的默认反序列化。这个对象引用的对象是可传递的,因此readObject可以重建完整的等效对象图。

ObjectInputStream是Java中InputStream类的一个子类,用于将字节流反序列化为对象。在需要从字节流中读取已经序列化的对象的情况下,可以使用ObjectInputStream对象来完成该操作。

InputStream是Java中所有输入流的抽象父类,其定义了一些基本的方法,如read()、skip()、available()等,用于从输入流中读取数据。

getInputStream()是Java中URLConnection类的一个方法,用于获取与此URL连接打开的资源的输入流。该方法返回的是一个InputStream对象,可以用来读取与此URL相关联的资源。

URLConnection是Java中用于表示URL打开的连接对象,可以用于获取URL的输入流、输出流等资源,并可以配置一些连接参数。

在一些实施例中,与forName方式关联的函数包括forName函数,针对forName函数设置的java探针用于监控forName运行时输入参数的类名。

示例性的,forName方式是java.lang.Class的函数,目的是通过一个类名获得对应的类对象(类本身也是一种对象),这类场景是对forName函数进行hook,以确定入参的类名。

其中,java.lang.Class是Java语言中的一个重要类,用于表示类或接口的实例,可以用于获取类信息、类的属性、方法等相关信息。每个类都有一个对应的Class实例,可以通过该实例获取到类的所有信息,并进行反射操作。

在一些实施例中,与URLClassLoader方式关联的函数包括URLClassLoader函数,针对URLClassLoader函数设置的java探针用于监控所述URLClassLoader函数运行时的输入参数。

示例性的,java.net.URLClassLoader主要是通过一个url(Universal ResourceLocator,统一资源定位符)参数去加载远程对象,这个url可以是本地的,也可以是外部网络的,这类场景下的反序列化攻击本质上是通过URLClassLoader去加载外部的资源。因此,这类场景需要对URLClassLoader函数进行hook,以监控URLClassLoader函数运行时的入参。

其中,URLClassLoader是Java中的一个类加载器,可以用于从指定的URL加载类或资源。在需要动态地加载指定目录下的类的情况下,可以使用URLClassLoader来实现。该类加载器通常用于从Jar包和网络上下载的类文件等外部资源加载类。

在一些实施例中,指定反序列化攻击方式包括invoke方式;

invoke方式对应的判定规则包括:在invoke函数运行时的caller是java.lang.ProcessBuilder,且method的实际名称是start;或,invoke函数运行时的caller是java.lang.Runtime,且method的实际名称是exec的情况下,确定存在反序列化攻击。

示例性的,由于start和exec是一个执行系统命令的函数,在这类函数的发起一般不会通过反射的方式,因此,在invoke函数的caller是java.lang.ProcessBuilder,且method的实际名称是start,或者,invoke函数的caller是java.lang.Runtime,且method的实际名称是exec的情况下,可以确定存在反序列化攻击。

其中,ProcessBuilder是Java中一个用于创建进程的类。它提供了一种创建和操作进程以及与进程进行交互的方式,可以用于执行本地或远程命令、执行Shell脚本等任务。

Runtime是Java标准库中的一个类,它提供了一些方法来执行系统命令、获取系统信息等功能。

在一些实施例中,上述指定反序列化攻击方式包括readObject方式;

readObject方式对应的判定规则包括:在对readObject函数运行时的当前实体进行解包装得到的对象中任一对象的hashcode在内存池的哈希池hashPools中存在相同的hashcode的情况下,确定存在反序列化攻击;其中,所述hashPools中的hashcode包括所述getInputStream函数返回的流对象的hashcode。

示例性的,在该场景下,一方面,可以通过java探针监控readObject函数运行时的当前实体,即ObjectInputStream(为一个包装类),并对readObject函数运行时的当前实体进行解包装得到BlockDataInputStream、PeekInputStream以及BufferInputStream等三个对象,可以分别确定该三个对象的hashcode(哈希码);另一方面,可以通过探针监控getInputStream函数返回的流对象,并确定返回的流对象的hashcode,将确定的hashcode保存在内存池的hashPools(哈希池)中。

在对readObject函数运行时的当前实体进行解包装得到的对象中任一对象的哈希码hashcode在内存池的哈希池hashPools中存在相同的hashcode的情况下,可以确定存在反序列化攻击。

其中,BlockDataInputStream是JavaIO标准库中一个用于读取数据块的工具类,它可以高效地读取数据块,并且还支持跨平台的序列化和反序列化。

PeekInputStream是JavaIO标准库中一个扩展类,它可以让程序查看流中的下一个字节(byte)而不会使它被读取。

BufferedInputStream是JavaIO标准库中一个缓冲输入流类,它可以提高程序从输入流中读取数据的效率。

在一些实施例中,上述指定反序列化攻击方式包括forName方式;

forName方式对应的判定规则包括:在forName函数运行时的输入参数的类名为java.lang.ProcessBuilder或java.lang.Runtime的情况下,确定存在反序列化攻击。

示例性的,由于该场景下,对于“java.lang.ProcessBuilder”或“java.lang.Runtime”等类的使用一般不会使用反射方式,因此,在forName函数运行时的入参是“java.lang.ProcessBuilder”或“java.lang.Runtime”的情况下,其属于危险行为,可以确定存在反序列化攻击。

在一些实施例中,上述指定反序列化攻击方式包括URLClassLoader方式;

URLClassLoader方式对应的判定规则包括:在URLClassLoader函数运行时的输入参数为外部不可信地址的情况下,确定存在反序列化攻击。

示例性的,对于该场景,由于正常情况下不需要从远程加载一个类到本地环境中,因此,在URLClassLoader函数运行时的入参是一个外部不可信地址的情况下,大概率是一个攻击行为,可以确定存在反序列化攻击。

在一些实施例中,上述在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理,可以包括:

在业务系统的运行时长未超过预设时长的情况下,进行告警处理;

在业务系统的运行时长超过预设时长的情况下,进行反序列化攻击行为拦截。

示例性的,考虑到业务系统运行时长较短的情况下,可能会由于一些特殊原因导致误报反序列化行为攻击,因而,为了提高业务系统运行稳定性,在业务系统的运行时长较短的情况下,对于所确定的反序列化攻击行为,可以进行告警但不拦截。

相应地,在确定存在反序列化攻击的情况下,可以比较当前业务系统的运行时长与预设时长。

在在业务系统的运行时长未超过预设时长的情况下,进行告警处理;在业务系统的运行时长超过预设时长的情况下,进行反序列化攻击行为拦截。

示例性的,上述预设时长可以依据实际场景需求设定,例如,可以依据业务系统的访问量来设定。对于访问量较大的业务系统,可以将预设时长设置得比较短,如3天或5天等;对于访问量较小的业务系统,可以将预设时长设置得比较长,如1个月。

在一个示例中,在反序列化攻击为URLClassLoader方式的反序列化攻击,且业务系统的运行时长未超过预设时长的情况下,还可以包括:

输出告警信息,告警信息包括URLClassLoader函数运行时的输入参数;

依据检测到的针对输入参数的被信任对象名单设置指令的情况下,将输入参数添加至被信任对象名单;其中,被信任对象名单设置指令由用户在确定输入参数为可信地址的情况下输入。

示例性的,考虑到对于URLClassLoader方式的反序列化,可能会从外部可信地址加载类到本地环境,因此,可以通过维护被信任对象名单的方式,来对外部可信地址进行识别。

为了避免由于被信任对象名单不全导致的误报警,在反序列化攻击为URLClassLoader方式的反序列化攻击,且业务系统的运行时长未超过预设时长的情况下,可以进行告警,并输出告警信息。

示例性的,该告警信息可以包括URLClassLoader函数运行时的输入参数,即加载的url,以便相关人员确定该url是否为可信url。

相关人员在确定该输入参数为可信地址的情况下,可以将该输入参数添加到被信任对象名单中。

相应地,在检测到针对该输入参数的被信任对象名单设置指令的情况下,可以依据检测到的针对输入参数的被信任对象名单设置指令的情况下,将输入参数添加至被信任对象名单。

为了使本领域技术人员更好地理解本申请实施例提供的技术方案,下面结合具体场景对本申请实施例提供的技术方案进行说明。

在该实施例中,基于java探针的反序列化零日0day安全风险防御方案主要可以包括三个部分:探针的下放、规则设置、误报修正。

下面分别对该三个部分的实现进行说明。

一、探针的下放

通过对历史反序列化安全风险分析可知,反序列化攻击主要是通过四种方式进行反序列化,探针的下放主要是根据这四种方式(对应四种场景)进行展开。

1.1、invoke方式:invoke是反射类java.lang.reflect.Method的函数,其参数有两个,一个是实际的对象caller(调用者),第二个是实际的参数列表。因此,这类场景的java探针需要放在invoke函数中,用以监控caller以及具体method(方法)的名称;

1.2、readObject方式:readObject是java.io.ObjectInputStream的函数,主要是将入参流对象进行反序列化,这类场景需要在readObject函数中进行hook,用以监控运行时的实际流类型,此外,还需要在javax.servlet. ServletRequestWrapper的getInputStream函数中进行hook,用以记录返回的流对象;

1.3、forName方式:forName方式是java.lang.Class的函数,目的是通过一个类名获得对应的类对象,这类场景是对forName函数进行hook,以确定入参的类名;

1.4、URLClassLoader方式:java.net.URLClassLoader主要是通过一个url参数去加载远程对象,这个url可以是本地的,也可以是外部网络的,这类场景下的反序列化攻击本质上是通过URLClassLoader去加载外部的资源。因此,这类场景需要对URLClassLoader函数进行hook,以监控URLClassLoader函数运行时的入参。

二、规则设置

2.1、invoke方式:由于start和exec是一个执行系统命令的函数,在这类函数的发起一般不会通过反射的方式,因此,在invoke函数的caller是java.lang.ProcessBuilder,且method的实际名称是start,或者,invoke函数的caller是java.lang.Runtime,且method的实际名称是exec的情况下,可以确定存在反序列化攻击。

相应地,针对invoke场景,可以通过对method.invoke(caller,args)进行hook,监控caller和method的实际名称;在invoke函数的caller是java.lang.ProcessBuilder,且method的实际名称是start,或者,invoke函数的caller是java.lang.Runtime,且method的实际名称是exec的情况下,可以确定存在反序列化攻击,其实现流程示意图可以如图2所示。

2.2、readObject方式:一方面,可以通过java探针监控readObject函数运行时的当前实体,即ObjectInputStream,并对readObject函数运行时的当前实体进行解包装得到BlockDataInputStream、PeekInputStream以及BufferInputStream等三个对象,可以分别确定该三个对象的hashcode;另一方面,可以通过探针监控getInputStream函数返回的流对象,并确定返回的流对象的hashcode,将确定的hashcode保存在内存池的hashPools中。

相应地,对于readObject场景,一方面,可以对java.io.ObjectInputStream的readObject函数进行hook,监控this当前实体(即this对象所属的线程);对this当前实体利用发射机制进行解包装,依次得到BlockDataInputStream、PeekInputStream以及BufferInputStream三个对象,计算该三个对象的hashcode(假设分别为hashcode1、hashcode2、hashcode3)。

其中,在Java中,关键字this表示当前对象的引用。在一个实例方法内部,可以使用this关键字来引用该方法所属的对象。

另一方面,对javax.servlet.ServletRequestWrapper的getInputStream函数进行hook,监控返回的流对象;将每次实际返回的流对象的hashcode存储在内存池的hashPools中。

进而,在hashcode1、hashcode2、hashcode3中任意一个可以在内存池的hashPools中找到的情况下,则确定存在反序列化攻击,其实现流程示意图可以如图3所示。

2.3、forName方式:由于该场景下,对于“java.lang.ProcessBuilder”或“java.lang.Runtime”等类的使用一般不会使用反射方式,因此,在forName函数运行时的入参是“java.lang.ProcessBuilder”或“java.lang.Runtime”的情况下,其属于危险行为,可以确定存在反序列化攻击。

相应地,对于forName场景,可以对class.forName(name)进行hook,监控forName函数运行时的入参name;在forName函数运行时的入参为“java.lang.ProcessBuilder”或“java.lang.Runtime”的情况下,可以确定存在反序列化攻击,其实现流程示意图可以如图4所示。

2.4、URLClassLoader方式:由于正常情况下不需要从远程加载一个类到本地环境中,因此,在URLClassLoader函数运行时的入参是一个外部不可信地址的情况下,大概率是一个攻击行为,可以确定存在反序列化攻击。

相应地,对于URLClassLoader场景,可以对java.net.URLClassLoader的构造函数URLClassLoader(url)进行hook,监控入参url;在URLClassLoader函数运行时的入参不是本地地址且不属于被信任对象名单中的外部地址的情况下,确定存在反序列化攻击,其实现流程示意图可以如图5所示。

三、误报修正

在该实施例中,为了减少误报,在确定存在反序列化攻击的情况下,可以存在两种处理模式:

3.1、告警模式:即发现异常的情况下,进行告警,但不拦截,一般这种模式使用在系统刚上线的一段时间,例如,运行时长未超过预设时长,可以防止由于某些特殊情况造成的误报,这种情况下可以设置被信任对象名单。

例如,URLClassLoader确实可以加载一个非本地的IP地址,在确定加载的非本地IP地址为可信IP地址的情况下,可以将该非本地IP地址添加至被信任对象名单。

需要说明的是,在本申请实施例中,在按照上述方式确定存在反序列化攻击的情况下,还可以获取针对目标函数的调用链(即从源IP地址到目标函数的访问路径),并确定该调用链是否可信,在该调用链可信的情况下,可以将该调用链加入到被信任对象名单中,即被信任对象名单中的调用链为没有风险的实现,其他的都有风险(即确定存在反序列化攻击,且调用链不在被信任对象名单,就认为是真的攻击行为)。

3.2、拦截模式:拦截模式可以在系统运行一段时间之后开启,例如,在系统运行时长超过预设时长的情况下开启,这个阶段已经把业务特殊场景都加入到被信任对象名单中了,这时候如果有异常,则确实存在攻击行为的几率非常大,而且有可能是真正的0day安全风险。

以上对本申请提供的方法进行了描述。下面对本申请提供的装置进行描述:

请参见图6,为本申请实施例提供的一种反序列化0day安全风险防御装置的结构示意图,如图6所示,该反序列化0day安全风险防御装置可以包括:

监控单元610,用于在基于java实现的业务系统的运行过程中,利用java探针对所述业务系统运行状态进行监控;其中,所述java探针针对java函数库中与指定反序列化攻击方式关联的java函数设置;

判定单元620,用于依据所述java探针监控到的信息,以及,所述指定反序列化攻击方式对应的判定规则,进行反序列化攻击判定;其中,所述指定反序列化攻击方式对应的判定规则依据所述指定反序列化攻击方式下的攻击特性设置;

防御单元630,用于在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理。

在一些实施例中,所述指定反序列化攻击方式包括:invoke方式、readObject方式、forName方式,以及,URLClassLoader方式中的部分或全部;

与invoke方式关联的函数包括invoke函数,针对所述invoke函数设置的java探针用于监控所述invoke函数运行时的调用者caller和方法method的实际名称;

与readObject方式关联的函数包括readObject函数和getInputStream函数,针对所述readObject函数设置的java探针用于监控所述readObject函数运行时的实际流类型,针对所述getInputStream函数设置的java探针用于监控返回的流对象;

与forName方式关联的函数包括forName函数,针对所述forName函数设置的java探针用于监控所述forName运行时输入参数的类名;

与URLClassLoader方式关联的函数包括URLClassLoader函数,针对所述URLClassLoader函数设置的java探针用于监控所述URLClassLoader函数运行时的输入参数。

在一些实施例中,所述指定反序列化攻击方式包括invoke方式;

invoke方式对应的判定规则包括:在invoke函数运行时的caller是java.lang.ProcessBuilder,且method的实际名称是start;或,invoke函数运行时的caller是java.lang.Runtime,且method的实际名称是exec的情况下,确定存在反序列化攻击;

和/或,

所述指定反序列化攻击方式包括readObject方式;

readObject方式对应的判定规则包括:在对readObject函数运行时的当前实体进行解包装得到的对象中任一对象的哈希码hashcode在内存池的哈希池hashPools中存在相同的hashcode的情况下,确定存在反序列化攻击;其中,所述hashPools中的hashcode包括所述getInputStream函数返回的流对象的hashcode;

和/或,

所述指定反序列化攻击方式包括forName方式;

forName方式对应的判定规则包括:在forName函数运行时的输入参数的类名为java.lang.ProcessBuilder或java.lang.Runtime的情况下,确定存在反序列化攻击;

和/或,

所述指定反序列化攻击方式包括URLClassLoader方式;

URLClassLoader方式对应的判定规则包括:在所述URLClassLoader函数运行时的输入参数为外部不可信地址的情况下,确定存在反序列化攻击。

在一些实施例中,所述防御单元630在确定存在反序列化攻击的情况下,进行反序列化攻击防御处理,包括:

在所述业务系统的运行时长未超过预设时长的情况下,进行告警处理;

在所述业务系统的运行时长超过所述预设时长的情况下,进行反序列化攻击行为拦截。

在一些实施例中,所述防御单元630,还用于在所述反序列化攻击为URLClassLoader方式的反序列化攻击,且所述业务系统的运行时长未超过预设时长的情况下,输出告警信息,所述告警信息包括URLClassLoader函数运行时的输入参数;依据检测到的针对所述输入参数的被信任名单设置指令,将所述输入参数添加至被信任名单;其中,所述被信任名单设置指令由用户在确定所述输入参数为可信地址的情况下输入。

本申请实施例还提供一种电子设备,包括处理器和存储器,其中,存储器,用于存放计算机程序;处理器,用于执行存储器上所存放的程序时,实现上文描述的反序列化0day安全风险防御方法。

请参见图7,为本申请实施例提供的一种电子设备的硬件结构示意图。该电子设备可包括处理器701、存储有机器可执行指令的存储器702。处理器701与存储器702可经由系统总线703通信。并且,通过读取并执行存储器702中与反序列化0day安全风险防御逻辑对应的机器可执行指令,处理器701可执行上文描述的反序列化0day安全风险防御方法。

本文中提到的存储器702可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:RAM(RadomAccess Memory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。

在一些实施例中,还提供了一种机器可读存储介质,如图7中的存储器702,该机器可读存储介质内存储有机器可执行指令,所述机器可执行指令被处理器执行时实现上文描述的反序列化0day安全风险防御方法。例如,所述机器可读存储介质可以是ROM、RAM、CD-ROM、磁带、软盘和光数据存储设备等。

本申请实施例还提供了一种计算机程序产品,存储有计算机程序,并且当处理器执行该计算机程序时,促使处理器执行上文中描述的反序列化0day安全风险防御方法。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号