欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2018-18955:较新Linux内核的提权神洞分析

来源:本站整理 作者:佚名 时间:2019-03-13 TAG: 我要投稿

鉴于目前还没有针对这个漏洞的详细分析,原作者的advisory对新手来说也很不友好,我就写了这篇文章。
相关知识
user namespace
假设你使用Linux,man user_namespaces 就可以给你一个很详细的介绍。
如果你还不知道namespace(以下简称ns)是什么东西,那么 man namespaces 会给出答案:
Namespace   Constant          Isolates
Cgroup      CLONE_NEWCGROUP   Cgroup root directory
IPC         CLONE_NEWIPC      System V IPC, POSIX message queues
Network     CLONE_NEWNET      Network devices, stacks, ports, etc.
Mount       CLONE_NEWNS       Mount points
PID         CLONE_NEWPID      Process IDs
User        CLONE_NEWUSER     User and group IDs
UTS         CLONE_NEWUTS      Hostname and NIS domain name
其中,user ns:
User namespaces isolate security-related identifiers and attributes, in particular, user IDs and group IDs (see credentials(7)), the root directory, keys (see keyrings(7)), and capabilities (see capabili‐ ties(7)). A process’s user and group IDs can be different inside and outside a user namespace. In par‐ ticular, a process can have a normal unprivileged user ID outside a user namespace while at the same time having a user ID of 0 inside the namespace; in other words, the process has full privileges for opera‐ tions inside the user namespace, but is unprivileged for operations outside the namespace.
解释下,user ns用于隔离安全相关的标识符,主要是uid和gid等。这里特别提到,一个进程的uid和gid在它的user ns内外可以不同,比如你可以在外边拥有低权限的uid,在自己的user ns里则可以是root的uid,你可以理解为,这个进程在自己user ns里拥有root权限,但在这之外没有此权限。
这个漏洞涉及到nested user ns(嵌套用户命名空间),它利用了创建nested ns时损坏的id mapping(id映射)来达到提权目的。所谓nested,就是一个user ns的子ns。
User namespaces can be nested; that is, each user namespace—except the initial (“root”) namespace— has a parent user namespace, and can have zero or more child user namespaces. The parent user namespace is the user namespace of the process that creates the user namespace via a call to unshare(2) or clone(2) with the CLONE_NEWUSER flag.
关于uid/gid mapping
既然提到了id mapping,我觉得也有必要进行说明。这个机制保证了nested user ns里面,进程所具有的权限不会逾越它父ns的框框。
从 man newuidmap,我们可以得到这样的内容:
uid
    Beginning of the range of UIDs inside the user namespace.
loweruid
    Beginning of the range of UIDs outside the user namespace.
count
    Length of the ranges (both inside and outside the user namespace).
对于 loweruid ,有一个限制,写在 /etc/subuid 里面:
newuidmap verifies that the caller is the owner of the process indicated by pid and that for each of the above sets, each of the UIDs in the range [loweruid, loweruid+count] is allowed to the caller according to /etc/subuid before setting /proc/[pid]/uid_map
比如,我的是这样的:

所以我可以创建像 0 100000 1000这样的mapping。
漏洞分析
漏洞溯源

从原advisory可以了解到 6397fac4915a 这个commit是导致漏洞的根源。
他的修复diff如下:

看起来他仅仅是把这几句挪个位置而已啊(嗯,他还加了个注释,不过我相信大多数人看到注释也不知道那是什么用意)。
所以我们完整的看一遍这一块代码再琢磨。
本文不再介绍如何查看linux源码了,你也可以直接在kernel.org去看。
涉及到的代码都来自 kernel/user_namespace.c,我们定位到 补丁所在的map_write() 看看它是做什么的:
在第一个循环里,insert_extent() 把mapping的每一个extent都写入 new_map(类型是 struct uid_gid_map)。

extent 代表一行id mapping(如果你的mapping有不止一行的话),像这样:
0 0 1
1 1 1
2 2 1
3 3 1
4 4 1
5 5 995
这个mapping有6个extent。
然后 new_map 调用 sort_idmaps() 来对两个方向的mapping进行排序(new_map->forward, new_map->reverse)。

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载