检测DLL劫持的机器学习模型
DLL劫持是一种常见攻击技术,攻击者用恶意库替换合法进程调用的库。这种技术被大规模恶意软件(如窃密程序和银行木马)以及APT组织和网络犯罪集团广泛使用。近年来,DLL劫持攻击数量显著增长。
准备工作
为了训练能够区分恶意和合法库加载的模型,我们首先需要定义一组高度指示DLL劫持的特征:
- 错误的库位置:恶意DLL通常位于异常位置,如调用它的可执行文件同一文件夹
- 错误的可执行文件位置:攻击者通常将可执行文件保存在非标准路径中
- 重命名的可执行文件:攻击者经常将合法应用程序保存为任意名称
- 库大小改变且不再签名
- 修改的库结构
训练样本和标注
训练样本使用了内部自动处理系统提供的动态库加载数据,这些系统每天处理数百万个文件,以及匿名遥测数据。
- 初始使用文件信誉数据,其余数据手动标注
- 按家族过滤恶意库,仅保留已知展示DLL劫持行为的库
- 使用经过分析师验证的前代模型结果训练后续模型
训练数据集包含数千万个对象,包括约2000万个清洁文件和约5万个明确恶意文件。
加载DLL:正常情况是怎样的?
我们使用"库名称+进程签名"组合来描述安全库加载事件。使用一组计数器来描述安全库加载事件,包括进程信息、库信息和事件属性。
加载DLL:如何描述劫持
某些特征组合强烈指示DLL劫持:
- 简单依赖:某些进程调用的清洁库始终位于单独文件夹中,而恶意库通常放在进程文件夹中
- 复杂依赖:需要满足多个条件,如进程重命名加上新名称首次出现在数据流中,且库位于非标准路径
模型演进
第一代模型
目标:证明机器学习可应用于检测DLL劫持 使用最广泛的术语解释,工作流程简单
第二代模型
使用经过第一代模型处理和分析师验证的数据 标注更精确,添加了更多描述库结构的特征
第三代模型
标记训练样本中的潜在不受欢迎应用程序 使用扩展标注,包含前两代的有用检测 通过one-hot编码扩展特征描述 添加基于数据流大小的所有特征归一化
模型比较
在测试数据集上评估模型演进:
- 第一代模型:在较高误报率(10⁻³或更高)下获得相对较好的结果(0.6或更高)
- 第二代模型:在10⁻⁵误报率下达到相同水平
- 第三代模型:在相同低误报率下产生0.8真阳性,被认为是良好结果
模型实际应用
所有三代模型都在内部系统中使用,用于检测遥测数据流中可能的DLL劫持案例。每天接收650万个安全事件,涉及80万个唯一文件。
模型还在单独的数据流上进行测试,以评估其随时间推移的有效性。平均而言,模型检测到70-80%的DLL劫持案例。
最近还将DLL劫持检测模型部署到卡巴斯基SIEM中,首先在卡巴斯基MDR服务中测试了该模型。
结论
基于三代模型的训练和应用,使用机器学习检测DLL劫持的实验是成功的。我们开发了能够区分类似DLL劫持事件与其他事件的模型,并将其改进到适合实际使用的状态,不仅在内部系统中使用,还在商业产品中应用。