CentOS 6内核提权漏洞CVE-2016-5195修复步骤
机器跑着CentOS 6,补丁日一推再推,直到有人用脏牛拿到root,才发现这洞真不能拖。下面把踩坑过程压成一张清单,照着敲,基本一遍过。

一、先确认是不是真中招
登录普通账号,随手敲:
rpm -qa --changelog kernel | grep -i dirty
没回显就说明官方补丁没打;再跑uname -r,版本号若低于2.6.32-642.6.2,基本坐实。别信“内网没事”,我亲眼看测试机被同事脚本秒提权,内网一样翻车。
二、备份,别偷懒
1 给当前内核做完整备份:cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-$(uname -r).bak

2 把/boot/grub/grub.conf拷一份到/root,万一新内核起不来,还能回滚。
3 有自定义模块的,顺手find /lib/modules/$(uname -r) -name '*.ko' | tar czf ko.tar.gz -T -,省得重编驱动找不着北。
三、挑一条最稳的升级路线
CentOS 6官方源已停更,但Vault仓库还在。写个临时repo文件:
cat > /etc/yum.repos.d/centos-vault.repo << 'EOF'
[vault-base]

name=CentOS-6.10 - Base
baseurl=http://vault.centos.org/6.10/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
enabled=1
EOF
接着yum clean all && yum --enablerepo=vault-base update kernel,系统会拉到2.6.32-754.35.1.el6,DirtyCow补丁已合入。不想换源,也可以手动下rpm,但依赖容易打架,Vault最省心。
四、编译内核的硬核玩法
机器跑老旧驱动,官方rpm一装就黑屏?只能自己编。步骤压成六行:
1 yum groupinstall "Development Tools"
2 yum install ncurses-devel hmaccalc zlib-devel binutils-devel elfutils-libelf-devel
3 去kernel.org下对应2.6.32最新tarball,解压后把旧内核config拷过来:cp /boot/config-$(uname -r) .config
4 make oldconfig一路回车,再make menuconfig把本地驱动勾全。
5 make -j$(nproc) && make modules_install
6 make install,grub会自动写条目,重启选新内核进系统。
编完记得grep -i dirty /usr/src/linux/Documentation/看补丁说明,确认commit已合并。
五、重启后三件事
1 新内核启动成功,先跑rpm -q kernel,列表里出现新条目才算数。
2 用dmesg | grep -i dirty,出现“CVE-2016-5195 mitigation”字样,补丁生效。
3 把旧内核保留一份,别急着删,跑一周业务无异常再package-cleanup --oldkernels --count=1清掉。
六、临时缓解方案
机器死活不能重启?用SystemTap堵洞:
stap -g -e 'probe kernel.function("mem_write").call { if (uid() != 0) raise(9); }'
这条脚本让非root进程一旦触发写即被kill,能挡一时,但性能掉一成,只能当救急。
七、容器场景别忽视
Docker宿主机内核被洞穿,容器里再加固也白搭。升级完宿主机,顺手把docker run --security-opt=no-new-privileges写进启动参数,再配--cap-drop=ALL,双保险。
八、常见翻车点
1 只升级kernel-tools,没动kernel,重启还是老版本。
2 手抖把grub.conf里default=1写成0,新内核没默认启动。
3 用了第三方驱动却忘了重编,结果新内核起不来,ssh直接失联。
提前在本地虚拟机走一遍流程,把坑踩完再上生产,能省半夜打车去机房。
九、验证脚本放一份
把下面内容存成check_cow.sh,root跑完心里踏实:
#!/bin/bash
gcc -o cowtest cowtest.c 2>/dev/null
if ./cow_test; then
echo "still vulnerable"
else
echo "patched"
fi
cow_test.c网上一搜就有,不到五十行,跑完输出patched就能睡安稳。
CentOS 6老归老,业务还在就得管。DirtyCow补丁打上去,root密码再被猜,也拿不到系统权限。把上面步骤做成脚本,下次换内核三分钟收工,比救火轻松得多。
