Linux内核是Linux操作系统的核心组件,负责管理系统的资源、进程、内存、设备等。Linux内核经常更新以修复漏洞、增加功能和提高性能。然而,有时候更新也会引入新的漏洞,给系统带来安全风险。最近,一种名为Dirty Pipe的Linux内核本地提权漏洞(CVE-2022-0847)被公开披露,该漏洞存在于kernel的4.18.0-193版本中,属于系统漏洞,风险级别较高。攻击者可以利用该漏洞完成对任意只读文件的修改,从而进行本地提权攻击。另外,该漏洞存在EXP,攻击者可以利用已有的EXP进行攻击,危害巨大。
**漏洞原理**
Dirty Pipe漏洞是由于Linux内核在处理管道(pipe)缓冲区时缺乏对标志位(flags)的正确初始化导致的。管道是一种进程间通信的机制,可以让一个进程将输出发送到另一个进程的输入。管道缓冲区是用来存储管道中传输的数据的结构体,其中包含了一个标志位(flags),用来表示该缓冲区是否可以合并(PIPE_BUF_FLAG_CAN_MERGE)。如果该标志位被设置为1,则表示该缓冲区可以和其他缓冲区合并为一个更大的缓冲区;如果该标志位被设置为0,则表示该缓冲区不可合并。
在Linux内核中,有两个函数用来创建管道缓冲区:copy_page_to_iter_pipe和push_pipe。这两个函数都没有对标志位进行正确的初始化,而是直接使用了未初始化的内存空间中的值。这样就可能导致标志位被设置为1,即可合并。如果攻击者能够控制未初始化的内存空间中的值,就可以使任意管道缓冲区变成可合并的。
当一个管道缓冲区变成可合并的后,就可以被写入新的数据。如果这个管道缓冲区是由splice函数从一个文件中获取的,则这个文件也会被写入新的数据。splice函数是用来将数据从一个文件描述符移动到另一个文件描述符的函数,它可以避免数据在用户空间和内核空间之间的拷贝。如果一个文件描述符指向了一个只读文件,则splice函数会将该文件映射到一个管道缓冲区中,以便从中读取数据。如果这个管道缓冲区被标记为可合并的,则攻击者可以通过向该管道缓冲区写入数据,来修改该文件的内容。这样,攻击者就可以绕过Linux的权限控制,对任意只读文件进行修改。
**影响范围**
该漏洞影响了Linux内核版本4.18.0-193及之后的版本。如果您使用了这些版本,并且没有正确配置管道服务,那么您的系统可能存在该漏洞。
**风险级别**
该漏洞被评为重要。因为该漏洞需要攻击者拥有本地访问权限,并且能够控制未初始化的内存空间中的值。但是,一旦攻击者满足了这些条件,他们就可以轻易地修改任意只读文件的内容,从而提升自己的权限或执行任意命令。
**利用方法**
利用该漏洞的方法有多种,以下是一些常见的例子:
- 利用已有的EXP来自动化地探测和利用该漏洞。该EXP可以在GitHub上找到,它可以修改/etc/passwd文件,添加一个root用户,并设置一个密码。
- 利用splice函数和管道缓冲区来修改任意只读文件的内容。具体步骤如下:
- 打开一个只读文件,比如/etc/passwd,并获取其文件描述符fd1。
- 创建一个管道,并获取其读端和写端的文件描述符fd2和fd3。
- 调用splice函数,将fd1中的数据移动到fd2中,即将只读文件映射到管道缓冲区中。
- 调用write函数,向fd3中写入新的数据,即向管道缓冲区中写入新的数据。如果管道缓冲区被标记为可合并的,则新的数据会覆盖原来的数据。
- 调用msync函数,将内存中修改后的数据同步到磁盘上,即将只读文件修改为新的内容。
**修复措施**
针对该漏洞,我们可以采取以下措施来修复:
- 升级到CentOS Stream release 8 后执行yum update kernel来修复该漏洞。需要注意的是,Centos8已经停止更新,因此用户需要升级到CentOS Stream release 8才能进行修复。
- 在修复前,用户可以采取一些措施来降低风险,比如限制本地用户的权限、关闭不必要的服务等。
- 定期监测系统的运行状态和日志,发现异常及时处理。
**总结**
Linux内核Dirty Pipe本地提权漏洞(CVE-2022-0847)是一种由于未初始化标志位导致的漏洞,攻击者可以利用该漏洞修改任意只读文件的内容,从而进行本地提权攻击。为了保障系统的安全,建议用户尽快升级到最新版本,并加强系统的安全配置和监测。
发表评论 取消回复