跳到主要内容

CVE-2022-0185 - File System Context 堆溢出漏洞分析

· 阅读需 4 分钟

CVE-2022-0185 是一个 Linux 内核中 “File System Context” 中的一个堆溢出漏洞,攻击者可以利用该漏洞发起DDoS攻击,实现容器逃逸和提升至主机权限。

免责声明

本文中提到的漏洞利用代码和分析方法均采用 Github、博客公开的资源,仅供研究交流使用,请遵守《网络安全法》等相关法律法规,切勿将其用于未授权渗透测试。

漏洞简介

fsopen() 打开一个文件系统环境,用户可以用来 mount 新的文件系统。本次漏洞利用就是采用 ext4。fsconfig() 调用能让我们往 ctx -> legacy_data 写入一个新的 (key,value),ctx -> legacy_data 指向一个 4096 字节的缓冲区(在首次配置文件系统时就进行分配)。

其中漏洞代码存在于 fs -> fs_context.c -> legacy_parse_param 函数中,第 551 行中:

aaa

len 是将要写的长度,PAGE_SIZE == 4096 ,size 是已写的长度,2 字节表示一个逗号和一个 NULL 终止符。问题在于采用减法来进行检查,size 是 unsigned int (无符号数),会导致整数溢出,如果相减的结果小于 0,还是会被包装成一个正值。连续添加 117 次的话长度为 0 的 key 和长度为 33 的 vulue,最终 size 则为 4095,这样 PAGE_SIZE - 2 - size == -1 == 18446744073709551615(最大数),这样无论多大的数字都能越过越界检查。

修复方案为将原本 size 去做减法变为加法。

aaa

漏洞复现

该漏洞若在本机上复现需要 cap_sys_admin 权限。该漏洞可导致内核崩溃或提权,复现提权演示。

git clone https://github.com/veritas501/CVE-2022-0185-PipeVersion.git

aaa

漏洞分析

  1. 启动测试程序
docker run -it --rm --name cvedebug --cap-add=SYS_PTRACE \
chenaotian/cve-2022-0185:latest /bin/bash

aaa

  1. 启动 POC 环境
cd ~/cve-2022-0185
gcc poc.c --static
cp a.out rootfs/a.out
cd rootfs
find . | cpio -o --format=newc > ../rootfs.img
cd ../
./boot_poc.sh

aaa

  1. 启动gdb 调试环境
gdb vmlinux_exp
target remote :10086
directory /root/linux-5.13
b legacy_parse_param
c

缓解措施

Plan 1 升级操作系统内核

最有效的缓解措施是将操作系统内核升级至 5.16.2+

Plan 2 - 禁用非特权用户命名空间

  • 在 Ubuntu 系统中,可以使用以下命令来禁用非特权命名空间
sysctl -w kernel.unprivileged_userns_clone=0
  • 红帽用户可以使用以下命令来禁用用户命名空间
echo "user.max_user_namespaces=0" > /etc/sysctl.d/userns.conf 
sysctl -p /etc/sysctl.d/userns.conf

Plan 3 - 容器场景支持

  • Docker Container

容器环境中需要启用 Seccomp 机制,docker 高于 1.10 默认启用 seccomp 机制。

  • Kubernetes Pod
apiVersion: v1
kind: Pod
metadata:
namespace: szxc
name: default-seccomp
labels:
app: default-seccomp
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
containers:
- name: test-container
image: r.j3ss.co/amicontained
command: [ "/bin/sh", "-c", "--" ]
args: [ "amicontained" ]
securityContext:
allowPrivilegeEscalation: false
volumeMounts:
- name: seccomp
mountPath: /var/lib/kubelet/seccomp/
volumes:
- name: seccomp
hostPath:
path: /var/lib/kubelet/seccomp/

参考文献

[1] https://www.willsroot.io/2022/01/cve-2022-0185.html

[2] https://blog.csdn.net/Breeze_CAT/article/details/123007818

[3] https://github.com/veritas501/CVE-2022-0185-PipeVersion.git

[4] https://github.com/chenaotian/CVE-2022-0185