利用 waitid 系统调用进行 Linux 权限提升。该漏洞利用由 @XeR_0x2A 和 @chaign_c 出自 HexpressoTeam,仅供教育用途。该 bug 于 2017-05-21 引入,于 2017-10-09 修复,已知 4.14.0-rc4+ 存在漏洞。
如果你处于初学者/中级漏洞利用编写水平,我们鼓励你在阅读我们的实现之前,自己尝试利用该漏洞。这是一个非常好的练习,具有简单的漏洞利用原语(对可写内核内存的任意写入)。我们同时向 @LiveOverflow 发起挑战,请他也来试一试。
以下是描述:
oss-security:
大家好,Chris Salls 发现,当 Linux 内核中的 waitid() 系统调用在 v4.13 中被重构时,它意外地停止检查传入参数是否指向用户空间。这使得本地攻击者能够直接写入内核内存,从而可能导致权限提升。
由这个提交引入:
https://git.kernel.org/linus/4c48abe91be03d191d0c20cc755877da2cb35622通过这个主分支提交修复:
https://git.kernel.org/linus/96ca579a1ecc943b75beba58bebb0356f6cc4b51这个问题应该很快就会在 -stable 分支(未来的 v4.13.7)中修复:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/log/?h=linux-4.13.y谢谢!
waitid:
waitid -- 等待子进程改变状态。
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
内核不会检查 infop 是指向内核空间还是用户空间的指针,因此我们可以覆盖任何具有写权限的内核内存页。有趣的是,我们只能部分控制写入的内容。有超过一千种方式可以利用这个漏洞。我们决定将这个写入原语转化为空指针解引用。我们覆盖了内核 .BSS 段中的 have_canfork_callback 变量。将该变量设置为任何非 0(true)的值,都会导致一个未设置的回调(null)在“新任务暴露给进程之前”被调用。
感谢 Chris Salls 和 @kees_cook 分享了这个 CVE。
首个“真实世界”Linux 内核漏洞利用,出自 @XeR_0x2A 和 @chaign_c, 来自 HexpressoTeam。
2017-10-22