文章总结: 本文介绍了使用机器学习技术检测DLL劫持攻击的方法。文章首先定义了DLL劫持的关键特征集,包括异常库位置、异常可执行文件位置等。通过三轮迭代的训练样本标注和模型优化,最终开发出第三代检测模型,该模型在误报率为10⁻⁵时,准确命中率可达0.8。系统能每天处理约650万条安全事件,模型输出的结果会根据置信度排序,交由分析人员审查。
综合评分: 87
文章分类: 二进制安全,AI安全,恶意软件,威胁情报,漏洞分析
训练大模型检测Dll劫持
二进制空间安全
2025年10月23日 10:43
北京
将二进制空间安全设为”星标⭐️”
第一时间收到文章更新
#
技术背景
DLL劫持是一种常见攻击技术: 攻击者用恶意库替换合法进程调用的库。无论是窃密软件、网银木马等大规模传播恶意软件的制作者,还是实施定向攻击的APT组织及网络犯罪集团,均会使用该技术。近年来,DLL劫持攻击数量显著增长。
检测DLL劫持攻击并不是一件简单的事情,由于恶意库在合法进程的受信任地址空间内执行, 因此对于安全方案而言, 该行为本身是一个正常的进程在运行。如果将精力全部放在可信进程将会大量消耗系统整体性能, 必须在安全性与便捷性之间进行权衡。
为确认能否训练出区分恶意与白名单库加载的模型, 首先需要明确定义DLL劫持的关键特征集:
- 异常库位置。标准库通常位于标准目录,而恶意DLL常出现在非常规位置, 比如与调用它的可执行文件处在相同目录。
- 异常可执行文件位置。攻击者常将可执行文件保存在非标准路径, 例如临时目录或用户文件夹。
- 重命名可执行文件。为规避检测,攻击者常将合法应用程序任意改名保存。
- 库文件大小改变且失去数字签名。
- 修改库结构。
训练样本和标注
在训练样本方面,这里采用了内部自动处理系统提供的动态库加载数据, 这些系统每日处理数百万文件, 同时结合了经匿名化处理的生产环境数据。
训练样本标注工作历经三轮迭代。在最初的工作中,由于无法直接从样本分析人员那里自动获取判定事件是否为DLL劫持攻击的标签, 因此决定选择使用数据库中具有包含文件可信度评分的数据,其他数据则进行人工标注。这里将确定进程为合法,DLL为恶意的库调用事件标注为DLL劫持, 但这种标注方式存在局限, 比如像”svchost”这样的进程本身就被设计用于加载多种库文件,导致基于此数据训练的模型误报率过高, 无法满足实际应用需求。
在第二轮迭代中,采用的方法是按恶意软件家族进行过滤,仅保留已知具有DLL劫持行为的样本。基于优化数据训练的模型准确率显著提升,有效验证了”机器学习可用于检测此类攻击”的假设。此时的训练数据集已包含数千万对象,其中约2000万白名单文件和50000个已确认的恶意文件。
定义DLL加载白名单库
面对海量带标注的进程库加载事件样本,如何界定白名单库?若采用”进程名+库名”组合方案,无法应对进程重命名情形(普通用户也可能重命名进程)。若改用进程哈希值替代进程名,虽然解决了重命名问题,但会导致同一库的不同版本被视作独立库。最终确定采用”库名+进程数字签名”组合方案。该方案将同一厂商所有同名库视作整体,能呈现相对符合现实的态势。
为描述安全库加载事件,这里采用了一套计数器组合:包含进程相关信息, 例如:特定哈希值文件对应进程名的出现频率、特定文件路径的出现频率等、库相关信息, 例如:该库特定路径的出现频率、合法启动百分比等以及事件属性,例如:库文件是否与调用者处于同一目录。
最终构建出一个包含多重聚合指标(计数器集合与键值组合)的系统,可全面描述输入事件。这些聚合指标可包含单一键值,例如:DLL哈希值或复合键值, 例如:进程哈希值+进程数字签名。基于这些聚合指标, 可提取描述库加载事件的特征集。下图展示了特征提取的示例流程:
#
定义DLL加载劫持行为
某些特征组合能强命中为DLL劫持。这些特征可能呈现简单关联:部分合法进程调用的白名单库始终存放在独立文件夹,而恶意库则常位于进程所在目录。
更复杂的特征关联需满足多重条件。例如进程重命名本身不能直接判定为DLL劫持,但若新进程名首次出现在数据流中且加载的库位于非标准路径,则极可能为恶意行为。
#
检测模型演进历程
该检测模型共训练了三代。第一代模型主要验证机器学习技术应用于DLL劫持检测的可行性,训练时对该术语采用了最宽泛的定义。其工作流程极为简化:
- 从数据流提取关键集的频次描述
- 获取不同时间段的同源数据流并提取特征集
- 将合法进程加载特定家族恶意库的事件标记为DLL劫持
- 基于最终数据完成模型训练
第二代模型采用经第一代模型预处理并由分析师核验的数据, 其标注精度显著提升。其中新增了库结构描述特征,并优化了库加载的工作流程描述。
基于第二代模型的结果,发现并总结出几类常见的误报类型。 例如,在训练样本中包含了一些潜在的有害应用程序。这类程序在某些情况下会表现出与 DLL 劫持相似的行为,但它们并非恶意程序,也很少真正属于这种攻击类型。
在第三代模型中,针对这些问题进行了修正:首先,在分析人员的协助下,在训练样本中对这些潜在有害应用进行了标记,使模型在检测时不会再将它们误判为 DLL 劫持。 其次,在新版本中,扩展了标注体系,将第一代和第二代模型中的有效检测结果一并纳入,以提升模型的综合判断能力。 此外,通过独热编码(one-hot encoding)的方式对某些字段进行了特征扩展,将类别型特征转换为二进制表示,以便模型更好地理解。 最后,由于模型处理的事件数量随时间不断增加,这一版本还引入了基于数据流规模的特征归一化(normalization),确保不同批次数据在统计分布上保持一致性。
模型迭代过程中准确命中率持续提升。第一代模型在误报率为10⁻³或更高的前提下, 才能取得较好结果(0.6或以上),第二代模型在误报率降至10⁻⁵时即可达到相同水平,而第三代模型在同等误报率下, 准确命中率提升至0.8,这是一个比较理想的结果。
在固定评分下对数据流中的模型进行评估显示, 被标记为 DLL 劫持的新事件数量在各代模型之间逐步增加。与此同时,通过误判率来评估模型也有助于跟踪其进展:第一代模型的误报率相对较高,而第二代和第三代模型的误报率则显著降低。
在内部系统中同时使用这三代模型,用于检测遥测数据流中可能存在的DLL 劫持行为。系统每天接收约650 万条安全事件,涉及约80 万个独立文件。这些样本会在指定的时间间隔内进行聚合处理,并经过数据丰富化(enrichment),随后被输入到模型中进行分析。
模型输出的结果会根据不同的模型版本以及该事件被判定为 DLL 劫持的概率值进行排序,然后交由分析人员审查。 例如,如果第三代模型以较高的置信度将某个事件标记为 DLL 劫持,那么这一事件将被优先调查;而第一代模型给出置信度较低的判定结果,则可以最后再进行核查。
与此同时,我们还会在一条模型从未见过的独立数据流上对其进行测试,以评估模型在长期运行中的有效性。因为随着时间推移,模型的检测性能可能会出现一定程度的衰减。 下图显示,虽然模型的正确检测率在不同时间段会略有波动,但总体而言,这三代模型平均能够检测出70%至80%的DLL劫持事件。
#
(全文完)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:二进制空间安全 《训练大模型检测Dll劫持》