【漏洞通告】Dirty Pipe – Linux 内核本地提权漏洞
2022.3.09
摘要
CVE-2022-0847于2022-03-07公开披露,发现者Max Kellermann研究员将该漏洞命名为Dirty Pipe(脏管道)。该漏洞是存在于Linux内核5.8及之后版本中的本地提权漏洞。攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权root。CVE-2022-0847 的漏洞原理类似于 CVE-2016-5195 脏牛漏洞(Dirty Cow),但它更容易被利用。漏洞作者将此漏洞命名为“Dirty Pipe”。
一、漏洞介绍
CVE-2022-0847于2022-03-07公开披露,发现者Max Kellermann研究员将该漏洞命名为Dirty Pipe(脏管道)。该漏洞是存在于Linux内核5.8及之后版本中的本地提权漏洞。攻击者通过利用此漏洞,可覆盖重写任意可读文件中的数据,从而可将普通权限的用户提升到特权root。CVE-2022-0847 的漏洞原理类似于 CVE-2016-5195 脏牛漏洞(Dirty Cow),但它更容易被利用。漏洞作者将此漏洞命名为“Dirty Pipe”。
二、漏洞成因
“pipe”—管道指的是一种用于单向进程间通信的工具,第一次写入会为其分配一页 (4kb) 内存,如果使用 splice() 将文件中的数据附加到管道,它会被写入页面缓存,然后可以从那里将准备的新数据写入管道来覆盖缓存。
在Linux中,“脏”意味着页面正在等待磁盘写入,并且页面缓存不会写入磁盘。覆盖页面缓存的数据不会使页面变脏,所以它会保留在内存缓存中,并且漏洞利用数据可以通过管道传输到页面缓存。由于写入管道不会检查权限,所以任何人都可以这样做。这可能会导致权限升级,但在重新启动时会消失,因为它从未写入磁盘。
该漏洞可能允许攻击者覆盖系统上的文件、提升权限、在网络内部横向移动以及执行任意代码来劫持设备。但是,还是有一些限制:攻击者必须具有读取权限,并且“偏移量”不得位于页面边界上,此外,写入不能跨越页面边界,并且文件不能调整大小。
三、影响范围
5.8 <= Linux 内核版本 < 5.16.11 / 5.15.25 / 5.10.102
四、解决方案
更新升级 Linux 内核到以下安全版本:
Linux 内核 >= 5.16.11
Linux 内核 >= 5.15.25
Linux 内核 >= 5.10.102
参考资料
https://dirtypipe.cm4all.com/
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9d2231c5d74e13b2a0546fee6737ee4446017903