前言
Java技术栈漏洞目前业已是web安全领域的主流战场,随着IPS、RASP等防御系统的更新迭代,Java攻防交战阵地已经从磁盘升级到了内存里面。
内存马防检测
随着攻防热度的升级,内存马注入现在已经发展成为一个常用的攻击技术。目前业界的内存马主要分为两大类:
•Agent型
利用instrument机制,在不增加新类和新方法的情况下,对现有类的执行逻辑进行修改。JVM层注入,通用性强。•非Agent型
通过新增一些Java web组件(如Servlet、Filter、Listener、Controller等)来实现拦截请求,从而注入木马代码,对目标容器环境有较强的依赖性,通用性较弱。
由于内存马技术的火热,内存马的检测也如火如荼,针对内存马的检测,目前业界主要有两种方法:
•基于反射的检测方法
该方法是一种轻量级的检测方法,不需要注入Java进程,主要用于检测非Agent型的内存马,由于非Agent型的内存马会在Java层新增多个类和对象,并且会修改一些已有的数组,因此通过反射的方法即可检测,但是这种方法无法检测Agent型内存马。
•基于instrument机制的检测方法
该方法是一种通用的重量级检测方法,需要将检测逻辑通过attach API注入Java进程,理论上可以检测出所有类型的内存马。当然instrument不仅能用于内存马检测,java.lang.instrument是Java 1.5引入的一种可以通过修改字节码对Java程序进行监测的一种机制,这种机制广泛应用于各种Java性能检测框架、程序调试框架,如JProfiler、IntelliJ IDE等,当然近几年比较流行的RASP也是基于此类技术。
Instrument原理
native层面分析。首先,我们先分析一下attach的工作流程,该流程主如下图:
1.检测工具作为Client,根据指定的PID,向目标JVM发起attach请求;2.JVM收到请求后,做一些校验,校验通过后,会打开一个IPC通道。3.接下来Client会封装一个名为AttachOperation的C++对象,发送给Server端;4.Server端会把Client发过来的AttachOperation对象放入一个队列;5.Server端另外一个线程会从队列中取出AttachOperation对象并解析,然后执行对应的操作,并把执行结果通过IPC通道返回Client。
6.如果收到的load 操作对象,将读取 agent.jar 文件
native 层面代码执行完成,进入到 java层面(RASP可以大展身手的层面)。JVM会实例化一个InstrumentationImpl类,并反射调用agent中的premain/agentmain 方法。JVM 调用 loadAgent 加载磁盘上的agent jar。参数 path 是agent jar包路径。 最终调用了 native 方法 loadAgent0。
agent 加载成功之后,反射调用 agentmain/premain 方法,agent 代码被执行。代码如下:
反射获取 premain.class 并获取premain/agentmain方法:
方法反射执行,agent初始化。
自此,我们搞清楚了 agent 的初始化链路,只需要在链路上增加检测点即可。这个检测点能够拿到jvm加载的agent参数信息。
一般企业内部会有多个agent ,比如arthas、skysalking等,将这些常用的agent加入白名单即可。不在白名单的 agent 直接阻断。
检测点如下:
sun.instrument.InstrumentationImpl.loadClassAndStartAgent
编写 agent 检测插件
插件编译打包之后,上传到管理端,配置下发到指定机器即可。尝试 attach 到JVM加载agent 被阻断,agent 加载失败。
官网:http://www.jrasp.com
github:https://github.com/jvm-rasp/jrasp-agent
加入技术交流群请添加微信:sear2022
原文始发于微信公众号(RASP安全技术):RASP 如何检测Java Agent 内存马
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论