由于 Web 应用程序的复杂性和重要性, 导致其成为网络攻击的主要目标之一。攻击者在入侵一个网站后, 通常会植入一个 Webshell, 来持久化控制网站。但随着攻防双方的博弈, 各种检测技术、终端安全产品被广泛应用, 使得传统的以文件形式驻留的 Webshell 越来越容易被检测到, 内存型 Webshell 成为新的趋势。本文面向 Java 应用程序, 总结内存型 Webshell 的特征和原理, 构建内存型Webshell 威胁模型, 定义了高对抗内存型 Webshell, 并提出一种基于RASP(Runtime application self-protection, 运行时应用程序自我保护)的动静态结合的高对抗内存型 Webshell 检测技术。实验表明, 与其他检测工具相比, 本文方法检测内存型 Webshell 效果最佳, 准确率为 96.45%, 性能消耗为 7.74%,具有可行性, 并且根据检测结果可以准确定位到内存型Webshell 的位置。
目录
2 相关工作
2.1 学术界 Webshell 检测方法
2.2 内存型 Webshell 检测产品
2.3 Java RASP 技术
2 相关工作
2.1 学术界 Webshell 检测方法
内存型 Webshell 是 Webshell 的一种, 学术界针对 Webshell 的检测方法有很多。从检测方式的角度分为静态检测和动态检测两类。从检测对象角度分为文本内容检测、流量检测、日志检测、行为特征检测、统计学检测等五类。如表 1 所示。静态检测是不执行样本而是通过获取的检测对象进行分析, 挖掘对象的特征, 包括文本内容特征、日志访问特征、统计学特性等, 并结合机器学习或深度学习技术进行检测。静态检测又分为基于文本内容的检测、基于日志的检测、基于统计学的检测等方法。
(1)基于文本内容的检测直接针对源代码进行特征工程, 通过提取词法、语法、语义等特征检测 Webshell。该方法对已知的 Webshell 检测准确率高, 快速方便, 部署简单, 但只能检测已知特征的Webshell, 漏报率、误报率高。
(2)基于日志的检测是针对 Webshell 访问网站后在 Web 日志中留下的页面访问数据, 通过对大量的日志文件建立请求模型从而检测出异常文件。该方法产生大量日志, 存在漏报,且具有一定滞后性。
(3)基于统计学的检测是通过一些统计值来区分正常文件与恶意 Webshell。重心在于识别混淆代码, 对未经模糊处理的代码检测机制较为透明, 误报漏报多。
Webshell 传到服务器后, 攻击者总要去执行它,动态检测是根据 Webshell 执行时刻表现出来的行为模式、网络特性等进行检测。动态检测又分为基于流量的检测、基于行为的检测。(1)基于流量的检测对通信过程中Payload流量表现出的异常特征进行提取并分析, 从而实时检测网站变化。该方法部署成本高, 无法检测加密流量内容。(2)基于行为的检测是针对脚本在系统环境中的解析过程进行分析, 通常带有命令执行、文件操作和数据库操作等行为特征, 从而检测异常行为。该检测方法准确率相对较高, 但资源消耗较大, 检测效率较低。
目前学术界对内存型 Webshell 检测的研究极少,已有的检测方法无法适用于内存型 Webshell。
2.2 内存型 Webshell 检测产品
攻防演练的热度升级备受工业界的关注, 许多工业界与时俱进地在产品中增加内存型 Webshell 的防御功能。
边界无限的靖云甲·RASP 作为一款网络攻防产品 , 能够对内存型 Webshell 进行防御, 以 Java 为例, 该功能是通过RASP在程序内部获取API接口信息, 利用 Agent 周期性地对 JVM 内存中的 API 进行风险筛查, 然后上报存在风险的类。但是该方法存在一定滞后性, 不能实时检测内存型 Webshell 的注入及存在。
微步在线的 OneEDR 是一款针对主机的入侵检测与响应的终端安全防护平台, 利用 Agent 在终端收集系统行为日志, 并结合威胁情报, 实现对主机的入侵发现与响应。针对无文件攻击方式的频繁出现, OneEDR 集成了针对 Java 平台的内存型Webshell 检测功能。针对 Agent 类内存型 Webshell,OneEDR 同样利用 Java Agent 技术对运行的 JVM 进行检测, 针对可疑高危的 Class 再做进一步检测。OneEDR 也没有对用户实时的请求进行内存型Webshell 的检测。
河马是一款专注于 Webshell 查杀的检测工具,拥有海量的 Webshell 样本及自主查杀的技术, 采用传统特征, 并结合深度检测、机器学习、云端大数据多引擎检测技术。河马 1.0 内测版本开始支持内存型Webshell 的检测, 逐渐增加对冰蝎、哥斯拉内存型Webshell 的检测功能。河马对内存型 Webshell 的检测也依赖于Java Agent技术, 将检测代码注入到Web服务的 Java 进程中对其进行恶意代码检测。河马目前还未发布官方版的内存型 Webshell 检测工具。工业界针对内存型 Webshell 的检测产品虽然响应较快, 但还处于起步阶段, 检测方案并不全面, 还在持续优化过程中, 并且大多数产品没有开源。
2.3 Java RASP 技术
RASP是一种注入到应用程序内部或应用程序运行时环境的安全技术, 与应用程序融为一体,能够实时检测和阻断攻击。与传统的 WAF(Web Ap-plication Firewall)技术相比, RASP 技术准确性更高,
更可靠。WAF 是基于模式匹配并仅对所有输入流量进行检测, 而 RASP 是在发生攻击的关键节点处同时关注输入和输出, 能够根据数据流分析输入在应用程序内部的行为, 从而精准拦截攻击。RASP 技术已在 Web 安全及漏洞检测领域被广泛应用, 例如在Web 安全检测 、脚本注入安全、Web 框架漏洞检测、智能合约漏洞防护等方面得到了有效解决方案。
对 Java 而言, RASP 技术是通过 Java Agent 方式实现的。Java Agent 允许 JVM 在加载 class 文件之前,对其字节码进行修改, 通过在程序启动前注入 RASP逻辑; 同时也支持对已加载的 class 文件进行重新加载, 通过 attach 方式在程序运行时附加 Agent, 动态注入 RASP 逻辑。
Java RASP 的技术实现主要依赖于 JVMTI(JVMTool Interface)、Instrumentation(Java Agent API)、字节码操作框架等。
JVMTI 是一套由 Java 虚拟机提供的本地编程接口集合, 可以提供 JVM 相关工具开发的接口, 可以
对虚拟机内部状态进行监测、分析, 并能控制 JVM应用程序的执行。JVMTI 的原理是在 JVM 内部的一些事件上进行了埋点, 外部程序通过实现一个JVMTI Agent, 并将 Agent 注册到 JVM 中, 当事件被触发时, JVM 会回调 Agent 的方法来实现用户逻辑。并非所有 JVM 都支持 JVMTI, 但一些主流虚拟机如Sun、IBM 等都提供了 JVMTI 实现。但是基于 JVMTI的开发是通过C/C++语言编写的Agent来实现的, 对于 Java 开发人员不太友好。
JDK 1.5 开始, Java 引入了 Instrumentation 机制。Instrumentation 是由 Java 提供的监测运行在 JVM 程序的 API, 可以基于 Java 编写 Agent 来监控或操作JVM。Instrumentation 的底层实现是依赖于 JVMTI。Instrumentation可以实现在已有的类上修改或插入额外的字节码来增强类的逻辑, 但这些实现不会改变原程序的状态或行为。Instrumentation 提供两种方式注入Agent(即RASP逻辑), 一种是premain模式在主程序运行前注入, 另一种是 agentmain 模式, 在主程序运行时注入。
Java RASP 除了依赖 JVMTI 和 Instrumentation来完成Java Agent的编写外, 还需要利用字节码操作框架来完成相应的 Hook 操作, 即对已经是字节码的class 文件进行操作, 主要有两种工具, ASM 和66 Journal of Cyber Security 信息安全学报, 2022 年 11 月, 第 7 卷, 第 6 期Javassist。ASM 字节码操作框架, 主要是在指令层面上操作字节码, 门槛高, 但体积小速度快, 性能好。Javassist 重点在源代码层面上操作字节码, 提供了源代码级 API 对字节码操作, 相比 ASM 操作简单, 但执行效率慢。