魏小锋,郭玉东,林键
信息工程大学数学工程与先进计算国家重点实验室,郑州450001
基于MNT随机化容器文件系统安全性加强技术
魏小锋,郭玉东,林键
信息工程大学数学工程与先进计算国家重点实验室,郑州450001
CNKI网络出版:2017-04-14,http://kns.cnki.net/kcms/detail/11.2127.TP.20170414.1717.004.html
Linux内核Namespaces是实现基于容器的操作系统级虚拟化的关键技术,提供了资源虚拟化和隔离机制,将PID、IPC、Network等全局性的系统资源划分到某个特定的Namespace。所有容器能够共享主机内核,所有指令在CPU核心的本地运行,提高资源利用率和能快速启动的优点,但也增加了使用的安全风险。容器的使用风险主要集中在共享内核、网络、系统调用、设备或磁盘能够直接访问,从而引发信息泄漏,这些是导致容器安全问题的源头。最近几年暴露出的漏洞[1]显示出:文件系统(fielsystem)中的procfs和sysfs等文件系统不支持名字空间,容易导致大量信息泄漏、客户机逃离和特权升级等问题产生。
目前,针对隔离性不够彻底的问题,容器的典型代表Docker[2-3]采用通过lxcfs文件系统[4]、copy-on-write[5]机制和支持MAC等访问控制,达到保护文件系统的目的。以上保护机制,都没有对文件名/目录进行保护,攻击者根据文件名/目录可以推断出此文件的性质,而且容器中默认设置的权限比较高,某些恶意用户进程可以读取procfs和sysfs的某些敏感文件。
针对以上不足,提出了基于MNT名字空间随机化的方法,简称MNTRand。通过修改Linux的MNT名字空间创建及工作过程,即利用MNT名字空间创建时产生的AES密钥,对文件名/目录使用AES加密算法[6]进行处理,在不影响MNT名字空间内的用户进程正常运行的情况下,使进程只能看到模糊的文件目录树,实现了对目录的屏蔽,有效防护扫描软件针对枚举目录和特定敏感文件的攻击,进而减少信息泄漏的风险,增大恶意软件的漏洞探测和系统漏洞的利用难度。
容器作为一种操作系统层的虚拟化技术,它为应用进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器。在容器中,只有一个操作系统内核,所有的用户进程都共享主机内核,不需要指令级模拟,不需要即时(Just-in-time)编译,降低了硬件虚拟化的复杂性,容器可以实现进程级别的隔离,大大提升了虚拟化的粒度,提高了系统资源利用的效率;容器其性能损耗降到最低。
Namespaces[7]是Linux内核提供的一种操作系统虚拟化(OS-Virtualization)的机制,它提供一种资源虚拟化和隔离方案:PID、IPC、Network等系统资源不再是全局性的,而是属于某个特定的Namespace,每个进程都与一个名称空间相关联,只能看到与该名称空间相关联的资源。这样每个进程(或组)可以对资源有一个独特的视角。目前在Linux系统上实现操作系统虚拟化(OS-Virtualization)系统有Linux VServer、OpenVZ、LXC(Linux Container)、Docker、Rocket/rkt等,以上种种本质来说都是使用了Linux Namespace来进行隔离。Linux nameapce使用clone(2)setns(2)和unshare(2)系统调用,其系统调用标志、隔离内部和需要的权限如表1所示。未来,Linux内核可能还将加入Security Namespace、Security KeyNamespace、Device Namespace和Time Namespace等名字空间[8]。
容器共享内核的和缺乏完整的内核名字空间面临的危险性不能够忽视,Linux许多内核特征仍没有实现名字空间隔离[9],例如procfs和sysfs文件系统不支持名字空间,加之设备等名字空间不完善,这使得攻击者很容易绕过检查保护特权容器的需要步骤,形成非法访问和修改,造成大量不同的信息泄漏和其他漏洞。下面以procfs文件系统的信息泄漏的问题为例子,来说明容器存在威胁。proc文件系统(procfs),是一个处于内存中的文件系统,它用于显示当前进程的状态信息,如:进程处于的状态,文件打开描述符。另外,它还可以用于显示当前系统运行的状态如CPU信息、内存信息、中断信息,网络流量等等重要敏感的信息。因为容器从主机上继承此文件系统,但由于procfs缺乏名字空间的支持,/proc直接暴露给普通用户,提供了重要的信息泄漏来源,这些信息能够很方便地引导其他攻击[9-12]。
分析procfs和sysfs等文件系统存在的信息泄漏等方式,例如:CVE-2012-0056[12]是基于特定文件(/proc/pid/mem)信息泄漏进行的攻击,CVE-2015-2925[13]是通过内核prepend_path函数漏洞绕过chroot隔离,获得绝对路径名。还有的一些攻击基于远程枚举目录(如ls和dir等)针对此类基于文件名/目录的攻击,提出MNT名字空间随机化的方法,即在MNT名字空间基础上加入文件名/目录随机化,对文件名/目录采用AES加密处理,使名字空间的进程所能看到是一个随机化后的目录树,即模糊进程能看到的目录树,而整个系统的根用户的进程目录不受任何影响。
Linux VFS(虚拟文件系统)实现了对文件系统的管理,它包括索引节点结构inode、目录项结构dentry等。本文提出基于MNT名字空间随机化,是对文件名/目录进行操作,不改变inode结构和文件实体间的组织关系,只改变了文件实体名称,即dentry结构中的d_name,相当于给文件名/目录上加上mask。MNTRand可分为三个部分:一是MNT名字空间密钥(keys)的产生,二是利用keys对文件名/目录进行加密,进而形成文件名/目录随机化的MNT名字空间;三是对路径名进行解析,实现在文件名/目录随机化的MNT名字空间内的进程能够正常访问文件。其整体框架如图1所示。
表1 Linux实现的六项Namespace
图1 MNTRand框架
文件系统注册安装后,安装点结构vfsmount中的域mnt_ns指向文件系统所属的名字空间mnt_namespace。在新创建一个MNT名字空间时(系统接收到CLONE_NEWNS标志),使用mnt_namespace*copy_mnt_ns()进行创建new_ns。为方便密钥的管理,mnt_namespace结构中加入keys结构,同时保证一个MNT名字空间对应唯一的keys,即重新定义如下:
考虑到同一个操作系统中会有多个操作者,限制只有创建MNT名字空间的根用户才有权限决定文件名/目录是否加密,普通用户采用授权方式获得自动加密和解密的权限,其他普通用户只有对文件名/目录操作的权限。
为方便普通用户通过授权方式能够使用正常的文件名/目录来操作文件,MNTRand采用白名单技术,即系统管理员将可信用户的uid和gid保存在白名单文件(WhiteList)中。因为MNT名字空间只具有隔离文件系统的功能,并不具备用户管理功能,故MNT名字空间需要联合USER名字空间一起使用。而在mnt_namespace结构内嵌有user_namespace*user_ns,在MNT名字空间创建时同时创建user名字空间(系统接收到CLONE_NEWUSER标志)。如使用绝对路径名打开文件时,则判断打开进程的uid/gid是否WhiteList授权的用户uid/gid是否匹配,而授权普通用户在创建的名字空间内具有正常使用文件名/目录的权限。
为了阻止攻击者获取正常的文件名/目录,本文中AES加密所需的密钥(keys)是由内核函数get_random_int()随机产生的,即:new_ns->keys=get_random_int(),并将密钥与mnt_namespace结构一样仅保存在内存中。如果攻击者想要成功获得正常文件名/目录,要么需要获取创建MNT名字空间的根用户权限,要么需要对驻留内核程序和内存中的数据进行操作,这无疑增加了攻击难度。
用户进程查看文件名/目录时,由各个fs内部的read_dir实现来完成目录遍历操作,对于遍历到的每个文件或子目录,调用函数filldir()来填充buf,并把数据传递给到用户空间。MNTRand对文件名/目录加密,就是对filldir()函数遍历得到文件名/目录,采用内核/crypto/aes_generic.c中aes_encrypt()函数对进行加密。其流程如图2所示。其中,本文提出的对文件名/目录的加密并不包括‘.’和‘..’,因为在Linux系统中,‘.’表示当前目录,‘..’表示上级目录,并且在任何目录中,都有这样两个子目录。如果对‘.’和‘..’加密的话,攻击者在知道‘.’和‘..’存在的情况下,可使用已知明文的方法进行攻击。进而威胁整个加密系统。在新的MNT名字空间内的普通用户进程看到的目录树是经过AES加密过的随机化目录树,其可用信息大为减少。
图2 MNTRand文件名/目录加密流程
VFS实现文件管理主要依据全局目录树[14]。在全局目录树中,任何一个节点,都有一个路径名,并可分为绝对路径名和相对路径名。在进程管理结构task_struct中,fs域指向一个fs_struct结构,其中root是进程的主目录,pwd是进程的当前工作目录。绝对路径名和相对路径名都可用于标识文件和目录。在访问一个文件或目录之前,首要任务是找到路径名所标识的实体,并为其建立索引节点结构(inode)和目录项结构(dentry),这一过程称为路径名解析。Linux用path结构描述实体的路径信息,用path_lookup()系统实现路径名解析。
在实现MNT名字空间文件名/目录随机化后,当要访问一个文件或目录时,进程提供的可以是正常的路径名,也可以是随机化后的路径名。(1)当使用正常路径名时,需要对访问文件或目录的用户进行权限检查,只有授权用户具有访问权限,其他用户均不具备使用正常路径名访问权限,然后再进行路径解析。(2)当使用随机化后路径名时,为不影响进程正常运行,需要在解析路径名时,加入对已随机化的文件名进行解密处理(aes_decrypt)。当路径解析时,path指向当前目录,假设NAME为要解析的子路径名,首先要对NAME进行解密,得出普通Linux文件系统能够识别的name,再根据当前目录名为name的dentry,进行正常的路径解析,直至路径名解析完毕。其流程如图3所示。此过程是对进程透明的,进程并不知道其解密过程及密钥位置。
图3 MNTRand对文件名/目录进行解密
通过修改Linux内核3.14.70版本实现了基于MNT名字空间随机化的原型系统,简记为MNTRAND,修改编译后生成的64位内核在Debian GNU/Linux x86_64上正常运行。
网络攻击过程一般分为:系统扫描、目标检测、系统访问、提升特权、窃取信息、创建后门、踪迹隐藏和损坏系统等。目标检测、系统访问、提升特权和窃取信息可重复多次,其中,目标检测和信息窃取是攻击过程中的关键环节,它关系到系统访问和特权提升的成功与否。
假设一个完整的网络攻击形式化过程有n步,记为序组:<CH1,CH2,CH3,…,CHn-1,CHn>。
网络攻击链代表了攻击者实施攻击步骤的状态转移,直观描述为如下:
由于目标对网络和系统的防护以及攻击者受到自身技术水平的限制,攻击者发起一次网络攻击时,其处于攻击链某个分量状态将依一定的概率成功,如果该概率为零,将视其为攻击失败。在此,假设网络攻击链的各个状态是相互独立的。
(1)网络攻击链CH的成功概率
对1≤i≤N,设CH的状态CHi成功的概率为pi,即攻击者完成该步骤的成功概率。由于攻击链各个状态是相互独立的,各个状态均成功的总概率为各pi之积,称之为网络攻击链CH的成功概率P(CH)=p1p2…pn。若P(CH)=0,称为网络攻击链断裂,此时必存在某个1≤k≤n使得pk=0。
(2)文件名/目录随机化后攻击成功概率
文件名/目录随机化后,其文件名及目录发生了随机改变,与传统名字空间内的文件及目录不同,在一定时间内攻击者获取发起攻击所需的目标系统知识减少或获取目标信息的复杂度增加,对1≤i≤N,设CH的状态CHi成功的概率为因此在攻击链中各状态的成功概率网络攻击链CH的成功概率Pσ(CH)=,则网络攻击链CH的成功概率满足:
因此,基于MNT名字空间的文件名/目录随机化,能有效减少网络攻击的成功率。
本测试基于Linux kernel 3.14.70,漏洞扫描工具为lynis[15],其中,基于MNTRand系统分为使用授权普通用户和非授权用户两种进行操作。测试结果如表2所示。
表2 lynis测试结果
分析其扫描日志文件(lynis.log)可以发现,lynis是使用绝对路径或在枚举目录找到目标文件的。使用授权用户的基于MNT名字空间文件名/目录随机化的33个建议中,4个是调用枚举目录命令,找不到相应的文件而发生的建议,11个是基于绝对路径的扫描,但权限拒绝(Permission denied),建议使用根用户;减少的7个警告中,4个是基于绝对路径名,权限拒绝,改为建议,另外3个虽然也是权限拒绝,但没有报任何警告或建议。基于非授权的用户无法使用绝对路径名而发生错误。目前,攻击者一般都采用绝对路径扫描找到相关敏感文件,而基于MNT名字空间文件名/目录随机化,禁止了非授权用户采用固定路径打开文件,截断了攻击链,即所以,基于MNT名字空间文件名/目录随机化可以防御扫描攻击。
本测试选用Spec CPU 2006测试集[16]进行测试,测试结果如表3所示。通过测试集中的12个测试程序可以发现,MNTRand增加的运行开销约1.82%,平均只有17 ms,最多只有50 ms,对程序运行有限。分析测试结果,其开销主要是集中在AES加解密上。但因Linux文件名/目录比较少,即需要加密的对象有限,故增加的性能开销较少。
Linux提出的“一切皆文件”,而某些文件泄露出的信息是危险的,它将带来一些安全问题。本文提出的基于MNT名字空间文件名/目录随机化,相当于给文件名/目录上加上mask,有针对性地加强可能泄露敏感信息的文件名/目录的防护,能够有效抵御漏洞扫描工具诸如枚举目录命令的攻击和特定文件攻击,且只有很低的性能开销。基于MNT名字空间文件名/目录随机化不仅可以用于容器环境,也可以应用于主机需要隔离进程的环境。未来,将在MNTRand系统上安装LXC或Docker,根据近年来暴漏出的漏洞进一步验证其防护效果。
表3 SPEC测试集测试结果s
[1] Docker.Docker CVE database[EB/OL].(2017).https://www.docker.com/docker-cve-database.
[2] Bui T.Analysis of docker security[J].Computer Science,2015.
[3] Merkel D.Docker:Lightweight Linux containers for consistent development and deployment[J].Linux Journal,2014,2014(239).
[4] LinuxContainers.org.What’s LXCFS?[EB/OL].(2016-12).https://linuxcontainers.org/lxcfs.
[5] Wikipedia.Copy-on-write[EB/OL].(2016-08-14).https://en.wikipedia.org/wiki/Copy-on-write.
[6] 郭俊浩,李海燕.AES加密算法在Linux文件系统中的设计与研究[J].信息网络安全,2009(3):25-28.
[7] Wikipedia.Linux namespace[EB/OL].(2016-08-02).https://en.wikipedia.org/wiki/Linux_namespaces.
[8] Rosen R.Resource management:Linux kernel namespace and cgroups[EB/OL].(2013).http://www.cs.ucsb.edu/~rich/class/cs293b-cloud/papers/lxc-namespace.pdf.
[9] Grattafiori A.Understanding and hardening Linux containers[R].NCC Group Whitepaper,2016-04-20.
[10] Kulikov V.CVE Request—kernel:sysctl:restrict write access to dmesg_restrict[EB/OL].(2011-10-26).http://seclists.org/oss-sec/2011/q4/155.
[11] Mónica D.Adding sched_debug to the masked paths list[EB/OL].(2016-03-17).https://github.com/docker/docker/pull/21263.
[12] Donenfeld J A.CVE-2012-0056:Linux local privilege escalation via SUID/proc/pid/mem write[EB/OL].(2012-01-21).https://git.zx2c4.com/CVE-2012-0056.
[13] Horn J.CVE-2015-2925:Linux namespaces:It is possible to escape from bind mounts[EB/OL].(2015-04).http://www.openwall.com/lists/oss-security/2015/04/03/7.
[14] 郭玉东,尹青,董卫宇.Linux原理与结构[M].西安:西安电子科技大学出版社,2012-03:282-310.
[15] Boelen M.Lynis[EB/OL].(2016-04-12).https://cisofy.com/lynis/.
[16] Henning J L.SPEC CPU2006 benchmark descriptions[J].ACM Sigarch Computer Architecture News,2006,34(4):1-17.
WEI Xiaofeng,GUO Yudong,LIN Jian.Hardening technology for container file system based on MNT namespace randomization.Computer Engineering andApplications,2018,54(6):81-85.
WEI Xiaofeng,GUO Yudong,LIN Jian
State Key Laboratory of Mathematical Engineering and Advanced Computing,Information Engineering University,Zhengzhou 450001,China
As a virtualization technology of operating system layer,container is widely considered to be the top resources utilization rate virtualization method,MNT name space is an important technology for container file system isolation,but procfs and sysfs file system does not support namespace,there is the risk of information leakage.In view of the insufficiency of MNT name space,this paper puts forward and realizes the randomization of MNT name space.The work process is created by modifying the Linux MNT namespace,AES encryption methods are used for filename/directory processing,using the name space can see the process of fuzzy file directory tree,shielding of the directory.The experimental results show that the method can effective prevent scanning software from attacking on enumeration directory and specific sensitive files,and performance loss is small,only increases about 1.82%of the operating expenses.
container;mount namespace(MNT namespace);filename encryption;randomization
容器作为一种操作系统层的虚拟化技术,被广泛认为是资源使用率最高的虚拟化方法,而MNT名字空间是容器实现文件系统隔离的重要技术,但procfs和sysfs等文件系统不支持名字空间,存在信息泄漏的风险。针对MNT名字空间存在的不足,提出并实现了基于MNT名字空间随机化,通过修改Linux的MNT名字空间创建及工作过程,对文件名/目录使用AES加密方式进行处理,使用名字空间内的进程只能看到模糊的文件目录树,实现对目录的屏蔽。实验结果表明,该方法能有效防护扫描软件针对枚举目录和特定敏感文件的攻击,而且性能损耗小,只增加约1.82%的运行开销。
容器;MNT名字空间;文件名加密;随机化
2016-11-02
2017-01-17
1002-8331(2018)06-0081-05
A
TP309.2
10.3778/j.issn.1002-8331.1611-0054
魏小锋(1985—),男,硕士研究生,主要研究方向:信息安全;郭玉东(1964—),男,教授,主要研究方向:操作系统、虚拟化;林键(1989—),男,博士研究生,主要研究方向:信息安全。