关于 Alpine Docker 镜像漏洞 CVE-2019-5021

836 阅读3分钟

关于 CVE-2019-5021 带来的一点思考。

本周比较吓人的是 CVE-2019-5021, 根据漏洞报告,自 Alpine Linux 3.3 版本开始的所有 Docker 镜像中,root 用户包含一个空密码,这可能会导致攻击者获得 root 权限,今儿造成攻击。

报告中称:受影响范围是 Alpine Linux Docker 镜像 3.3、3.4、3.5、3.6、3.7、3.8、3.9、edge 等全部版本。

要知道由于 Alpine Linux 镜像体积较小,所以在构建 Docker 镜像时,很多人都会推荐使用 Alpine Linux 作为基础镜像;包括很多 Docker 官方镜像也基本上都提供了基于 Alpine Linux 的镜像,甚至像 Docker 镜像等,是只提供了使用 Alpine Linux 作为基础镜像的版本。

报告一出,瞬间这个消息就被传播成了 “Alpine Linux Docker 镜像不安全”/“不要再使用 Alpine Linux 了”。当然 Google 的开发者也顺便推了一次自家的 distroless 镜像。

我们来看一下 CVE-2019-5021 到底是什么以及如何复现吧。

CVE-2019-5021

(MoeLove) ➜  ~ docker run --rm -it alpine:3.9
/ # grep root /etc/passwd
root:x:0:0:root:/root:/bin/ash
operator:x:11:0:operator:/root:/bin/sh
/ # grep root /etc/shadow
root:::0:::::
/ #

以上是一个 alpine:3.9 的镜像,我们分别来看它的 /etc/passwd/etc/shadow 文件,很明显,此刻 root 用户是一个空密码;并不符合预期。这样也就导致了被攻击的可能性。我们来看下如何复现攻击以及修复。

复现

先来看下如何复现, 编写如下的 Dockerfile

FROM alpine:3.9

RUN apk add --no-cache shadow

RUN adduser -S moelove

USER moelove

docker build -t local/alpine:cve . 构建镜像,接下来复现:

(MoeLove) ➜  cve docker run --rm -it  local/alpine:cve 
/ $ id
uid=100(moelove) gid=65533(nogroup) groups=65533(nogroup)
/ $ whoami 
moelove
/ $ su -
4a5cc376be74:~# 
4a5cc376be74:~# whoami 
root
4a5cc376be74:~# grep root /etc/passwd /etc/shadow
/etc/passwd:root:x:0:0:root:/root:/bin/ash
/etc/passwd:operator:x:11:0:operator:/root:/bin/sh
/etc/shadow:root:::0:::::

可以看到成功使用普通用户获取的 root 权限。

修复

当前官方镜像已经修复,可直接更新对应镜像

或是

在 Dockerfile 中增加下面这行:

RUN sed -ie 's/^root::/root:!:/' "$rootfs/etc/shadow"

对应于刚才容器内的操作便是:

4a5cc376be74:~# sed -ie 's/^root::/root:!:/' /etc/shadow
4a5cc376be74:~# grep root /etc/passwd /etc/shadow
/etc/passwd:root:x:0:0:root:/root:/bin/ash
/etc/passwd:operator:x:11:0:operator:/root:/bin/sh
/etc/shadow:root:!::0:::::
4a5cc376be74:~# / $ su -
Password: 
su: Authentication failure
/ $ whoami
moelove

思考

这个“漏洞” (姑且称之为漏洞吧),是在 5 月 9 日被公布,网上的讨论其实有些言过其实。

本身这个问题如果想要成为攻击点,其中一种方式是需要安装 shadowlinux-pam 替代 Alpine Linux 默认的 BusyBox 工具链。而在 Docker 镜像中安装 shadow 的可能性其实很小(最起码我暂时没想到我会主动在镜像中安装 shadow 的情况)。

在我看来,这个问题是对于默认镜像来说,问题存在,但是几乎没有触发的可能, 必须要具备上面提到的特定条件。(当然也还有另一种可能,这里不赘述了)

另外,受影响的镜像,大多其实已经 EOL 不再进行维护了。这也同时提醒我们及时升级依赖非常重要。

此外,关于这是不是一个漏洞的讨论其实很多,关注点在于说这些漏洞触发都是人为操作/扩展来造成的,这个事情我不想聊太多,因为即使对于其他的 Linux 发行版来说,也有很多方式能造成被攻击之类的,那这种情况算是 Linux 漏洞 还是算其他的呢?

就先聊到这儿吧。请及时更新/修复 Alpine 相关镜像。


可以通过下面二维码订阅我的文章公众号【MoeLove】

TheMoeLove