Dirty COW 攻击实验
章节大纲
-
Dirty COW 漏洞是一个有趣的竞态条件(Race Condition)漏洞案例。此漏洞自 2007 年 9 月以来一直存在于 Linux 内核中,直到 2016 年 10 月才被发现并被利用。 该漏洞影响所有基于 Linux 的操作系统,包括 Android,且其后果极其严重:攻击者可以通过利用该漏洞获取 root 权限。此漏洞存在于 Linux 内核的写时复制(Copy On Write)代码中。 通过利用该漏洞,攻击者可以修改任何受保护的文件,即使这些文件对他们来说仅是可读的。
本实验的目标是让学生亲身体验 Dirty COW 攻击,理解该攻击利用的竞态条件漏洞,并更深入地了解一般竞态条件安全问题。在本实验中,学生将利用 Dirty COW 的竞态条件漏洞获取 root 权限。
-
此实验已在我们预构建的 SEEDUbuntu12.04 虚拟机上测试通过,你可以在本页面右端选择虚拟机版本为 SEEDUbuntu12.04,点击“创建虚拟机”来获取虚拟机平台的临时用户名与密码,登录虚拟机平台即可获得一台预先构建好的 SEEDUbuntu12.04 VM,该虚拟机以及用户名密码将在开启 24 小时后自动销毁。如果你使用的是 SEEDUbuntu16.04 或更高版本虚拟机,则此攻击将不起作用,因为内核中的漏洞已被修复。如果你有 Amazon EC2 账户,可以从“社区 AMI”中找到我们的虚拟机,名称为 SEEDUbuntu12.04-Generic。需要注意的是,Amazon 网站显示该虚拟机是 64 位的,这是错误的。该虚拟机实际为 32 位,但此错误信息不会造成任何问题。
你也可以在其他 VM、物理机器以及云端 VM 上自行配置环境进行实验,但我们不保证实验能在其他 VM 下成功。实验所需的文件可从下方下载,解压后会得到一个名为 Labsetup 的文件夹,该文件夹内包含了完成本实验所需的所有文件。
-
此任务的目标是利用 Dirty COW 漏洞向一个只读文件写入内容。
-
现在,让我们对真实的系统文件发起攻击,从而获取 root 权限。 我们选择 /etc/passwd 文件作为目标文件。该文件是全体用户可读的,但非 root 用户无法修改。文件包含用户账户信息,每个用户对应一条记录。假设我们的用户名是 seed。以下是 root 和 seed 的记录:
root:x:0:0:root:/root:/bin/bash seed:x:1000:1000:Seed,123,,:/home/seed:/bin/bash
每条记录包含七个以冒号分隔的字段。我们关注的是第三个字段,它指定了分配给用户的用户 ID (UID) 值。UID 是 Linux 中访问控制的主要依据,因此这一值对系统安全至关重要。root 用户的 UID 字段包含一个特殊值 0,这使其成为超级用户,而不是其名字。任何 UID 为 0 的用户都会被系统视为 root,无论其用户名是什么。seed 用户的 ID 仅为 1000,因此不具备 root 权限。然而,如果我们能将该值更改为 0,我们就能将其提升为 root 用户。我们将利用 Dirty COW 漏洞实现这一目标。
在实验中,我们不会使用 seed 账户,因为此账户用于本书中的大部分实验;如果在实验后忘记将 UID 改回,其他实验会受到影响。相反,我们创建一个名为 charlie 的新账户,并利用 Dirty COW 攻击将这一普通用户变为 root。
添加新账户可以使用 adduser 命令完成。账户创建后,将会在 /etc/passwd 中添加一条新记录。如下所示:
$ sudo adduser charlie ... $ cat /etc/passwd | grep charlie charlie:x:1001:1001:,,,:/home/charlie:/bin/bash
建议你保存一份 /etc/passwd 文件的副本,以防出错导致文件损坏。另一种选择是对你的虚拟机进行快照备份,这样如果虚拟机被破坏,可以随时恢复。