金逸灵
(四川大学网络空间安全学院,成都610065)
区别于虚拟硬件资源的传统虚拟化技术,容器实现了一种操作系统级别的虚拟主机环境。然而,由于容器资源隔离性低和共享内核的特性给云平台引入了新的安全风险。容器中的恶意软件能够通过容器或宿主机的漏洞篡改容器自身的服务,攻击共驻容器,甚至可以逃逸至宿主机威胁整个云平台的安全。故针对容器中的恶意软件进行检测,维护云平台和租户数据安全具有重要的现实意义。
现阶段针对恶意软件的检测主要分为动态检测和静态检测两种方法。文献[1]针对虚拟机进程的I/O序列,采用马尔科夫链模型构建正常行为基线,以此检测虚拟机中的恶意逃逸进程。文献[2]通过采集进程的系统调用数据,基于长短期记忆神经网络构建了一个语言分类模型,取得了较好的检测效果。以上方法都属于动态检测,即针对进程运行产生的行为数据进行检测,虽然这类方法具有较高的精确度,但因需采集动态数据,导致引入了较大的性能损耗。另一种方法是静态检测,文献[3]结合图像分析技术与恶意软件变种检测技术,将整个恶意软件映射为灰度图像,并基于纹理指纹实现特征提取,以此检测恶意软件。文献[4]同样基于图像纹理,但采用了CNN(Convolutional Neural Network,卷积神经网络)自动提取软件特征,用于恶意软件的检测。以上方法都属于传统主机环境下的恶意软件检测,然而云环境下的容器与主机环境不同,其中的恶意软件不仅可以存在于容器镜像中,也可在运行的容器中动态加载,因此不可直接移植主机恶意软件检测方案。
针对现阶段研究工作的不足,为实现容器环境下的恶意软件检测,本文提供了一套针对容器的恶意软件静态检测系统,旨在恶意软件运行前进行检测,从源头阻断其攻击行为,降低检测过程给容器运行带来的性能损耗。
容器中恶意软件静态检测系统设计如图1所示。系统首先采用无代理方式提取容器镜像或容器系统中的待测软件,然后识别待测软件的可执行代码段,进而采用图像生成技术将代码字节流转换为灰度图像,最后基于CNN自动提取恶意软件的多维图像特征,构建检测模型用于恶意软件检测,并将检测出的恶意软件和具体的容器信息输出到检测日志。
图1 检测系统架构
Docker通过层存储来管理多层只读镜像层和读写容器层,通过存储驱动来管理各层内容,通过层的元数据存储来管理各层的元数据。本文以最新的Docker默认使用的存储驱动Overlay2为例,简述无代理提取容器中待测软件方法。
图2 容器与OverlayFS的分层关系
容器与OverlayFS的分层关系如图2所示,其中镜像层对应Lowerdir,容器层对应Upperdir,容器中可见的文件系统为联合挂载点Merged。在内核的处理中,用于挂载的各层之间存在层次关系,主要表现为:上下层同名目录合并、上下层同名文件覆盖和仅存在于Lowerdir的文件写时拷贝,所以需要分层处理各层内容,获得正确的容器视角下的文件内容。无代理提取容器中待测软件的流程如下:
(1)根据输入的容器镜像或容器的唯一标识,筛选出元数据中的Lowerdir和Upperdir路径;
(2)将Lowerdir和Upperdir按照层次关系进行格式拼接作为挂载时的Lowerdir,并新建一个空的Upperdir;
(3)根据Docker系统信息获得存储驱动类型,将拼接的Lowerdir和空的Upperdir联合挂载到一个临时的容器视角目录;
(4)筛选临时目录下的可执行文件,将其绝对路径传给特征抽取模块,待其分析结束后,取消挂载临时目录。
ELF(Executable Linkable Format,可执行链接格式)可执行文件内部具有section结构,section是存储具体的代码和数据的地方,其由一组section表进行索引。其中,section表的起始地址位于ELF文件头,.text、.init、.fini等是存放代码的 section,这些 section具有可执行标志位。
本文针对指定的ELF文件,通过软件readelf分析其内部组织结构以得到可执行代码在ELF文件中的位置分布,然后提取所有可执行section,并将可执行的代码字节流放入N*M的矩阵中,以此形成一张N*M大小的灰度图像,其中,矩阵的每一个元素代表ELF文件的一个字节,同时也对应着灰度图像中的一个像素点。但因存在经过加壳或被恶意修改过的ELF文件,其ELF文件头被破坏、section表信息被删除,这将导致readelf无法得到完整的section信息。针对该问题,本文使用readelf得到ELF文件的入口点,进而计算出入口点在ELF文件中的偏移entry_offset,那么从entry_offset开始一直到文件末尾file_end的内容[entry_offset,file_end]便是需要提取出来的内容,然后根据提取内容的大小选定适当的图像宽度,最后将ELF文件内容填入图片,不足额空间填充0,得到最终的灰度图像。
基于由恶意软件和正常软件转换的灰度图像,构造CNN模型进行恶意软件的识别与检测。由于不同软件生成的灰度图像尺寸不一,为进行模型的训练,本文对图片进行了缩放。图3为缩放至96×96大小所构建的CNN模型结构,其中,CNN网络具有5层卷积层CONV,每层卷积层的卷积核Filter数目与大小均已标出,卷积之后使用ReLU激活函数进行修正,之后进行最大池化Pool,第5层卷积层之后为一个全连接层NN,其使用512个神经元,之后为Dropout层减少网络过拟合的可能性,最后为Softmax层进行类别判定。
图3 CNN模型结构
实验环境:宿主机CPU型号为Intel Xeon E5-2658 v2,主频为2.40GHz,物理内存为256GB,操作系统为64位CentOS7,内核版本为3.10.0,Docker版本为18.03.0-ce,深度学习框架为TensorFlow 2.0.0。
实验数据集:随机选取3764个Linux系统应用作为良性样本集,3482个VirusShare中的恶意ELF作为恶意样本集,共计7246个样本,并将各类样本集按照8:2的比例随机分为训练样本集和测试样本集。
评价标准:使用准确率(Accuracy,ACC)、检测率(Detection Rate,DR)和误报率(False Alarm Rate,FAR)评价模型的检测性能。定义如下:
其中,TP是正确分类为恶意软件的恶意样本数,TN是正确分类为良性软件的良性样本数,FP是错误分类为恶意软件的良性样本数,FN是错误分类为良性软件的恶意样本数。
为说明系统的检测功能有效性,本文通过调节模型迭代次数,得到如表1所示的检测结果,其中Train表示模型训练时间。
表1 模型迭代次数与检测性能关系
由表1可知,在迭代次数为200时,模型训练时间最长,为1414.37s,但此时的检测效果最优,准确率高达94.75%,检测率为94.83%,误报率为5.32%。
实时检测过程中需要首先针对目标ELF文件生成对应灰度图像,再将灰度图像输入已训练好的模型中进行检测,因此系统的时间效率主要由灰度图像生成时间 模型检测时间两部分决定。为评估系统在实时检测过程中的时间效率,本文随机选取了100KB~1000KB大小ELF文件中的10个样本进行分析,统计每种文件大小生成灰度图像的平均时间,结果如表2所示。
表2 ELF文件大小与灰度图像生成时间关系
由表2可知,ELF文件越大,生成灰度图像的时间越久,但在ELF文件大小为1000KB时,灰度图像生成时间也在1s左右。由于系统检测时间主要由灰度图像生成时间和模型检测时间决定,为评估系统的平均检测效率,本文还测试了模型的检测时间,针对一个96×96大小的灰度图像而言,模型检测时间为0.0038s,故系统的总体时间效率是可接受的。
除了测试系统的时间效率,本文同时采用Unix-Bench基准测试工具,评估系统对被检测容器性能的影响,部分测试结果如图4所示。
图4 UnixBench性能测试
在未部署检测系统时,UnixBench测试总评分为2477.3,部署检测系统后为2422.8,故检测系统给被检测容器引入了2.20%的性能损耗。由图4可知,部署检测系统对容器的影响主要表现在字符串处理、启动shell脚本和文件传输方面,原因在于将ELF文件转换为灰度图像时需要分析所有可执行代码段。
本文针对当前容器环境下恶意软件检测研究中存在的问题,提出了一种基于卷积神经网络的容器中恶意软件静态检测方法。该方法在容器外部的宿主机用户层实现对目标容器中待测软件的静态检测,具有较好的可移植性和安全性,在将软件转换为灰度图像时,仅处理可表征软件行为的可执行代码段,以此缩短灰度图像生成时间,提升检测效率,还通过卷积神经网络自动提取图像的多维局部特征,有效提高了检测精度,可在一定程度上保障容器和云平台的安全。