dirty pipe漏洞,解决办法

17 篇文章 1 订阅

2022 年 3 月 7 日,Max Kellermann公开披露了 Linux 内核中的一个漏洞,后来被命名为 Dirty Pipe,该漏洞允许低权限进程写入任意可读文件,从而导致权限提升。此漏洞影响从 5.8 开始的内核版本。在发现之后,它已针对所有当前维护的 Linux 版本 5.16.11、5.15.25 和 5.10.102 进行了修复。

虽然更容易利用,但它类似于 2016 年披露的旧漏洞Dirty COW,自那时以来一直被恶意行为者积极利用。

Dirty Pipe 漏洞很容易被利用并影响广泛的系统,包括一些基于 Linux 内核的 Android OS 版本。应用内核补丁通常比标准软件更新更具挑战性。在基于 Android 的系统中尤其如此。因此,我们相信大量系统在未来仍将易受攻击。

Datadog 还能够证明 Dirty Pipe 可用于突破非特权容器。一旦社区有足够的时间修复此漏洞,我们将发布容器突破的完整技术细节。

检查您的系统是否易受攻击

此漏洞仅影响基于 Linux 的系统。检查您的系统是否易受攻击的最简单方法是通过运行命令查看它使用的 Linux 内核版本uname -r。

如果系统的内核版本高于 5.8,但低于 5.16.11、5.15.25 或 5.10.102,则该系统可能容易受到攻击。例如:

内核版本 5.7.11 不易受到攻击,因为它早于 5.8
内核版本 5.10.96 易受攻击,因为它比 5.8 更新且比 5.10.102 更早
内核版本 5.16.10 易受攻击,因为它比 5.8 更新并且比 5.16.11 更早
内核版本 5.16.11 包含一个补丁,因此不易受到攻击
有关如何检查系统是否易受攻击的更准确说明,您可以参考特定于您的 Linux 发行版的建议,我们将在下一节中介绍。

修复影响的系统

要修复此漏洞,请确保您的 Linux 系统正在运行 5.16.11、5.15.25、5.10.102 或更高版本的内核版本。

主要的 Linux 发行版已经发布了专门的安全公告来帮助缓解漏洞,包括:

红帽
Ubuntu
Debian
虽然情况仍在发展中,但截至撰写本文时,Azure 和 GCP 尚未发布公告。AWS为其 Amazon Linux 操作系统发布了ALAS-2022-1571和ALAS2KERNEL-5.4-2022-023 。

Dirty Pipe原理

此漏洞存在于 Linux 内核页面缓存的内部工作原理中,它处理需要将哪些内存位(“页面”)持久化到磁盘,以及哪些页面只能保留在内存中。当被利用时,Dirty Pipe 漏洞允许低权限用户将任意数据写入用户可以在文件系统上读取的任何文件。

有多种方法可以利用此漏洞进行权限提升。其中之一是写信给/etc/passwd文件,其中包含用户列表及其权限。例如,将以下行附加到/etc/passwd创建一个新用户“malicious-attacker”,密码为“datadog”,权限与 root 相同:
在这里插入图片描述
Dirty Pipe 漏洞也可用于逃离低权限的 Linux 容器。我们能够从运行概念证明漏洞的容器中覆盖RunC二进制文件。

RunC 是 Docker 和 Kubernetes 以及其他容器技术使用的许多容器运行时的一部分。它的作用是在 Linux 上生成、运行和配置容器。对 RunC 的特制攻击允许恶意行为者破坏主机的操作系统,从而导致主机全面入侵。

我们将在即将发布的博客文章中发布 PoC 的完整详细信息,以便让社区有时间将其基础架构更新到最新的 Linux 内核补丁,以防止这种攻击。

Datadog 云工作负载安全团队正在努力为 Datadog 代理添加功能,以便可靠地检测对 Dirty Pipe 的利用。具体来说,我们已经添加到代理使用 eBPF 实时监控的系统调用splice列表中。此功能预计将作为 Datadog 代理 7.35 版的一部分发布。Cloud Workload Security 的客户将收到通知,将其代理更新到可以检测到脏管道漏洞利用的版本。

通过启用 Datadog 监视splice系统调用,我们能够创建以下检测规则来识别 Dirty Pipe 利用的实例:

(splice.pipe_exit_flag & PIPE_BUF_FLAG_CAN_MERGE) > 0
 && (splice.file.rights & S_IWOTH) == 0

此规则识别splice系统调用何时对不可全局写入的文件执行,并包含PIPE_BUF_FLAG_CAN_MERGE触发漏洞的标志。
在这里插入图片描述
制定更具体的规则来识别几种常见的利用案例:
当可执行文件被覆盖时

(splice.pipe_exit_flag & PIPE_BUF_FLAG_CAN_MERGE) > 0
&& (splice.file.mode & S_IXGRP > 0 || splice.file.mode & S_IXOTH > 0 || splice.file.mode & S_IXUSR > 0)

当关键系统路径中的文件被覆盖时

(splice.pipe_exit_flag & PIPE_BUF_FLAG_CAN_MERGE) > 0
&& (splice.file.path in [ ~"/bin/*", ~"/sbin/*", ~"/usr/bin/*", ~"/usr/sbin/*", ~"/usr/local/bin/*", ~"/usr/local/sbin/*", ~"/boot/**" ]) 

当 SUID/SGID 二进制文件被覆盖时

(splice.pipe_exit_flag & PIPE_BUF_FLAG_CAN_MERGE) > 0
&& (splice.file.mode & S_ISGID > 0 || splice.file.mode & S_ISUID > 0)

当 root 用户拥有的文件被覆盖时

(splice.pipe_exit_flag & PIPE_BUF_FLAG_CAN_MERGE) > 0
&& (splice.file.uid == 0 || splice.file.gid == 0)

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值