戳上面的蓝字关注我吧!
最近在读《信息安全学报》的时候,发现在22年11月份发布的刊文中有一篇《面向Java的高对抗内存型Webshell检测技术》[1],由中国科学信息工程研究所单位所发布的刊文,第一作者是张金莉。
论文介绍中说明了张金莉等人提出的研究方向和技术的可行性。
针对用户请求, 基于 RASP 技术监测注册组件类函数和特权类函数, 获取上下文信息, 根据磁盘是否存在文件以及数据流分析技术进行动态特征检测, 在不影响应用程序正常运行的前提下, 实时地检测; 针对 JVM 中加载的类及对动态检测方法的补充, 研究基于文本特征的深度学习静态检测算法, 提升高对抗内存型 Webshell 的检测效率。
因此想借助该篇论文学习相关知识思想,同时在学习过程中记录自己所学到的技术和思路,并归纳总结到该篇笔记文章中。
本文说是学习笔记,但携带了很多笔者本人的主观思想和着重点,因认知有限,只能秉着研究学习的态度好好读读,希望也能帮到在做科研或者网安产品的一线人员。
从论文引用中介绍的那样,攻防对抗中最多的攻击行为就是使用漏洞攻破系统后上传WebShell以维持权限,同时还提到了目前流行的检测方法:文本检测、行为特征分析、流量检测、日志检测、统计学检测等方法。
同时在前言中提出了论文的主要贡献:
-
分析内存马不同阶段的行为特征,构建出内存马WebShell的威胁模型,并提出一种高对抗型WebShell。
-
提出了一种RASP技术和数据流分析的动态行为检测方法。
-
提出一种基于文本特征的深度学习静态检测算法,与动态方法相结合,提高检测效率。
-
设计多组实验,验证方案的实际可行性。
而相关工作的开展可以从检测方法中的静态检测和动态检测入手,又可以按检测对象,如:文本内容检测、流量检测、日志检测等进行切入。
文中给出的表总结了前人的研究经验和不足之处
在文中的2.2小节中介绍了内存型WebShell检测产品
首先说了边界无限的靖云甲RASP[2],是通过在程序内部获取API接口信息,笔者认为这些接口就是Controller、WebSocket、gRPC等请求方法入口。靖云甲RASP会周期性的检测API中的风险,是否存在恶意的方法接口对外暴露。
其次就介绍了微步在线的OneEDR[3],是一款针对主机入侵检测的终端安全防护平台,其检测原理是通过Agent在终端收集日志信息并结合威胁情报进行判断,同时也支持了Java Agent的方式检测JVM中恶意类。
河马[4]是一款专注WebShell检测工具,有着海量的样本和自主查杀技术,通过强大的数据支持来判断WebShell的特征。
之后作者介绍了RASP理念和JavaAgent的原理以及专业术语,想着这是笔记,便不再提供篇幅,但如果想尝试投稿论文的研究者,可以借鉴一下这里,也能方便知道论文大致结构应该如何写,也算有帮助。
开头象征性的介绍了内存WebShell的原理,将内存马进行分类定性,这是论文必要的。之后就是将问题形式化定义,这里的知识点就很多了。
对于WebShell,将其定义成了输入源、触发器、攻击载荷、特权状态4个组件。
如下图的后门模型:
并且给出这样一套量化工程
θ = (S, i, e, t, Σ, p), i∈S 且 e∈S
再看看公式中各个字符分别代表什么
S => 目标程序的全部有限状态集合
I => 输入源集合,即初始状态集合 I⊆S(I是S的子集)
E => 内存型 WebShell 触发后到达的特权状态集合,E⊆S
t => 状态转移函数,也是触发器,有t(I,c) = S
c => 状态转移条件
Σ => 表示后门触发条件
p => 攻击载荷,表示为达到特权状态而采用的有效代码
n => 后门没有被触发时的正常转移状态,n∈S。
i => 输入源,是 I 中的某个元素
e => evil state,是 E 中的某个元素
当存在 i∈I, c=Σ, e∈E, 且攻击载荷 p 被执行, 使得 t(i, Σ) = e 时, 表示后门被触发, 存在内存型 Webshell。
输入源集合 I 包括但不限于:
-
JavaWeb 组件。如: Servlet、Filter、Listener 等。
-
Java 容器组件, 如:Tomcat、Valve 组件、 Weblogic 的组件。
-
Java 框架组件, 如: Spring、SpringBoot, 类似 Spring 框架的 Controller 组件。
-
二进制等第三方组件, 如: Java Agent 类型的内存马。
内存马触发器集合 t 包括但不限于:
-
反序列化漏洞
-
文件上传漏洞
-
RCE 漏洞
内存马特权状态集合 E 包括但不限于:
-
命令执行
-
操作文件读写
-
读取数据库信息
在论文中给出了具体实现高对抗WebShell检测的组织架构
检测程序主体上可以分为动态和静态检测算法进行,动态检测算法中通过RASP的优点动态获取程序上下文信息和注册的API信息,并通过判断对应是否有Class文件落地、数据流分析动态特征检测、黑白名单过滤;而静态检测算法可以通过读取所有加载进JVM中的类,通过特征筛选出高危的类,并使用ResNet50的深度学习网络分类模型进行文本特征检测。如果在动态检测中,检测出有defineClass函数或非JS场景的组件类,就丢给静态检测算法分析。最后再通过告警方式上报至管理员。
后续论文中就介绍了有哪些常见的注册组件类函数和特权类函数集合,例举了一些内存马注册的过程。
程序中给出了第一个算法伪代码,原本的伪代码我阅读了下,转换成贴近Java的伪代码展示出来
/*
* INPUT:请求上下文 reqContext、注册组件类函数上下文 compContext、特权类函数上下文 priContext、黑白名单列表 list
* OUTPUT:判定结果 result
*/
class DynamicCheckAlgorithm{
public static boolean Check(reqContext,compContext,priContext,list){
if(isEmpty(reqContext)){return}
if(isEmpty(compContext)){return}
newCompClass = getNewCompClass(); //获取新增组件类
if(ClassLoader.getResource(newCompClass) == JSP_FILE){
RETURN true, result(Webshell)
}else if(ClassLoader.getResource(newCompClass) == null){ //没有获取到类文件
RETURN true, result(Webshell)
}else{
riskClasses.add(newCompClass); //newCompClass 标记为 riskClasses
}
staticFeature(riskClasses); //静态特征检测
if(isEmpty(priContext)){return}
Obejct parameter = priContext.parameter; //获取调用参数
Obejct callStack = priContext.callStack; //获取上下文的调用栈
if(list.MATCH(parameter)){ // parameter MATCH list
if(newCompClass.Contains(callStack)){ //callStack Contains newCompClass
RETURN true, result(Webshell)
}else{
RETURN true, result(Other)
}
}else{
RETURN false
}
}
}
由于静态特征检测需要读取JVM中所有加载的类,如果都分析一遍会导致性能大受影响,因此作者提出的方法是针对常见的修改特征进行筛选,分别从类名、父类、接口、ClassLoader加载器、注解五个方向。
/*
* INPUT:JVM 加载类 classes、defineClass 的字节码文件 bytecode
* OUTPUT:判定结果 result
*/
class StaticCheckAlgorithm{
public static boolean Check(){
jvmClasses = GetJVMAllClass(); //Get JVM all classes
for(Class cls : jvmClasses){
if(featureFilter(cls)){ //特征过滤
riskClasses.add(cls); //标记为高危类
}
}
for(Class cls : riskClasses){
result = f(cls); //模型检测
}
if(!isEmpty(bytecode)){
result = f(cls); //模型检测
}
return result;
}
}
这里的模型检测方法f()就是用灰度图进行模型训练和测试的深度检测模型,输出的结果是WebShell样本还是白样本。还有算法中的特征过滤方法featureFilter(),论文中给出了一部分高危类的完全限定名:
之后的告警装置是通过SimpleEmail[5]的邮件方式上报,并对存在危险的操作进行拦截跳转到自定义页面。
从准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1值(F1-score)四个指标进行评估
如果论文中给出的测试结果准确,所提出的检测算法确实能大幅度提升检测WebShell的精确程度
而运行的所占的性能消耗也是OpenRASP的3/10
所提出的这种动静结合的方式去检测能够提升安全产品的能力,并有静态模型辅助检测,从各个方面限制住WebShell的执行。如果把该能力添加到RASP中,可以大大提高RASP在攻防应用中的地位。
最后作者在展望中指出,检测方法还可以从完善JavaWeb恶意类、对漏洞处增加检测点、提升内存型WebShell在注入时的检测效率、支持其他语言种类等方面突破。
笔者在读该论文的时候,思考如果想落地该套实现方法,则需要依赖模型的训练和对输入源、触发器、攻击载荷、特权状态4个组件的规则库支撑。
[1]张金莉,陈星辰,王晓蕾,陈庆旺,代峰,李香龙,冯云,崔翔.面向Java的高对抗内存型Webshell检测技术[J].信息安全学报,2022,7(06):62-79.DOI:10.19363/J.cnki.cn10-1380/tn.2022.11.04.
[2]边界无限三周年 | 极客精神 不断挑战 做网安行业的弄潮儿.边界无限. https://mp.weixin.qq.com/s/sVLtfioGaG1bLFvaQ1-slQ. May. 2022.
[3]饱受无文件攻击之苦?一文详解内存马攻击防范关键点.https://mp.weixin.qq.com/s/qUqrHzJmAfodVA1Y6xbucg. May. 2022.
[4]SHELLPUB.COM 专注查杀. 河马. https://www.shellpub.com.
[5]Class SimpleEmail. Apache. https://commons.apache.org/proper/commons-email/apidocs/org/apache/commons/mail/SimpleEmail.html
原文始发于微信公众号(小陈的Life):高对抗内存型WebShell检测技术学习笔记