更多资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)
近日,谷歌的project zero发现了一个Linux的提权漏洞(CVE-2017-0359),可以直接从普通用户提升到root 权限,危害很大,影响Debian 9/8/7、Ubuntu、Gentoo等系统,范围较广。该漏洞存在于ntfs-3g,从2008年就存在,或许更早。本文将结合poc对漏洞进行详细分析。
1、基本概念
(1)ntfs-3g
ntfs-3g是一个稳定的、功能齐全的NTFS读写驱动。它支持 Linux、Android、Mac OS X、 FreeBSD、 NetBSD、OpenSolaris、 QNX、 Haiku等系统。它能安全的处理Windows XP、 Windows Server 2003、Windows 2000、Windows Vista、 Windows Server 2008、 Windows 7、Windows 8 和Windows 10 的NTFS文件系统。它基于FUSE在类Unix的系统上实现对Windows上NTFS文件系统的支持。
(2)FUSE
FUSE的全称是用户空间的文件系统。它是一个类Unix操作系统的软件接口,普通用户通过它可以创建自己的文件系统而无需关注内核中的具体实现。实现原理就是普通用户在用户空间操作文件系统,FUSE调用真正的内核代码完成文件操作。如下图所示,FUSE运行在内核空间,充当内核空间和用户空间的媒介。
(3)modprobe
modprobe是一个在内核里加载、卸载内核模块的应用。它运行在内核空间,当内核需要实现一些功能,这些功能存在于一个未加载的内核模块时,就可以使用modprobe加载相应模块。
2、漏洞分析
漏洞的作者在漏洞提交的邮件中写到,他发现FUSE的ntfs读写驱动ntfs-3g在调用modprobe加载FUSE模块之前,并没有清除环境变量。这会影响到modprobe的行为,因为modprobe有一个环境变量MODPROBE_OPTIONS,它有两个参数--config和--dirname非常重要。这可能导致普通用户提权到root,漏洞触发的条件是ntfs-3g有setuid权限。Debian、Ubuntu和Gentoo中就是这么默认实现的。
漏洞的修补比较简单,官方补丁是使用execle并设置环境变量为空,取代了execl。
3、漏洞利用
在分析清楚了漏洞的原理之后,漏洞利用的思路就比较清晰,核心就是修改环境变量,使得内核加载恶意构造的内核模块完成提权。漏洞作者给出了poc,下面就结合poc分析一下漏洞利用。
第一步就是构造一个环境,也就是内核劫持的目录。内核会到/lib/modules和/kernel/fs下查找指定的fuse.ko模块,这里在当前目录下构造/lib/modules和/kernel/fs并指向当前目录。并且替换掉fuse.ko为构造的cve_2017_0358.ko,达到代码执行的目的。
第二步就是构造内核模块。它实现了把sh拷贝到/tmp/r00t,然后赋予权限,这样执行/tmp/r00t就得到一个root shell。
最后一步就是执行ntfs-3g,并将环境变量指向构造的目录。程序运行到加载fuse.ko时,会加载构造的内核模块,达到提权的目的。
4、总结
该漏洞原理和利用都比较简单,非常类似Windows上的dll劫持漏洞,但是其危害非常大,潜伏时间非常长,值得引起重视。建议尽快升级到最新版本:ntfs-3g_ntfsprogs-2016.2.22。