关于 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 日被公布,网上的讨论其实有些言过其实。
本身这个问题如果想要成为攻击点,其中一种方式是需要安装 shadow
和 linux-pam
替代 Alpine Linux 默认的 BusyBox 工具链。而在 Docker 镜像中安装 shadow
的可能性其实很小(最起码我暂时没想到我会主动在镜像中安装 shadow 的情况)。
在我看来,这个问题是对于默认镜像来说,问题存在,但是几乎没有触发的可能, 必须要具备上面提到的特定条件。(当然也还有另一种可能,这里不赘述了)
另外,受影响的镜像,大多其实已经 EOL 不再进行维护了。这也同时提醒我们及时升级依赖非常重要。
此外,关于这是不是一个漏洞的讨论其实很多,关注点在于说这些漏洞触发都是人为操作/扩展来造成的,这个事情我不想聊太多,因为即使对于其他的 Linux 发行版来说,也有很多方式能造成被攻击之类的,那这种情况算是 Linux 漏洞 还是算其他的呢?
就先聊到这儿吧。请及时更新/修复 Alpine 相关镜像。
可以通过下面二维码订阅我的文章公众号【MoeLove】