CN115859280A - 内存马的检测方法、装置、设备及存储介质 - Google Patents

内存马的检测方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN115859280A
CN115859280A CN202211470807.2A CN202211470807A CN115859280A CN 115859280 A CN115859280 A CN 115859280A CN 202211470807 A CN202211470807 A CN 202211470807A CN 115859280 A CN115859280 A CN 115859280A
Authority
CN
China
Prior art keywords
memory
class
horse
plug
class object
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202211470807.2A
Other languages
English (en)
Inventor
赵中树
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202211470807.2A priority Critical patent/CN115859280A/zh
Publication of CN115859280A publication Critical patent/CN115859280A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请公开了一种内存马的检测方法、装置、设备及存储介质,涉及计算机技术领域。所述方法包括:将代理插件注入主机上待进行内存马检测的目标进程;通过代理插件获取目标进程已加载的类对象;通过代理插件根据过滤规则对至少一个类对象进行无风险项过滤,得到有风险的候选类对象;通过代理插件得到候选类对象的类消息,类消息包括类对象的基础特征和代码特征,该代码特征包括类对象的原始字节码和反汇编代码序列;对类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。本申请实施例提供的技术方案,通过在类对象的基础特征的基础上,结合类对象的代码特征,进行内存马的检测,提高了内存马的检测准确性,以及降低了内存马漏报风险。

Description

内存马的检测方法、装置、设备及存储介质
技术领域
本申请实施例涉及计算机技术领域,特别涉及一种内存马的检测方法、装置、设备及存储介质。
背景技术
无文件攻击是服务器安全中一类新型的攻击方法,该攻击全过程不会有文件写入磁盘。目前,Java内存马(即Java内存木马)是攻击者使用最广、最频繁的无文件攻击方式。
在相关技术中,通过提取并解析Java进程中各个Class(类)对象分别对应的Constant(常量)和Method(方法)信息,来确定Class对象是否为Java内存马,然而仅仅基于Constant和Method信息进行Java内存马检测,存在Java内存马漏报风险。
发明内容
本申请实施例提供了一种内存马的检测方法、装置、设备及存储介质,能够,提高内存马的检测准确性,以及降低内存马漏报风险,所述技术方案可以包括如下内容。
根据本申请实施例的一个方面,提供了一种内存马的检测方法,所述方法包括:
将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程;
通过所述代理插件获取所述目标进程已加载的至少一个类对象;
通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象;
通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,所述类消息包括类对象的基础特征和代码特征,所述代码特征包括类对象的原始字节码和反汇编代码序列;
对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
根据本申请实施例的一个方面,提供了一种内存马的检测装置,所述装置包括:
代理插件注入模块,用于将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程;
存量对象获取模块,用于通过所述代理插件获取所述目标进程已加载的至少一个类对象;
候选对象确定模块,用于通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象;
类消息获取模块,用于通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,所述类消息包括类对象的基础特征和代码特征,所述代码特征包括类对象的原始字节码和反汇编代码序列;
内存马确定模块,用于对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
根据本申请实施例的一个方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有计算机程序,所述计算机程序由所述处理器加载并执行以实现上述内存马的检测方法。
根据本申请实施例的一个方面,提供了一种计算机可读存储介质,所述可读存储介质中存储有计算机程序,所述计算机程序由处理器加载并执行以实现上述内存马的检测方法。
根据本申请实施例的一个方面,提供了一种计算机程序产品,该计算机程序产品包括计算机程序,该计算机程序存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机程序,处理器执行该计算机程序,使得该计算机设备执行上述内存马的检测方法。
本申请实施例提供的技术方案可以包括如下有益效果:
通过将代理插件注入目标进程,再通过该代理插件获取目标进程中类对象的基础特征和代码特征,在类对象的基础特征的基础上,结合类对象的代码特征,对该类对象进行检测,以确定该类对象是否为内存马,避免了仅仅基于类对象的基础特征进行内存马检测而导致的内存马漏报的问题,从而降低了内存马漏报风险,进而提高了内存马的检测准确性。
另外,通过结合类对象的代码特征进行内存马检测,而不局限于某一类类对象(如接口的Class),从而扩展了本申请实施例提供的技术方案可检测的内存马种类和范围,进而提高了本申请实施例提供的技术方案针对内存马的检测适用性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本申请一个实施例提供的方案实施环境的示意图;
图2是本申请一个实施例提供的内存马的检测方法的流程图;
图3是本申请一个实施例提供的代理插件的注入方法的流程图;
图4是本申请一个实施例提供的Java内存马的检测方法的示意图;
图5是本申请一个实施例提供的Java内存马的注入方法的流程图;
图6是本申请一个实施例提供的前端的交互界面的示意图;
图7是本申请一个实施例提供的插件详情界面的示意图;
图8是本申请一个实施例提供的主机安全Agent与JavaAgent插件之间的通信建立方法的流程图;
图9是本申请一个实施例提供的Java内存马的检测方法的流程图;
图10是本申请一个实施例提供的Java内存马告警事件界面的示意图;
图11是本申请一个实施例提供的Java内存马详情界面的示意图;
图12是本申请一个实施例提供的Java内存马的示意图;
图13是本申请一个实施例提供的内存马的检测装置的框图;
图14是本申请另一个实施例提供的内存马的检测装置的框图;
图15是本申请一个实施例提供的计算机设备的框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在对本申请实施例进行介绍说明之前,首先对本申请中涉及的相关名词进行解释说明。
1、Java:一种编程语言。
2、Java内存马:注入到Java进程(如JavaWeb服务进程)中的一种内存马(即无文件马、内存木马、无文件内存马等),内存马是无文件攻击的一种手段。
3、Tomcat:一种常见的JavaWeb服务类型,如一种轻量级的JavaWeb容器。
4、JavaAgent:JVM(Java Virtual Machine,Java虚拟机)的一种插件规范,即一种JVM层面的插件,其能在不修改并重新编译Java业务代码的情况下,观测、修改Java代码的行为。
5、Unix Domain Socket:Linux下一种套接字类型,常用于IPC(Inter-ProcessCommunication,进程间通信)。
6、Network Namespace(网络命名空间):是实现容器网络虚拟化的重要功能,其实现了不同容器的网络隔离。
7、Ysoserial:一款开源Java反序列化利用工具,该工具中包含了常见的反序列化Gadgets(小工具)。
8、JVMTI:Java Virtual Machine Tool Interface,Java虚拟机工具接口。
9、Agent:能够自主活动的软件或者硬件实体,通常翻译为:代理。
请参考图1,其示出了本申请一个实施例提供的方案实施环境的示意图。该方案实施环境可以实现成为内存马检测架构。该实施环境可以包括:前端10、主机20和服务后端30。
前端10用于展示内存马检测架构的交互界面。示例性地,该交互界面中部署有内存马检测开关设置,用户通过设置该内存马检测开关设置,即可实现内存马检测的开启与关闭。可选地,该交互界面中还显示有代理插件(如JavaAgent插件)被注入到进程后的运行状态、内存马告警事件列表、告警详情查看等内容,以便于用户了解内存马检测情况。
可选地,该前端10可以是诸如手机、平板电脑、PC(Personal Computer,个人计算机)、可穿戴设备、智能机器人等电子设备,该前端10中能够安装运行目标应用程序,诸如浏览器类应用程序等。示例性地,该前端10为租户端(即终端中租赁或购买有内存马检测架构),前端10通过安装运行的网页浏览器展示内存马检测架构的交互界面。
主机20可以是指与前端10对应的主机,主机20用于为前端10提供后台服务。该主机20上可以安装内存马检测架构的主机安全代理(即主机安全Agent),该主机安全Agent用于实现内存马检测功能。示例性地,主机安全Agent可预先安装在主机20上,响应于用户开启内存马检测功能,主机安全Agent对主机上运行的进程进行内存马检测,得到内存马检测结果,并基于内存马检测结果生成内存马告警信息。可选地,前端10可以对应有一个或多个主机20。
服务后端30可以是指内存马检测架构的提供者对应的服务器,用于为主机安全Agent提供后台服务。服务后端30可用于对来自主机安全Agent的内存马告警信息进行解析以及入库。服务后端30还可用于将内存马告警信息提供给前端10,以进行展示。可选地,服务后端30可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云计算服务的云服务器。
前端10与主机20之间可以通过网络进行通信,主机20与服务后端30之间可以通过网络进行通信,服务后端30与前端10之间可以通过网络进行通信。
本申请实施例提供的技术方案适用于任何需要内存马检测的场景中,诸如护网场景、服务器安全场景、主机安全场景、软件安全场景等等。本申请实施例提供的技术方案能够提高内存马的检测准确性和适用性,以及降低内存马漏报风险。
下文将结合上述方案实施环境,对本申请实施例提供的技术方案进行详细说明。
请参考图2,其示出了本申请一个实施例提供的内存马的检测方法的流程图,该方法各步骤的执行主体可以是图1所示方案实施环境中的主机安全Agent,该方法可以包括如下几个步骤(201~205)。
步骤201,将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程。
代理插件是指一种JVM层面的插件,其可以对主机上的进程的行为进行观测、修改等操作,诸如JavaAgent插件等。在本申请实施例中,代理插件还用于特征提取,例如,代理插件可以对进程中的类对象(即Class对象)进行特征提取,获取类对象的类消息。可选地,上述进程可以是指Web服务进程。代理插件不能直接单独运行,其需要被注入进行进程中,在进程中运行。
上述主机可以是指需要进行内存马检测的主机,该主机可以被称之为服务器。目标进程则是该主机上运行的需要进行内存马检测的进程。可选地,响应于用户开启内存马检测功能,上述用于进行内存马检测的主机安全Agent,将代理插件注入目标进程中,以对目标进程进行内存马检测。
本申请实施例对可以检测的内存马的类型不作限定,诸如Java内存马、Web程序的内存马等。其中,Java内存马可以分为Servlet-API型内存马(如Servlet型、Filter型和Listener型)、Value型内存马、Agent型内存马,以及冰蟹、哥斯拉等类型的Java内存马,本申请实施例还支持检测Ysoserial、Marshalsec等广泛使用的反序列化漏洞工具生成的Gadgets。
在一个示例中,目标进程的确定过程可以如下:
1、获取主机上的进程列表。
可以通过上述主机安全Agent遍历主机上运行的进程,得到该主机对应的进程列表。可选地,还可以针对性地获取进程,例如,获取进程名为Java的进程,生成进程列表,本申请实施例对此不作限定。
2、根据进程的启动参数和启动方式,提取进程列表中各个进程分别对应的主类标识。
主类标识用于表示进程的主类,例如该主类标识可以是指进程的主类名。示例性地,以Java进程为例,每一个Java进程都有一个主类,为包含main()方法的类。主类能标识Java进程的类型,例如,Tomcat服务的主类为org.apache.catalina.startup.Bootstrap,即Tomcat的启动类(也可称为入口类)。主类是Java程序执行的入口点。
可选地,进程的启动方式可以包括执行类和执行文件。
在进程的启动方式为执行类的情况下,从进程的内核命令行中解析获取进程对应的主类标识。
示例性地,在Java进程的启动方式为:java[-options]class[args...]的情况下,则可以从Java进程的Cmdline(内核命令行)中解析获取Java进程的主类。[-options]配置JVM参数,[args...]配置Java运行参数。
在进程的启动驱动方式为执行文件的情况下,从进程的内核命令行中解析获取被执行的文件,基于被执行的文件确定进程对应的主类标识。
示例性地,在Java进程的启动方式为:java[-options]-jar jarfile[args...]的情况下,可以从Java进程的Cmdline中解析出被执行的jar文件,在提取jar文件中的META-INF/MANIFEST.MF文件,由于jar文件为zip格式,以zip格式解析提取即可。在MANIFEST.MF中的Main-Class变量值即为Java进程的主类标识。
3、根据主类标识,确定至少一个所述目标进程。
可选地,将进程的主类标识,与预设的主类名单进行匹配,筛选出至少一个目标进程。该主类名单中的主类对应的进程即为需要进行内存马检测进程,如此可以将不需要进行内存马检测的进程排除,从而减少内存马检测的工作量,进而提高内存马的检测效率。
在一个示例中,为了避免容器隔离而导致的代理插件注入失败这一问题,本申请实施例将代理插件注入分为两种情况:容器中和容器外,参考图3,步骤201还可以包括如下几个子步骤:
步骤201a,获取目标进程的符号链接,该符号链接用于指示引用路径。
符号链接包括对另一文件或目录的引用,其可用于指示进程的NetworkNamespace信息。示例性地,Java进程的符号链接可以表示为:/proc/[pid]/ns/net,[pid]为Java进程的进程标识。
步骤201b,在主机上安装的安全代理的符号链接,与目标进程的符号链接不一致的情况下,向目标进程所在的容器复制代理插件的文件;通过虚拟机工具接口机制基于代理插件的文件,将代理插件注入目标进程。
其中,安全代理用于检测内存马,该安全代理即为上述主机安全Agent。示例性地,安全代理的符号链接可以表示为:/proc/self/ns/net,self为安全代理的标识。
若安全代理的符号链接,与目标进程的符号链接不一致,则表明目标进程运行在主机对应的某个容器中。由于安全代理对应的进程运行在主机(即宿主机)上(即容器外),安全代理对应的进程是无法直接将代理插件注入容器内的进程中,因此需要提前检测目标进程是否在容器中。宿主机对应的容器与宿主机可以互相访问。
在确定目标进程在容器中的情况下,可以将代理插件的文件复制到目标进程所在的容器中,再进行代理文件的注入。代理插件的文件可以包括代理插件的代码、接口、标识等信息。在一个示例中,代理插件的文件复制方法至少包括下述三种方法:
方法1:将代理插件的文件复制到目标进程所在的容器的约定目录。
该约定目录可以根据实际使用需求进行设置与调整,申请实施例对此不作限定。可选地,采用docker cp命令将代理插件的文件复制到目标进程所在的容器的约定目录。
方法2:获取目标进程所在的容器的文件系统的差异目录,将代理插件的文件复制到差异目录中的约定子目录。
该约定子目录可以根据实际使用需求进行设置与调整,申请实施例对此不作限定。示例性地,可以先解析容器的文件系统类型,诸如Overlay、Unionfs等,再根据文件系统类型,获取容器的文件系统的差异目录(即diff目录),最后将代理插件的文件复制到差异目录中的约定子目录即可。
方法3:将代理插件的文件复制到目标进程的根目录。
示例性地,可以将代理插件的文件复制到Java进程的根目录(即root目录),例如/proc/[pid]/root/。
相比于相关技术中针对每一个容器均启动一个宿主机进程,并通过Setns调用进入容器,且需对代理插件进行分析而导致的成本较高和开销较大的问题,本申请实施例通过将代理插件的文件复制到容器中,即可进一步实现代理插件的注入,从而降低了代理插件注入的成本和开销,以及提高了代理插件的注入效率。
在将代理插件的文件复制到目标进程所在的容器之后,可以进行代理文件的注入,该过程可以如下:
1、获取目标进程的用户标识和组标识。
可选地,用户表示可以记为Uid(User ID,用户标识),组表示可以记为Gid(GroupID,组标识)。
2、在目标进程的当前工作目录或临时文件目录下,创建具有与目标进程相同的用户标识和组标识的目标空文件。
该目标空文件可以作为一种标识,用于指示是否可以创建套接字。目标空文件可以创建为.attach_pid[pid]空文件。
3、向目标进程发送第一通知信号,该第一通知信号用于触发目标进程在检测到存在目标空文件的情况下创建目标进程的套接字。
在目标进程接收到第一通知信号之后,若检测到存在目标空文件,则会创建套接字。示例性地,该第一通知信号为SIGQUIT信号,Java进程在接收到SIGQUIT信号之后,若检测到存在目标空文件,则会创建一个Unix Domain Socket,路径可以为/tmp/.java_pid[pid]。/tmp/表示Tmp目录(临时文件目录)。
4、基于目标进程的套接字,与目标进程之间建立传输连接。
可选地,安全代理基于目标进程的套接字,与目标进程之间建立TCP(Transmission Control Protocol,传输控制协议)连接。
5、向目标进程发送加载指令,该加载指令用于指示目标进程基于代理插件的文件,加载代理插件。
示例性地,该加载指令可以为Load Instrument指令,Java进程在接收到LoadInstrument指令之后,基于代理插件的文件,进行代理插件的加载。
步骤201c,在安全代理的符号链接,与目标进程的符号链接一致的情况下,通过虚拟机工具接口机制基于代理插件的文件,将代理插件注入目标进程。
若安全代理的符号链接,与目标进程的符号链接一致,则表明目标进程运行在主机对应的容器外,可以直接通过虚拟机工具接口机制基于代理插件的文件,将代理插件注入目标进程。
在一个示例中,在代理插件被注入到目标进程之后,代理插件的主函数在目标进程中被执行,代理插件的主函数可以通过写日志文件或者通过IPC机制与安全代理建立连接,以向安全代理报告代理插件已成功运行。安全代理可以通过检查代理插件的运行日志或通过IPC机制获取代理插件在目标进程中是否被执行、代理插件是否注入成功、代理插件是否执行成功等信息。安全代理可以将这些信息上报至服务后端,服务后端可以对这些信息进行存储,以及向前端发送这些信息,以向用户进行展示。
相比于相关技术中因采用VirtualMachine.attach做注入,而存在Jdk(JavaDevelopment Kit,java程序开发的工具包)版本兼容问题和容器命名空间隔离问题,本申请实施例通过套接字在安全代理和目标进程之间建立传输连接,使得目标进程可直接基于该传输连接,加载代理插件,从而解决了Jdk版本兼容问题和容器命名空间隔离问题,进而提高了本申请实施例提供的代理插件的注入适用性。
步骤202,通过代理插件获取目标进程已加载的至少一个类对象。
在代理插件被注入到目标进程之前,目标进程已经加载了一部分类对象,这部分类对象中可能存在内存马,因此,在代理插件被成功注入目标进程之后,需要对存量类对象进行内存马检测。可选地,这部分类对象可以被称之为存量类对象,存量类对象即为已加载的类对象。
可选地,通过调用Instrument的getAllLoadedClasses函数,获取目标进程已加载的所有类对象。
步骤203,通过代理插件根据过滤规则对至少一个类对象进行无风险项过滤,得到有风险的候选类对象。
可选地,代理插件可以先将目标进程中的无风险的类对象进行过滤,将有风险的类对象返回给安全代理,由安全代理做进一步判断。在本申请实施例中,无风险项是指能够被确定为不是内存马的类对象。过滤规则用于过滤掉无风险的类对象(即无风险项)。示例性地,该过滤规则可以包括Interface(接口)规则、Super_Class(父类)规则、Annotation(注释)规则、Class_Name规则等。过滤规则可以针对无风险的类对象建立的,也可以是针对有风险的类对象建立的,本申请实施例对此不作限定。例如,可以将未命中过滤规则的候选类对象确定为无风险项,即无风险的候选类对象。
在一个示例中,无风险的类对象过滤过程可以如下:
1、获取目标进程所在的网络命名空间,以及获取主机上安装的安全代理在网络命名空间下的第一侦听套接字。
可选地,安全代理在获取目标进程的网络命名空间之后,可以根据目标进程的网络命名空间,检索出安全代理在目标进程的网络命名空间下创建的第一侦听套接字。安全代理通过第一侦听套接字与被注入在目标进程中的代理插件进行信息交互。
2、通过第一侦听套接字,向代理插件的第二侦听套接字发送扫描指令。
第二侦听套接字为代理插件在目标进程的网络命名空间下创建的套接字。
可选地,安全代理通过第一侦听套接字与第二侦听套接字,实现安全代理与代理插件之间的IPC,则安全代理与代理插件之间可以进行信息交互。扫描指令中设置有过滤规则。
3、通过代理插件对扫描指令进行解析,获取过滤规则。
4、通过代理插件从至少一个类对象中,排除不可修改的类对象,得到初筛后的类对象集合。
可选地,可以调用Instrument的isModifiableClass函数检测类对象是否modifiable(可修改的),将不支持modifiable的类对象进行剔除,得到初筛后的类对象集合。
5、将初筛后的类对象集合中命中过滤规则的类对象,确定为候选类对象。
对于初筛后的类对象集合中的每个类对象,获取该类对象的基础特征,基础特征可以包括Interface、Super_Class_Names、Super_Class列表、Annotation、Loader_Class_Names、Loader_Class信息、Class_Name、Class是否存在文件等元信息,并将类对象的基础特征,与过滤规则进行比对,将命中过滤规则的类对象确定为候选类对象。
通过代理插件基于类对象的基础特征,对类对象进行初步筛,以得到有风险的类对象,使得安全代理仅需对有风险的类对象进行内存马检测,从而减少了安全代理的工作量,以及通信所需占用的资源,进而提高了内存马的检测效率。
步骤204,通过代理插件对候选类对象进行类特征提取,得到候选类对象的类消息,该类消息包括类对象的基础特征和代码特征,代码特征包括类对象的原始字节码和反汇编代码序列。
类特征是指类对象的特征,其可以包括类对象的基础特征和代码特征,代码特征是指与类对象的代码相关的特征。原始字节码即类对象的代码。反汇编代码序列可以是通过对原始字节码进行反编译等到的。
在一个示例中,候选类对象的类消息的获取过程可以如下:
1、通过代理插件提取候选类对象的原始字节码。
可选地,可以借助Instrument做一次transform,以获取候选类对象的原始字节码:调用addTransformer添加一个dump transformer,调用retransformClasses函数实现对候选类对象的retransform,在dump transformer中保存有候选类对象的原始字节码。
2、通过代理插件对候选类对象的原始字节码进行反编译,得到候选类对象的反汇编代码序列。
可选地,对原始字节码进行反编译,可以得到常量、字符串、反汇编代码序列等。
3、通过代理插件对提取得到的候选类对象的基础特征和原始字节码,以及反汇编代码序列进行封装,得到候选类对象的类消息。
通过代理插件对候选类对象进行类特征提取,得到候选类对象的基础特征和代码特征之后,将基础特征和代码特征封装成类消息,并将类消息发送到安全代理,由安全代理进一步进行内存马检测。
步骤205,对类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
安全代理在获取候选类对象的类消息之后,利用内存马特征库对类消息进行内存马特征扫描,得到目标类对象;其中,内存马特征库包含内存马的正则表达式格式的检测规则。内存马特征是指内存马所具有的特征,如运行方式、代码特征等,内存马特征可用正则表达式格式表示。
可选地,安全代理从类消息中提取出候选类对象的反汇编序列和原始字节码,将候选类对象的反汇编序列和原始字节码与内存马特征库中的检测规则进行匹配,在反汇编序列和原始字节码中任一个命中检测规则的情况下,将该候选类对象确定为目标类类对象。
示例性地,安全代理可以采用Hyperscan引擎扫描类消息。由于安全代理采用了Hyperscan引擎,在安全代理启动时,Hyperscan引擎就将内存马的正则表达式格式的检测规则编译成Hyperscan规则库,在需要扫描类信息时,可以省去规则编译过程,从而大幅减低性能损耗。同时,Hyperscan引擎具有多模匹配的特性,即无论多少条检测规则,都只需要扫描一次类消息即可完成检测,在大量规检测则场景下,性能损耗可以进一步降低。
在一个示例中,在目标进程中存在变更或新增的类对象的情况下,可以通过代理插件获取变更或新增的类对象的类消息;对变更或新增的类对象的类消息进行内存马特征扫描,得到变更或新增的类对象对应的检测结果。
其中,变更的类对象是指存量类对象中出现变更的类对象,新增的类对象是指目标进程中新增的类对象。检测结果用于指示变更或新增的类对象是否为内存马。
可选地,代理插件在被注入到目标进程后,代理插件的主函数会被调用,在代理插件的主函数中,会通过调用addTransformer函数注册一个ClassFileTransformer回调对象。Instrument机制保证当目标进程中有变更或新增的类对象时,都会回调所注册的ClassFileTransformer回调对象,从该ClassFileTransformer回调对象中可以获取变更或新增的类对象。
在一个示例中,在确定目标类对象之后,安全代理还可以基于目标类对象,构造内存马告警信息,该内存马告警信息包括目标类对象的完整信息和目标类对象命中的检测规则;将内存马告警信息上报至服务器,该内存马告警信息用于通过服务器转发至前端页面进行展示。
其中,服务器即为上述服务后端,前端也页面即为上述前端中安装运行的浏览器所展示的页面。可选地,该内存马告警信息还可以包括告警详情、告警原因、解决意见等信息。
在一个示例中,由于安全代理需要将过滤规则、检测规则等发送到代理插件中,代理插件也需要将代理插件的运行状态、类消息等发送到安全代理,因此,安全代理和被注入目标进程中的代理插件之间需要建立通信。
以该通信可以为IPC为例,在将代理插件注入目标进程之前,安全代理可以先创建用于与代理插件通信的第一侦听套接字,该过程可以如下:
获取主机上安装的安全代理的网络命名空间,即获取安全代理的符号链接。
在主机上安装的安全代理的网络命名空间,与目标进程的网络命名空间不同的情况下,通过安全代理内的线程切换到目标进程的网络命名空间;在目标进程的网络命名空间下创建第一侦听套接字;返回安全代理的网络命名空间。
示例性地,若安全代理的网络命名空间,与目标进程的网络命名空间不同,则表明安全代理与目标进程不在同一个网络命名空间,安全代理可以通过调用Setns调用进入目标进程的网络命名空间。安全代理进入到目标进程的网络命名空间后,可以通过执行Socket调用,创建一个Abstract Unix Domain套接字(即第一侦听套接字),该套接字归属于目标进程的网络命名空间,其对目标进程的网络命名空间中所有的进程均可见。安全代理再次执行Setns调用,返回安全代理的网络命名空间,但其所创建的第一侦听套接字仍归属于目标进程的网络命名空间。
可选地,在主机上安装的安全代理的网络命名空间,与目标进程的网络命名空间相同的情况下,则直接在安全代理的网络命名空间下创建第一侦听套接字即可。
在将代理插件注入目标进程之后,可以创建代理插件的与第一侦听套接字对应的第二侦听套接字,该过程可以如下:通过代理插件创建第二侦听套接字;通过第一侦听套接字接收来自第二侦听套接字的周期性的心跳消息,心跳信息用于反映代理插件的运行状态。
可选地,代理插件可直接在目标进程的网络命名空间下创建第二侦听套接字,安全代理可以直接根据第一侦听套接字和第二侦听套接字,与代理插件进行通信。上述心跳信息可以包括代理插件的版本信息、目标进程的相关信息、检测策略的版本信息(包括过滤规则和检测规则)等。
安全代理可以从心跳消息中解析出代理插件的版本信息、目标进程的相关信息、检测策略的版本信息(包括过滤规则和检测规则)等。可选地,在代理插件的版本低于安全代理配置的版本的情况下,安全代理将最新版本的代理插件重新注入到目标进程中,以代替原来的代理插件。可选地,在检测策略的版本不等于安全代理配置的版本的情况下,安全代理向代理插件发送最新版本的检测策略。
综上所述,本申请实施例提供的技术方案,通过将代理插件注入目标进程,再通过该代理插件获取目标进程中类对象的基础特征和代码特征,在类对象的基础特征的基础上,结合类对象的代码特征,对该类对象进行检测,以确定该类对象是否为内存马,避免了仅仅基于类对象的基础特征进行内存马检测而导致的内存马漏报的问题,从而降低了内存马漏报风险,进而提高了内存马的检测准确性。
另外,通过结合类对象的代码特征进行内存马检测,而不局限于某一类类对象(如接口的Class),从而扩展了本申请实施例提供的技术方案可检测的内存马种类和范围,进而提高了本申请实施例提供的技术方案针对内存马的检测适用性。
另外,本申请实施例通过套接字在安全代理和目标进程之间建立传输连接,使得目标进程可直接基于该传输连接,加载代理插件,从而解决了Jdk版本兼容问题和容器命名空间隔离问题,进而提高了本申请实施例提供的代理插件的注入适用性。
另外,通过创建安全代理和代理插件在同一网络命名空间下的侦听套接字,使得安全代理和代理插件之间可以进行通信,从而确保了检测策略的及时下发,以及代理插件的运行状态和类消息的及时上传,进而提高了内存马的检测稳定性。
在一个示例性实施例中,以Java内存马检测为例,对本申请实施例提供的技术方案进行说明,其具体内容可以如下:
参考图4,该过程可以分成三个部分:JavaAgent插件(即上述代理插件)注入过程、主机安全Agent(即上述安全代理)与JavaAgent插件之间的IPC建立过程和Java内存马的检测过程。
1、结合图4和图5,JavaAgent插件注入过程可以如下:
步骤501,解析Java进程的启动参数。
可选地,响应于用户针对前端401中显示的目标主机的Java内存马检测开关的开启操作,主机安全Agent 403通过遍历目标主机上运行的进程,获取进程名为Java的进程,以得到目标主机对应Java进程列表。该目标主机可以是指任一预安装有主机安全Agent403的主机。示例性地,参考图6,在前端401的交互界面600中,存在多个服务器(即主机)对应的JavaAgent插件405的开关601,响应于用户针对某一开关601的开启操作,主机安全Agent 403针对该开关601对应的服务器,执行JavaAgent插件405的注入,从而开启JavaAgent插件405。用户一键即可开启Java内存马检测功能,不需要用户重新启动Java进程,也不需要用户修改Java进程的启动参数等操作,从而降低了用户的使用成本,进而提高了用户体验。
主机安全Agent 403在获取目标主机对应Java进程列表之后,通过解析Java进程的启动参数和启动方式,提取Java进程列表中各个Java进程的主类名。可选地,上述Java进程也是指JavaWeb服务进程,本申请实施例对此不作限定。
步骤502,过滤需要注入JavaAgent插件的Java进程。
主机安全Agent 403根据服务后端402设置的主类名单,将主类名符合主类名单的Java进程挑选出来,得到多个目标Java进程,该多个目标Java进程即为需要注入JavaAgent插件405的Java进程(如图4中的Java进程404)。
步骤503,检测Java进程是否在容器中。
以图4中的Java进程404为例,若主机安全Agent 403检测到自己的符号链接,与Java进程404的符号链接不一致,则可以判断Java进程404运行在主机对应的某个容器中;若主机安全Agent 403检测到自己的符号链接,与Java进程404的符号链接一致,则可以判断Java进程404未运行在容器中。
步骤504,若Java进程在容器中,则将JavaAgent插件的文件复制到Java进程所在的容器,然后执行步骤505。
在主机安全Agent 403检测到Java进程404运行在容器中的情况下,主机安全Agent 403需要将JavaAgent插件405的文件复制到Java进程404的根目录中,然后才能执行JavaAgent插件405的注入。
步骤505,若Java进程不在容器中,则执行JavaAgent插件的注入。
在主机安全Agent 403检测到Java进程404未运行在容器中或JavaAgent插件405的文件已经复制到Java进程404的根目录中的情况下,主机安全Agent403可以直接执行JavaAgent插件405的注入。JavaAgent插件405的注入方法与上述实施例介绍相同,这里不再赘述。
步骤506,获取JavaAgent插件的运行状态。
在JavaAgent插件405被注入到Java进程404之后,主机安全Agent 403还会与JavaAgent插件405之间建立IPC。JavaAgent插件405通过该通信通道,向主机安全Agent403报告是否注入成功、是否执行成功、是否被执行等运行状态信息。
可选地,主机安全Agent 403在获取JavaAgent插件405的运行状态之后,上服务后端402上报JavaAgent插件405的运行状态,服务后端402将JavaAgent插件405的运行状态写入数据库,并在前端401中向用户展示。示例性地,参考图7,从插件详情界面700中可以看出,PID为4775的Java进程中的JavaAgent插件已经退出,即停止运行。
本申请实施例同时支持宿主机、容器内运行的Java进程的Java内存马检测,从而提高了本申请实施例提供的技术方案的适用性。
2、结合图4和图8,主机安全Agent与JavaAgent插件之间的IPC建立过程可以如下:
步骤801,获取Java进程的网络命名空间。
主机安全Agent 403获取Java进程404的网络命名空间,即符号链接。
步骤802,检测是否属于同一网络命名空间。
若主机安全Agent 403检测到自己的网络命名空间,与Java进程404的网络命令空间不相同,则可以判断自己与Java进程404不属于同一网络命名空间;若主机安全Agent403检测到自己的网络命名空间,与Java进程404的网络命令空间相同,则可以判断自己与Java进程404属于同一网络命名空间。
步骤803,若不属于同一网络命名空间,则执行Setns调用,进入Java进程的网络命名空间,然后执行步骤604。
主机安全Agent 403在检测到自己与Java进程404不属于同一网络命名空间的情况下,可以调用Setns CLONE_NEWNET,进入Java进程404的网络命名空间。
步骤804,若属于同一网络命名空间,则创建第一侦听套接字。
主机安全Agent 403在检测到自己与Java进程404属于同一网络命名空间或者自己已经进入Java进程404的网络命名空间的情况下,主机安全Agent 403在Java进程404的网络命名空间下创建第一侦听套接字,然后主机安全Agent403可以再次执行Setns调用,回到自己的网络命名空间。
步骤805,执行注入JavaAgent插件的操作。
步骤806,通过JavaAgent插件创建第二侦听套接字。
在JavaAgent插件405被注入Java进程404之后,JavaAgent插件405在Java进程404的网络命名空间下创建第二侦听套接字。
由于Java语言中,没有创建Unix Domain Socket的API(ApplicationProgramming Interface,应用程序编程接口),因此需要通过JNI(Java NativeInterface,Java本地接口)机制将Socket、Bind、Sendto、Recvfrom等系统调用封装成一个C模块,并导入到Java语言中,在JavaAgent插件被注入时,JavaAgent插件调用System.load加载C模块,然后JavaAgent插件的Java代码中即可调用Socket、Bind等函数创建第二侦听套接字。
JavaAgent插件405可以通过第二侦听套接字,周期性地向主机安全Agent403的第一侦听套接字发送心跳消息,该心跳消息用于反映JavaAgent插件405的运行状态,该心跳消息可以包括代JavaAgent插件405的版本信息、Java进程404的相关信息、检测策略的版本信息(包括过滤规则和检测规则)等。
步骤807,接收来自JavaAgent插件的心跳信息。
主机安全Agent 403通过第一侦听套接字接收来自JavaAgent插件405的心跳信息。
步骤808,发送检测策略。
主机安全Agent 403在第一次接收到自JavaAgent插件405的心跳信息时,向JavaAgent插件405下发检测策略,该检测策略用于Java内存马检测。
可选地,主机安全Agent 403可以根据后续的心跳信息,对JavaAgent插件405的版本、检测策略的版本等进行更新与调整,实现版本与策略的同步。
本申请实施例由于通过侦听套接字,在主机安全Agent和JavaAgent插件之间建立IPC,突破了容器与宿主机之间的通信隔离,使得本申请实施例提供的技术方案能够支持多服务类型,诸如Tomcat、Jboss、Resin、Jetty、Weblogic等均能支持,从而进一步提高了本申请实施例提供的技术方案的适用性。
3、结合图4和图9,Java内存马的检测过程可以如下:
步骤901,向JavaAgent插件发送扫描指令。
可选地,在JavaAgent插件405被成功注入Java进程404,且JavaAgent插件405与主机安全Agent 403之间建立IPC之后,主机安全Agent 403通过第一侦听套接字和第二侦听套接字,向JavaAgent插件405发送扫描指令。该扫描指令用于指示JavaAgent插件405获取Java进程404上已加载的存量Class对象。该扫描指令包括针对存量Class对象的过滤规则。
步骤902,通过JavaAgent插件获取Java进程中的存量Class对象。
可选地,主机安全Agent 403可以通过JavaAgent插件405,调用Instrument的getAllLoadedClasses函数获取Java进程已404加载的所有存量Class对象。
步骤903,通过JavaAgent插件过滤需要进行Java内存马检测的候选存量Class对象。
主机安全Agent 403可以通过JavaAgent插件405,调用Instrument的isModifiableClass函数检查存量Class对象是否modifiable,排除不支持modifiable的存量Class对象。然后,通过JavaAgent插件405获取剩余的存量Class对象的基础特征,并与过滤规则进行比对,得到候选存量Class对象,该候选存量Class对象是指有风险的存量Class对象(即有可能为Java内存马的存量Class对象)。
步骤904,转存需要进行Java内存马检测的候选存量Class对象。
主机安全Agent 403可以通过JavaAgent插件405,调用addTransformer添加一个dump transformer,再调用retransformClasses函数实现对候选存量Class对象的retransform,在dump transformer中保存有候选存量Class对象的原始字节码。
步骤905,反编译需要进行Java内存马检测的候选存量Class对象。
主机安全Agent 403可以通过JavaAgent插件405,对候选存量Class对象的原始字节码进行反编译,得到候选存量Class对象对应的常量、字符串、反汇编代码序列等。
步骤906,获取候选存量Class对象的Class消息。
主机安全Agent 403可以通过JavaAgent插件405,对候选存量Class对象的基础特征、原始字节码和反汇编代码序列进行封装,得到候选存量Class对象Class消息,并通第二过侦听套接字将Class消息发送给主机安全Agent 403,主机安全Agent 403通过第一侦听套接字接收Class消息。
步骤907,扫描Class消息,确定Java内存马。
主机安全Agent 403采用Hyperscan库,扫描Class消息,将Class消息命中检测规则的候选存量Class对象确定为Java内存马。
步骤908,上报内存马告警信息。
主机安全Agent 403,基于Java内存马,构造内存马告警信息,并将该内存马告警信息上报给服务后端402,服务后端402对内存马告警信息进行解析后入库,并将内存马告警信息发送至前端401,以向用户展示。
可选地,JavaAgent插件405被注入到Java进程404之后,JavaAgent插件405的主函数会被调用,在JavaAgent插件405的主函数中,通过调用addTransformer函数注册一个ClassFileTransformer回调对象,Instrument机制保证当Java进程中出现变更的或新增的Class对象时,都会回调我们注册的ClassFileTransformer回调,来获取变更的或新增的Class对象,然后采用与上述相同的方法对变更的或新增的Class对象进行Java内存马检测。在本申请实施例中,JavaAgent插件405被注入之后,无需在进行注入操作,也即后续检测过程,可以直接利用JavaAgent插件405进行Java内存马检测。
示例性地,参考图10,Java内存马告警事件界面1000展示了Java内存马所在的位置、Java内存马的类型、发现事件等信息。参考图11,针对某一条Java内存马,用户还可以进一步对其进行详细查看,Java内存马详情界面1100向用户展示了该Java内存马的详细信息,以及危害描述和修复建议。参考图12,图12示例性示出了Java内存马1200(Java内存马1200的Payload(有效载荷)详情)。Java内存马1200中具有内存马特征1201和内存马特征1202,在扫描到类对象中存在内存马特征1201和内存马特征1202时,可以直接将其判断为Java内存马。
综上所述,本申请实施例提供的技术方案,通过将JavaAgent插件注入目标Java进程,再通过该JavaAgent插件获取目标Java进程中Class对象的基础特征和代码特征,在Class对象的基础特征的基础上,结合Class对象的代码特征,对该Class对象进行检测,以确定该Class对象是否为Java内存马,避免了仅仅基于Class对象的基础特征进行Java内存马检测而导致的Java内存马漏报的问题,从而降低了Java内存马漏报风险,进而提高了Java内存马的检测准确性。
另外,通过结合Class对象的代码特征进行Java内存马检测,而不局限于某一类Class对象,从而扩展了本申请实施例提供的技术方案可检测的Java内存马种类和范围,进而提高了本申请实施例提供的技术方案针对Java内存马的检测适用性。
下述为本申请装置实施例,可以用于执行本申请方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请方法实施例。
参考图13,其示出了本申请一个实施例提供的内存马检测装置的框图。该装置具有实现上述方法示例的功能,所述功能可以由硬件实现,也可以由硬件执行相应的软件实现。该装置可以是上文介绍的计算机设备,也可以设置在计算机设备中。如图13所示,该装置1300包括:代理插件注入模块1301、存量对象获取模块1302、候选对象确定模块1303、类消息获取模块1304和内存马确定模块1305。
代理插件注入模块1301,用于将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程。
存量对象获取模块1302,用于通过所述代理插件获取所述目标进程已加载的至少一个类对象。
候选对象确定模块1303,用于通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象。
类消息获取模块1304,用于通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,所述类消息包括类对象的基础特征和代码特征,所述代码特征包括类对象的原始字节码和反汇编代码序列。
内存马确定模块1305,用于对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
在一些实施例中,如图14所示,所述代理插件注入模块1301,包括:符号链接获取子模块1301a、插件文件复制子模块1301b和代理插件注入子模块1301c。
符号链接获取子模块1301a,用于获取所述目标进程的符号链接,所述符号链接用于指示引用路径。
插件文件复制子模块1301b,用于在所述主机上安装的安全代理的符号链接,与所述目标进程的符号链接不一致的情况下,向所述目标进程所在的容器复制所述代理插件的文件;代理插件注入子模块1301c,用于通过虚拟机工具接口机制基于所述代理插件的文件,将所述代理插件注入所述目标进程。
所述代理插件注入子模块1301c,还用于在所述安全代理的符号链接,与所述目标进程的符号链接一致的情况下,通过虚拟机工具接口机制基于所述代理插件的文件,将所述代理插件注入所述目标进程;其中,所述安全代理用于检测内存马。
在一些实施例中,所述代理插件注入子模块1301c,还用于:
获取所述目标进程的用户标识和组标识;
在所述目标进程的当前工作目录或临时文件目录下,创建具有与所述目标进程相同的所述用户标识和组标识的目标空文件;
向所述目标进程发送第一通知信号,所述第一通知信号用于触发所述目标进程在检测到存在所述目标空文件的情况下创建所述目标进程的套接字;
基于所述目标进程的套接字,与所述目标进程之间建立传输连接;
向所述目标进程发送加载指令,所述加载指令用于指示所述目标进程基于所述代理插件的文件,加载所述代理插件。
在一些实施例中,所述插件文件复制子模块1301b,用于:
将所述代理插件的文件复制到所述目标进程所在的容器的约定目录;
或者,获取所述目标进程所在的容器的文件系统的差异目录,将所述代理插件的文件复制到所述差异目录中的约定子目录;
或者,将所述代理插件的文件复制到所述目标进程的根目录。
在一些实施例中,所述候选对象确定模块1303,用于:
获取所述目标进程所在的网络命名空间,以及获取所述主机上安装的安全代理在所述网络命名空间下的第一侦听套接字;
通过所述第一侦听套接字,向所述代理插件的第二侦听套接字发送扫描指令;
通过所述代理插件对所述扫描指令进行解析,获取所述过滤规则;
通过所述代理插件从所述至少一个类对象中,排除不可修改的类对象,得到初筛后的类对象集合;
将所述初筛后的类对象集合中命中所述过滤规则的类对象,确定为所述候选类对象。
在一些实施例中,所述类消息获取模块1304,用于:
通过所述代理插件提取所述候选类对象的原始字节码;
通过所述代理插件对所述候选类对象的原始字节码进行反编译,得到所述候选类对象的反汇编代码序列;
通过所述代理插件对提取得到的所述候选类对象的基础特征和原始字节码,以及所述反汇编代码序列进行封装,得到所述候选类对象的类消息。
在一些实施例中,所述内存马确定模块1305,用于利用内存马特征库对所述类消息进行内存马特征扫描,得到所述目标类对象;其中,所述内存马特征库包含内存马的正则表达式格式的检测规则。
在一些实施例中,所述类消息获取模块1304,还用于在所述目标进程中存在变更或新增的类对象的情况下,通过所述代理插件获取所述变更或新增的类对象的类消息。
所述内存马确定模块1305,还用于对所述变更或新增的类对象的类消息进行内存马特征扫描,得到所述变更或新增的类对象对应的检测结果。
在一些实施例中,如图14所示,所述装置1300,还包括:进程列表获取模块1306、主类标识获取模块1307和目标进程确定模块1308。
进程列表获取模块1306,用于获取所述主机上的进程列表。
主类标识获取模块1307,用于根据进程的启动参数和启动方式,提取所述进程列表中各个进程分别对应的主类标识。
目标进程确定模块1308,用于根据所述主类标识,确定至少一个所述目标进程。
在一些实施例中,所述主类标识获取模块1307,用于:
在所述进程的启动方式为执行类的情况下,从所述进程的内核命令行中解析获取所述进程对应的主类标识;
或者,在所述进程的启动驱动方式为执行文件的情况下,从所述进程的内核命令行中解析获取被执行的文件,基于所述被执行的文件确定所述进程对应的主类标识。
在一些实施例中,如图14所示,所述装置1300,还包括:告警信息构造模块1309和告警信息上报模块1310。
告警信息构造模块1309,用于基于所述目标类对象,构造内存马告警信息,所述内存马告警信息包括所述目标类对象的完整信息和所述目标类对象命中的检测规则。
告警信息上报模块1310,用于将所述内存马告警信息上报至服务器,所述内存马告警信息用于通过所述服务器转发至前端页面进行展示。
在一些实施例中,如图14所示,所述装置1300,还包括:命名空间切换模块1311、套接字创建模块1312和心跳信息接收模块1313。
命名空间切换模块1311,用于在所述主机上安装的安全代理的网络命名空间,与所述目标进程的网络命名空间不同的情况下,通过所述安全代理内的线程切换到所述目标进程的网络命名空间。
套接字创建模块1312,用于在所述目标进程的网络命名空间下创建第一侦听套接字。
所述命名空间切换模块1311,还用于返回所述安全代理的网络命名空间。
所述套接字创建模块1312,还用于通过所述代理插件创建第二侦听套接字。
心跳信息接收模块1313,用于通过所述第一侦听套接字接收来自所述第二侦听套接字的周期性的心跳消息,所述心跳信息用于反映所述代理插件的运行状态。
综上所述,本申请实施例提供的技术方案,通过将代理插件注入目标进程,再通过该代理插件获取目标进程中类对象的基础特征和代码特征,在类对象的基础特征的基础上,结合类对象的代码特征,对该类对象进行检测,以确定该类对象是否为内存马,避免了仅仅基于类对象的基础特征进行内存马检测而导致的内存马漏报的问题,从而降低了内存马漏报风险,进而提高了内存马的检测准确性。
另外,通过结合类对象的代码特征进行内存马检测,而不局限于某一类类对象(如接口的Class),从而扩展了本申请实施例提供的技术方案可检测的内存马种类和范围,进而提高了本申请实施例提供的技术方案针对内存马的检测适用性。
需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
请参考图15,其示出了本申请一个实施例提供的计算机设备的结构框图。该计算机设备可以用于实施上述实施例中提供的内存马的检测方法。具体可以包括如下内容。
该计算机设备1500包括中央处理单元(如CPU(Central Processing Unit,中央处理器)、GPU(Graphics Processing Unit,图形处理器)和FPGA(Field Programmable GateArray,现场可编程逻辑门阵列)等)1501、包括RAM(Random-Access Memory,随机存取存储器)1502和ROM(Read-Only Memory,只读存储器)1503的系统存储器1504,以及连接系统存储器1504和中央处理单元1501的系统总线1505。该计算机设备1500还包括帮助服务器内的各个器件之间传输信息的基本输入/输出系统(Input Output System,I/O系统)1506,和用于存储操作系统1513、应用程序1514和其他程序模块1515的大容量存储设备1507。
该基本输入/输出系统1506包括有用于显示信息的显示器1508和用于用户输入信息的诸如鼠标、键盘之类的输入设备1509。其中,该显示器1508和输入设备1509都通过连接到系统总线1505的输入输出控制器1510连接到中央处理单元1501。该基本输入/输出系统1506还可以包括输入输出控制器1510以用于接收和处理来自键盘、鼠标、或电子触控笔等多个其他设备的输入。类似地,输入输出控制器1510还提供输出到显示屏、打印机或其他类型的输出设备。
该大容量存储设备1507通过连接到系统总线1505的大容量存储控制器(未示出)连接到中央处理单元1501。该大容量存储设备1507及其相关联的计算机可读介质为计算机设备1500提供非易失性存储。也就是说,该大容量存储设备1507可以包括诸如硬盘或者CD-ROM(Compact Disc Read-Only Memory,只读光盘)驱动器之类的计算机可读介质(未示出)。
不失一般性,该计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、EPROM(Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦写可编程只读存储器)、闪存或其他固态存储技术,CD-ROM、DVD(Digital Video Disc,高密度数字视频光盘)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知该计算机存储介质不局限于上述几种。上述的系统存储器1504和大容量存储设备1507可以统称为存储器。
根据本申请实施例,该计算机设备1500还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即计算机设备1500可以通过连接在该系统总线1505上的网络接口单元1511连接到网络1512,或者说,也可以使用网络接口单元1511来连接到其他类型的网络或远程计算机系统(未示出)。
所述存储器还包括计算机程序,计算机程序存储于存储器中,且经配置以由一个或者一个以上处理器执行,以实现上述内存马的检测方法。
在一些实施例中,还提供了一种计算机可读存储介质,所述存储介质中存储有计算机程序,所述计算机程序在被处理器执行时以实现上述内存马的检测方法。
可选地,该计算机可读存储介质可以包括:ROM(Read-Only Memory,只读存储器)、RAM(Random-Access Memory,随机存储器)、SSD(Solid State Drives,固态硬盘)或光盘等。其中,随机存取记忆体可以包括ReRAM(Resistance Random Access Memory,电阻式随机存取记忆体)和DRAM(Dynamic Random Access Memory,动态随机存取存储器)。
在一些实施例中,还提供了一种计算机程序产品,所述计算机程序产品包括计算机程序,所述计算机程序存储在计算机可读存储介质中。计算机设备的处理器从所述计算机可读存储介质中读取所述计算机程序,所述处理器执行所述计算机程序,使得所述计算机设备执行上述内存马的检测方法。
需要说明的是,本申请所涉及的信息(包括但不限于对象设备信息、对象个人信息等)、数据(包括但不限于用于分析的数据、存储的数据、展示的数据等)以及信号,均为经对象授权或者经过各方充分授权的,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。例如,本申请中涉及到的进程、类对象、类消息等都是在充分授权的情况下获取的。
应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。另外,本文中描述的步骤编号,仅示例性示出了步骤间的一种可能的执行先后顺序,在一些其它实施例中,上述步骤也可以不按照编号顺序来执行,如两个不同编号的步骤同时执行,或者两个不同编号的步骤按照与图示相反的顺序执行,本申请实施例对此不作限定。
以上所述仅为本申请的示例性实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (16)

1.一种内存马的检测方法,其特征在于,所述方法包括:
将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程;
通过所述代理插件获取所述目标进程已加载的至少一个类对象;
通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象;
通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,所述类消息包括类对象的基础特征和代码特征,所述代码特征包括类对象的原始字节码和反汇编代码序列;
对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
2.根据权利要求1所述的方法,其特征在于,所述将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程,包括:
获取所述目标进程的符号链接,所述符号链接用于指示引用路径;
在所述主机上安装的安全代理的符号链接,与所述目标进程的符号链接不一致的情况下,向所述目标进程所在的容器复制所述代理插件的文件;通过虚拟机工具接口机制基于所述代理插件的文件,将所述代理插件注入所述目标进程;
在所述安全代理的符号链接,与所述目标进程的符号链接一致的情况下,通过虚拟机工具接口机制基于所述代理插件的文件,将所述代理插件注入所述目标进程;
其中,所述安全代理用于检测内存马。
3.根据权利要求2所述的方法,其特征在于,所述通过虚拟机工具接口机制基于所述代理插件的文件,将所述代理插件注入所述目标进程,包括:
获取所述目标进程的用户标识和组标识;
在所述目标进程的当前工作目录或临时文件目录下,创建具有与所述目标进程相同的所述用户标识和组标识的目标空文件;
向所述目标进程发送第一通知信号,所述第一通知信号用于触发所述目标进程在检测到存在所述目标空文件的情况下创建所述目标进程的套接字;
基于所述目标进程的套接字,与所述目标进程之间建立传输连接;
向所述目标进程发送加载指令,所述加载指令用于指示所述目标进程基于所述代理插件的文件,加载所述代理插件。
4.根据权利要求2所述的方法,其特征在于,所述向所述目标进程所在的容器复制所述代理插件的文件,包括:
将所述代理插件的文件复制到所述目标进程所在的容器的约定目录;
或者,
获取所述目标进程所在的容器的文件系统的差异目录,将所述代理插件的文件复制到所述差异目录中的约定子目录;
或者,
将所述代理插件的文件复制到所述目标进程的根目录。
5.根据权利要求1所述的方法,其特征在于,所述通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象,包括:
获取所述目标进程所在的网络命名空间,以及获取所述主机上安装的安全代理在所述网络命名空间下的第一侦听套接字;
通过所述第一侦听套接字,向所述代理插件的第二侦听套接字发送扫描指令;
通过所述代理插件对所述扫描指令进行解析,获取所述过滤规则;
通过所述代理插件从所述至少一个类对象中,排除不可修改的类对象,得到初筛后的类对象集合;
将所述初筛后的类对象集合中命中所述过滤规则的类对象,确定为所述候选类对象。
6.根据权利要求1所述的方法,其特征在于,所述通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,包括:
通过所述代理插件提取所述候选类对象的原始字节码;
通过所述代理插件对所述候选类对象的原始字节码进行反编译,得到所述候选类对象的反汇编代码序列;
通过所述代理插件对提取得到的所述候选类对象的基础特征和原始字节码,以及所述反汇编代码序列进行封装,得到所述候选类对象的类消息。
7.根据权利要求1所述的方法,其特征在于,所述对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象,包括:
利用内存马特征库对所述类消息进行内存马特征扫描,得到所述目标类对象;
其中,所述内存马特征库包含内存马的正则表达式格式的检测规则。
8.根据权利要求1-7任一项所述的方法,其特征在于,所述方法还包括:
在所述目标进程中存在变更或新增的类对象的情况下,通过所述代理插件获取所述变更或新增的类对象的类消息;
对所述变更或新增的类对象的类消息进行内存马特征扫描,得到所述变更或新增的类对象对应的检测结果。
9.根据权利要求1所述的方法,其特征在于,所述将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程之前,还包括:
获取所述主机上的进程列表;
根据进程的启动参数和启动方式,提取所述进程列表中各个进程分别对应的主类标识;
根据所述主类标识,确定至少一个所述目标进程。
10.根据权利要求9所述的方法,其特征在于,所述根据进程的启动参数和启动方式,提取所述进程列表中各个进程分别对应的主类标识,包括:
在所述进程的启动方式为执行类的情况下,从所述进程的内核命令行中解析获取所述进程对应的主类标识;
或者,
在所述进程的启动驱动方式为执行文件的情况下,从所述进程的内核命令行中解析获取被执行的文件,基于所述被执行的文件确定所述进程对应的主类标识。
11.根据权利要求1所述的方法,其特征在于,所述对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象之后,还包括:
基于所述目标类对象,构造内存马告警信息,所述内存马告警信息包括所述目标类对象的完整信息和所述目标类对象命中的检测规则;
将所述内存马告警信息上报至服务器,所述内存马告警信息用于通过所述服务器转发至前端页面进行展示。
12.根据权利要求1所述的方法,其特征在于,所述将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程之前,还包括:
在所述主机上安装的安全代理的网络命名空间,与所述目标进程的网络命名空间不同的情况下,通过所述安全代理内的线程切换到所述目标进程的网络命名空间;
在所述目标进程的网络命名空间下创建第一侦听套接字;
返回所述安全代理的网络命名空间;
所述将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程之后,还包括:
通过所述代理插件创建第二侦听套接字;
通过所述第一侦听套接字接收来自所述第二侦听套接字的周期性的心跳消息,所述心跳信息用于反映所述代理插件的运行状态。
13.一种内存马的检测装置,其特征在于,所述装置包括:
代理插件注入模块,用于将用于观测进程行为的代理插件,注入主机上待进行内存马检测的目标进程;
存量对象获取模块,用于通过所述代理插件获取所述目标进程已加载的至少一个类对象;
候选对象确定模块,用于通过所述代理插件根据过滤规则对所述至少一个类对象进行无风险项过滤,得到有风险的候选类对象;
类消息获取模块,用于通过所述代理插件对所述候选类对象进行类特征提取,得到所述候选类对象的类消息,所述类消息包括类对象的基础特征和代码特征,所述代码特征包括类对象的原始字节码和反汇编代码序列;
内存马确定模块,用于对所述类消息进行内存马特征扫描,得到被确定为内存马的目标类对象。
14.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器,所述存储器中存储有计算机程序,所述计算机程序由所述处理器加载并执行以实现如权利要求1至12任一项所述的内存马检测方法。
15.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,所述计算机程序由处理器加载并执行以实现如权利要求1至12任一项所述的内存马检测方法。
16.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机程序,所述计算机程序存储在计算机可读存储介质中,处理器从所述计算机可读存储介质读取并执行所述计算机程序,以实现如权利要求1至12任一项所述的内存马检测方法。
CN202211470807.2A 2022-11-23 2022-11-23 内存马的检测方法、装置、设备及存储介质 Pending CN115859280A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202211470807.2A CN115859280A (zh) 2022-11-23 2022-11-23 内存马的检测方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202211470807.2A CN115859280A (zh) 2022-11-23 2022-11-23 内存马的检测方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN115859280A true CN115859280A (zh) 2023-03-28

Family

ID=85665166

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202211470807.2A Pending CN115859280A (zh) 2022-11-23 2022-11-23 内存马的检测方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN115859280A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116668202A (zh) * 2023-08-02 2023-08-29 杭州默安科技有限公司 一种容器环境下内存马检测方法及系统

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116668202A (zh) * 2023-08-02 2023-08-29 杭州默安科技有限公司 一种容器环境下内存马检测方法及系统

Similar Documents

Publication Publication Date Title
US10552610B1 (en) Adaptive virtual machine snapshot update framework for malware behavioral analysis
US10481884B2 (en) Systems and methods for dynamically replacing code objects for code pushdown
US10223080B2 (en) Method and system for automated, static instrumentation for applications designed for execution in environments with restricted resources
US10216527B2 (en) Automated software configuration management
CN102254111B (zh) 恶意网站检测方法及装置
US8024721B2 (en) System and method for implementing a safe framework
CN103559447A (zh) 一种基于病毒样本特征的检测方法、检测装置及检测系统
US20230259358A1 (en) Documentation enforcement during compilation
CN111737140A (zh) 接口自动化测试方法、装置、设备及计算机可读存储介质
CN115859280A (zh) 内存马的检测方法、装置、设备及存储介质
US20080059949A1 (en) System and method for implementing a safe framework
US20160170739A1 (en) Alter application behaviour during runtime
CN108228266A (zh) 一种Android插件框架下不同插件间启动Fragment组件的方法和装置
CN111158777A (zh) 组件调用方法、装置及计算机可读存储介质
CN115544518A (zh) 漏洞扫描引擎实现方法、装置、漏洞扫描方法及电子设备
CN115729590A (zh) 服务部署方法、装置、设备和计算机可读存储介质
CN113031964B (zh) 一种大数据应用的管理方法、装置、设备及存储介质
CN115129348A (zh) 应用程序的资源更新方法、装置、设备及可读存储介质
CN114579194A (zh) 一种基于Spring远程调用的异常处理方法和系统
CN113535188A (zh) 私有化部署的方法和装置
US10223413B2 (en) Capturing components of an application using a static post-installation analysis of the system
CN111475783A (zh) 数据检测方法、系统及设备
CN116842530A (zh) 一种装置代码风险预警方法、软件系统和运算装置
CN116881926A (zh) 一种基于装置代码的风险扫描方法、系统和运算装置
CN116032809A (zh) 使用Wasm的网络协议分析方法及系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination