根据赛门铁克在2019年发布的互联网安全报告[1]来看, “Living off the land, Lotl”的攻击技术存在上升的趋势, 已然成为目前网络安全威胁中的主流模式. 此外根据该报告所述的情况, 这种类型的攻击在2018年飙升了78%. 报告中还提到2018年发现的4个新的威胁群体中, 有两个是使用Lotl技术被发现的. 近些年来越来越多的威胁群体喜欢使用这类技术[1]. Lotl技术将其活动隐藏在合法的系统进程中, 让攻击者保持足够的隐匿, 例如大量使用PowerShell、Cmd等工具. 这些程序作为系统工具存在, 其本身并不具有主动攻击性, 攻击者利用其两面性来进行威胁. 2017年Petya的变种勒索软件大规模袭击世界各国组织. 其利用的漏洞与勒索软件WannaCry利用的漏洞相同, 区别是Petya通过使用Windows管理工具WMI、命令行等工具远程执行一系列系统级的命令来实现相关功能[2]. 在此过程中攻击者使用系统工具执行既定策略达到目的, 将恶意行为隐藏在系统活动中逃避了现有安全产品的检测. 虽然这些行为不会被安全产品探测到, 却被系统日志记录了起来. 研究从主机日志提取恶意行为的模型对现有安全问题极具现实意义.
1 引言虽然分析用户系统日志中的威胁和入侵不是新的趋势, 却是入侵检测中研究最多的领域之一. 现阶段针对主机日志中的恶意行为研究主要集中在以下的几种研究方向. 研究方向一是通过构造检测规则或使用启发式的算法来检测日志数据. 近年来MIRTE公司推出了ATT & CK模型, 其目标是创建网络攻击中已知的攻击策略、战术与技术的详尽列表, 对每一种战术的意义影响、利用方式以及检测数据来源做了详尽阐述 [3]. 研究人员可以根据该框架的知识制定每种技术的检测规则[4]. 文献[5]中利用检测规则提取出日志中的恶意活动, 映射到攻击策略, 抽象出策略层的场景图. 使用祖先节点覆盖的概念来评估节点之间依赖强度, 实现了不同攻击技术之间的关联, 进而提取出其中的攻击序列. 文献[6]中利用系统日志构建起源图, 使用规则检测出攻击的及其所处阶段, 通过信息流之间的相关性, 在图中将恶意事件关联成攻击路径.
上述文献中基于规则来发现多步攻击的研究, 检测精度高, 误报率低, 但基于规则的检测对于未知威胁的检测能力受限. 因此, 主机日志中的恶意行为研究方向二, 对事件日志压缩找出其中攻击序列. 文献[7]通过对系统日志进行压缩, 删除其中未对系统造成持久影响的事件, 例如进程运行时产生的没有被其他进程访问的临时文件, 提取出日志中的重要行为. 文献[8]进一步提出动态污点分析的日志压缩方案, 通过追踪污点在主机中的扩散, 将此过程中的调用保存下来达到压缩目的, 分析后可得到恶意行为[9].
研究方向三: 有研究人员将机器学习与日志分析结合, 利用机器学习强大的分类能力寻找日志中潜在的恶意模式. 文献[10]中利用逻辑回归等机器学习算法给日志社区中的恶意行为提取特征, 通过社区检测算法发现日志中的恶意社区, 完成攻击序列的发现. 机器学习的研究方法拥有对异常威胁模式强大的发现能力, 对于新型威胁有更好的检测能力.
综上机器学习方法的优势, 本文利用机器学习在Sysmon[11]日志的基础上提出一种基于来源图的框架, 关注日志中事件行为. 将多种事件日志统一提取解析[10], 具体提取内容第2节所述. 以进程为实体建立无向图, 结合图中进程与文件操作等事件, 使用分类效果更好的XGBoost算法进行有监督分类, 预测恶意事件概率值作为图中边的权重, 进而得到一个无向加权图, 使用社区发现算法找出其中的恶意攻击社区[12-14]. 最后在MIRTE ATT & CK提供的评估数据集 [15,16]上进行验证. 实验显示使用XGBoost结合社区发现的模型, 检测结果更稳定, 效果更好, 具体实验如下文详述.
2 攻击行为检测模型对于Lotl类型的攻击行为, 其使用的是就地取材式的战术策略, 传统以恶意文件为载体的安全检测不再奏效, 因此研究的重点应转移到攻击行为上来. 对于每一条日志来讲, 其记录的是单一的动作行为或事件信息. 为了关注攻击行为的上下文关系, 我们使用基于图的模型来表达这种关系. 所以日志中提取的事件数据以图的数据模型进行存储, 其示意图如图1所示.
节点(node): 正在建模的日志对象实体(例如: 进程名、文件名等);
边(edge): 对象实体之间关系特征向量(例如: 父子进程、文件操作等);
元数据(matedata): 节点、边的特性或参数(例如: 进程ID、命令行、哈希值等).
2.1 日志解析与关联整个算法模型的基础是日志中事件数据建立的社区网络图, 之后的边权重分配与社区发现也是在此基础上对数据进行处理. Sysmon作为一款微软官方提供的日志工具[11], 监控系统的动态行为, 生成事件日志. 从Sysmon日志数据中解析出图中节点所需字段如表1所示. 主要包括进程创建(process creation)、进程终止(process termination)、文件创建(file create)与删除(file delete)等事件记录. 在所有事件的类型中又可以划分为关联事件与信息事件, 其中的关联事件是指提供两个实体之间联系的事件, 主要包括内容如表2所示.
表2的关联事件中Event ID1与Event ID 11的日志格式如图2所示, 更多类型日志详细格式可查阅官方文档[11]. 其中Event ID 1记录的是进程创建事件, 主要的日志字段包括进程ID (ProcessGuid)、父进程ID (ParentProcessGuid)、创建时间戳(UtcTime)、进程映像(Image)、父进程映像(ParentImage)、进程原始文件名(OriginalFileName)、命令行(CommandLine)以及进程哈希值(Hashes)等字段; EventID 11跟踪的是文件创建事件, 其主要字段包括进程ID (ProcessGuid)和目标文件名(TargetFilename)等.
根据表2中列出的关联事件日志类型及其关联字段, 将表2中的关联事件提取出统一的日志实体格式, 模型以ProcessGuid字段作为日志实体的节点字段, 其他提取的相关日志字段作为该节点的元数据. 提取出如表1的预定义日志实体字段及该字段的来源.
多类型的日志格式经过统一提取后, 形成表1所示日志实体格式, 此时的日志实体集合作为无向图
日志解析之后通过观察节点集合V中任意两个日志实体
关于表3中实体间的关系向量, f0和f19表示事件时间关系, 实体a、b之间的时间差是否小于间隔Δ, 是则该项为1, 否则为0. f1–f4项表示实体a和b之间的进程关系, 以f1、f2为例, 当实体a的ProcessGuid等于实体b的ProcessGuid, 说明两个实体属于同一个进程, f2表示实体a、b属于同一个父进程创建的兄弟进程, 如果成立该项为1, 否则为0; 同理f5表示两个日志实体是否来自同一主机; f6–f9表示实体中进程映像的关系; f10–f13表示两个实体之间进程命令的关系; f14表示进程实体的原始文件名, 该项可以检测进程重命名情况; f15表示当前日志实体所在路径, 对于恶意活动中的文件扫描行为, 提取文件操作之间的关系; f16表示实体间的哈希值是否一致; f17、f18表示文件创建过程中路径与文件名的关系.
经过上述过程的关联, 我们将实体集合V中的任意两个实体间关系提出, 作为两个实体
${G_0} = (V,E)$ | (1) |
其中,
$E \subseteq \left\{ {\left\{ {a,b} \right\}:(a,b) \in {V^2},a \ne b} \right\}$ | (2) |
2.2 恶意社区发现
日志解析之后生成了事件关联图
社区检测Louvain算法[17]适用于大规模网络结构中快速发现其中的社区模块. 该算法社区发现效果较好, 复杂度较低和计算速度更快. Louvain算法本身是一种基于模块度的社区发现算法. 其中模块度的概念由Newman[18]提出, 作为一种在复杂网络图中评估社区划分情况的数学指标, 其定义为式(3):
$Q = \frac{1}{{2m}}\sum\limits_{i,j} {\left[ {{A_{ij}} - \frac{{{k_i}{k_j}}}{{2m}}} \right]\delta ({c_i},{c_j})} $ | (3) |
其中,
$Q = \displaystyle\sum\limits_c {\left[ {\frac{{\Sigma_{\rm in} }}{{2m}} - {{\left( {\frac{{\Sigma_{\rm tot} }}{{2m}}} \right)}^2}} \right]} $ | (4) |
算法过程主要分为两个阶段: 首先算法初始化认为网络中每个节点都是一个独立的模块. 在第一阶段的迭代过程中, 对于每一个顶点i, 将其依次分配到相邻顶点j, 计算式(5)所示的分配前后模块度变化
$ \Delta Q = \left[ {\frac{{\Sigma_{\rm in} + {k_{i,{\rm{in}}}}}}{{2m}} - {{\left( {\frac{{\Sigma_{\rm tot} + {k_i}}}{{2m}}} \right)}^2}} \right]- \left[ {\frac{{\Sigma_{\rm in} }}{{2m}} - {{\left( {\frac{{\Sigma_{\rm tot} }}{{2m}}} \right)}^2} - {{\left( {\frac{{{k_i}}}{{2m}}} \right)}^2}} \right]$ | (5) |
算法的第二阶段迭代之前, 先将第一阶段中的子社区整体看作一个超节点, 该社区内的节点到其他社区内节点的连接看作为超节点的边. 由此创建出新的图后, 将算法第一阶段应用于新图. 直到整个图的模块度不再发生变化后, 算法结束, 此时就产生了最终的社区. 上述过程如算法1所示.
算法1. 社区发现Louvain算法
输入: network G=(V, E)
输出: network G′=(V′, E′)
1. G.V:{node 0, node 1,…, node n}
2. for i in G.V do
3. for j in iadjacent_node do
4. 根据式 (5)计算Max (∆Q)
5. if Max (∆Q)>0 do
6. i
7. if G change do
8. G.V={community 0, …, community m}
9. goto step 2
10. else do
11. G'=G
2.3 权重生成由式(4)可知, 社区内的权重越大于社区间的权重时, 模块度越大. 如果将良性日志和恶意日志分为不同的社区, 社区内部边的权重越大于社区间边的权重, 两种不同社区的发现效果才会越好. 但如果直接在2.1节中生成的无向图中使用社区检测时. 社区检测算法此时认为图中每一条边的权重都是1. 观察发现恶意行为社区与良性社区之间存在着很多边的连接, 这种情况降低了社区内的集群密度, 影响到了社区发现算法的有效性. 针对这种情况我们对边的特征向量应用分类算法, 得出向量隶属于恶意社区的概率, 以此概率作为该边的权重, 将2.1节生成的无向图
${w_{\rm in}} \cdot \left| {{e_{\rm in}}} \right| > > {w_{\rm tot}} \cdot \left| {{e_{\rm tot}}} \right|$ | (6) |
其中,
${y_i} = \left\{ {\begin{array}{*{20}{c}} 1,&{{x_i} \in {e_{\rm in}}} \\ 0,&{{x_i} \in {e_{\rm tot}}} \end{array}} \right.$ | (7) |
XGBoost是一个树集成模型, 将多个弱分类器一起组合成一个强分类器, 这也是其相比传统模型分类能力更强的原因. 将多颗树的预测结果进行结合, 获得比单一的树更加优越的泛化能力. 在XGBoost中的目标函数如式(8)表示:
$ob{j^t} = \sum\limits_{i = 1}^n {l\left( {{y_i},{{\hat y}_i}^{(t)}} \right) + \sum\limits_{k = 1}^t {\Omega ({f_t})} } $ | (8) |
目标函数由第一部分训练损失和第二部分正则化组成, 式中
$ {\hat{y}}_{i}{}^{(t)}={\hat{y}}_{i}{}^{(t-1)}+{f}_{t}({x}_{i}), {f}_{k}(x)={w}_{q(x)}$ | (9) |
目标函数通过二阶泰勒展开沿着梯度下降的方向优化损失, 优化速度大大加快. 将损失函数
$ob{j^t} \approx {\rm{ - }}\frac{1}{2}\sum\limits_{j = 1}^T {\frac{{G_j^2}}{{{H_j} + \lambda }}} + \gamma T$ | (10) |
式(10)也被称为打分函数, 是衡量树结构好坏的标准, 其值越小, 表示这样的树结构越好. 有了上述的打分函数, 最终就可以求出树的最佳结构. 在本次实验中的二分类问题使用对数损失函数, 如式(11)所示:
$loss = \sum\limits_i {\left[ {{y_i}\log_2 \left( {1 + {e^{ - {{\hat y}_i}}}} \right) + (1 - {y_i})\log_2 \left( {1 + {e^{{{\hat y}_i}}}} \right)} \right]} $ | (11) |
对式(7)所示标记的n条训练边采用k折交叉验证的方式进行学习, 以此提高学习效果, 最终将XGBoost算法对于每条边属于社区内部边的预测作为该边的权重, 从而完成无向加权图
上述模型的整体复杂度分析分为3步. 首先, 在日志解析与关联阶段中需要提取任意两个日志之间特征关系, 其时间复杂度为
实验使用Python实现, 利用已有的科学计算库对MITRE ATT & CK提供的APT29以及APT3的仿真攻击结果进行检测. 在ATT & CK提供的日志数据集 [15,16]中, 主要是使用Sysmon采集的主机日志数据. 实验的整体流程如图3所示.
在实验的阶段1中, 从如图2中所示的原始日志中将实验涉及的关联事件日志解析为表2的日志实体格式. 此时原始日志清洗预处理之后, 所有的日志实体格式统一. 为了阶段2的关联特征提取, 经过多次实验确定了表3中的实体间关系, 其中具体每条关系的意义如上文所述. 由于特征提取过程中只关注于实体间关系并归一化, 所以提取到的特征已进行了泛化. 解析到的日志实体与提取到的特征关系向量, 组成了实验阶段2的输入数据无向图
实验阶段2中主要是解决无向图
实验阶段3中, 将社区检测Louvain算法应用在图
4 评估
根据在实验过程的最终输出的实体名与所属社区的对应表, 对于分类结果通常有以下几种评价标准, 准确率(Accuracy)、精确率(Precision)、召回率(Recall)以及F1分数, 但F1分数指标综合算法的精确率指标和召回率指标, 评价更为全面. 上述指标的计算公式如式(12)到式(15)所示:
${{Accuracy}} = \frac{{TP + FN}}{{TP + FP + TN + FN}}$ | (12) |
${{Precision}} = \frac{{TP}}{{TP + FP}}$ | (13) |
${{Recall}} = \frac{{TP}}{{TP + FN}}$ | (14) |
${{F1}} = \frac{{2 \times {{Precision}} \times {{Recall}}}}{{{{Precision}} + {{Recall}}}}$ | (15) |
实验采用F1分数对实验结果进行评估, 其中XGBoost算法最终社区发现效果最好, F1分数明显高出另外两种算法, 受表3中特征提取时间间隔
在对3种不同的权重分配算法最后的社区检测精度进行评估之后, 考虑到算法复杂度的对比, 实验采用运行时间指标来对比评估本文模型与另外两种算法的复杂度. 控制模型日志预处理与社区发现阶段相同, 所以复杂度的差距在于权重分配阶段. 因此实验在APT29数据上对比了不同的特征提取间隔下3种权重分配算法的运行时间. 如2.4节所述, 由于XGBoost算法使用Block块对特征项排序优化, 在运行上相比于另外两种算法更高效. 对比数据如图8所示, 时间单位为秒.
最后在实验中发现的部分恶意行为序列. 例如, (1)双击带有恶意负载的3aka3.doc文档, 生成3aka3.scr恶意进程, 之后派生出Cmd与Powershell进程建立C2通道连接到192.168.0.5, 完成对受害主机1的初始登录. (2)在受害主机上进行文件收集等工作, 利用Powershell执行文件收集与压缩命令对后缀为xlxs、doc、pdf、png等的文件进行遍历、加密和压缩生成Draft.Zip与working.zip. (3)生成新的更高权限的Powershell进程, 执行文件与进程的发现任务, 利用Get-Process等命令发现主机中的进程, 加载Netapi32.dll来探测系统接口. (4)删除上述过程中生成的Draft.Zip与working.zip文件, 销毁收集活动痕迹. 之后结合横向移动等一系列步骤完成对主机的侵害.
5 结论通过实验评估证明了XGBoost与社区检测算法结合在检测主机日志恶意行为中的价值. 关注父子进程链及其文件等操作, 提取出日志实体之间的社区图关系, 通过社区发现算法检测其中恶意社区. 在边权重分配过程中使用XGBoost集成学习算法与逻辑回归、SVM算法对比, 结果表明基于XGBoost与社区发现的主机攻击行为检测模型具有良好的检测效果, 对于Lotl技术有更好的检测能力. 但是, 在实验过程中日志关系之间的生成与训练过程可以进一步优化, 使得模型运行更加快速和高效.
[1] |
Symantec. Internet security threat report 2019. https://docs.broadcom.com/doc/istr-24-2019-en. [2020-12-22].
|
[2] |
Filar B, French D. ProblemChild: Discovering anomalous patterns based on parent-child process relationships. arXiv: 2008.04676, 2020.
|
[3] |
MITRE ATT & CK. ATT & CK matrix for enterprise. https://attack.mitre.org/. [2021-01-05].
|
[4] |
Mavroeidis V, Jøsang A. Data-driven threat hunting using sysmon. Proceedings of the 2nd International Conference on Cryptography, Security and Privacy. New York: ACM, 2016. 82–88.
|
[5] |
Milajerdi SM, Gjomemo R, Eshete B, et al. HOLMES: Real-time APT detection through correlation of suspicious information flows. Proceedings of 2019 IEEE Symposium on Security and Privacy. San Francisco: IEEE, 2019. 1137–1152.
|
[6] |
Yu H, Li AP, Jiang R. Needle in a haystack: Attack detection from large-scale system audit. Proceedings of 2019 IEEE 19th International Conference on Communication Technology. Xi’an: IEEE, 2019. 1418–1426.
|
[7] |
Lee KH, Zhang XY, Xu DY. LogGC: Garbage collecting audit log. Proceedings of the 2013 ACM SIGSAC Conference on Computer & Communications Security. New York: ACM, 2013. 1005–1016.
|
[8] |
贲永明, 韩言妮, 安伟, 等. 一种基于污点追踪的系统审计日志压缩方法. 信息安全学报, 2020, 5(5): 30-42. DOI:10.19363/J.cnki.cn10-1380/tn.2020.09.03 |
[9] |
阮琳琦. 保持依赖关系的实时日志压缩系统的设计与实现[硕士学位论文]. 杭州: 浙江大学, 2020.
|
[10] |
Pei KX, Gu ZS, Saltaformaggio B, et al. HERCULE: Attack story reconstruction via community discovery on correlated log graph. Proceedings of the 32nd Annual Conference on Computer Security Applications. New York: ACM, 2016. 583–595.
|
[11] |
Mark Russinovich, Thomas Garnier. Sysmon-windows sysinternals microsoft docs. https://docs.microsoft.com/en-us/sysinternals/downloads/sysmon. [2020-11-28].
|
[12] |
李春强, 夏伟. 基于Windows日志分析的终端安全研究. 网络空间安全, 2018, 9(9): 70-77. DOI:10.3969/j.issn.1674-9456.2018.09.014 |
[13] |
孙文贺. 面向主机的攻击行为分析研究[硕士学位论文]. 北京: 北京交通大学, 2019.
|
[14] |
徐嘉涔, 王轶骏, 薛质. 网络空间威胁狩猎的研究综述. 通信技术, 2020, 53(1): 1-8. DOI:10.3969/j.issn.1002-0802.2020.01.001 |
[15] |
Mitre-attack, mitre-attack/attack-arsenal-GitHub. https://github.com/mitre-attack/attack-arsenal. [2020-11-15].
|
[16] |
OTRF. OTRF/mordor-GitHub. https://github.com/OTRF/mordor. [2020-11-15].
|
[17] |
Blondel VD, Guillaume JL, Lambiotte R, et al. Fast unfolding of communities in large networks. Journal of Statistical Mechanics: Theory and Experiment, 2008, 2008(10): P10008. DOI:10.1088/1742-5468/2008/10/P10008 |
[18] |
Newman MEJ. Fast algorithm for detecting community structure in networks. Physical Review E, 2004, 69(6): 066133. DOI:10.1103/PhysRevE.69.066133 |
[19] |
Chen TQ, Guestrin C. XGBoost: A scalable tree boosting system. Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining. New York: ACM, 2016. 785–794.
|
[20] |
Cortes C, Vapnik V. Support-vector networks. Machine Learning, 1995, 20(3): 273-297. DOI:10.1007/BF00994018 |