容器内利用脏牛漏洞覆写[vdso]提权复现与解析
发布时间:
2020-12-01 10:08
原理
脏牛漏洞
漏洞是Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有只读内存映射。黑客可以获取低权限的本地用户后,利用此漏洞获取其他只读内存映射的写权限,进一步获取root权限。
[vdso]
“vDSO”(虚拟动态共享对象)是一个内核会自动映射到每个用户进程的地址空间的小型共享库。用户的程序通常不需要关心vdso的内部细节, 因为这个库主要是提供给c语言库使用的。你只需要使用c语言库提供的函数, 而c语言库会在某些必要的函数中使用到vdso提供的功能。
一个常用的系统调用就是gettimeofday。这个系统调用既会被用户直接调用, 也可能被c语言库调用. 内核将获得答案(时间)所需要的信息放置在程序可以访问的到的内存空间中。现在调用gettimeofday从需要进行系统调用变成了普通的函数调用和一些内存访问。
所有进程的[vdso]均指向同一块物理地址。
环境 及 poc
主机
Ubuntu 14.04.5
kernel version 4.4.0-31-generic
docker version 18.06.3-ce
flag
容器
容器内flag
POC
https://github.com/scumjr/dirtycow-vdso
本例中忽略poc下载和编译的过程
复现
本次选择的shellcode 功能为 tcp反弹shell,设定地址 192.168.10.101:65534
1.在远程主机上监听 port:65534
2.在容器中运行编译好的elf
3.远程主机上收到反弹的shell 结束
分析
利用后果
本例poc 永久的修改来内存中[vdso]的内容,即便容器已经停止或删除,[vdso]依旧存在shellcode,但重新启动主机(即重新load[vdso])即可修复
漏洞利用前后的 [vdso]内存内容
(左:漏洞利用后[vsdo]的内容;右:漏洞利用前[vsdo]的内容)
位置 0x0960 被替换为了 汇编指令: call near ptr 1EF7h
位置 0x1ef8 之后的内容 被替换为了 shellcode