关于 CVE-2019-5021 带来的一点思考。linux
本周比较吓人的是 CVE-2019-5021, 根据漏洞报告,自 Alpine Linux 3.3 版本开始的全部 Docker 镜像中,root 用户包含一个空密码,这可能会致使攻击者得到 root 权限,今儿形成攻击。docker
报告中称:受影响范围是 Alpine Linux Docker 镜像 3.三、3.四、3.五、3.六、3.七、3.八、3.九、edge 等所有版本。安全
要知道因为 Alpine Linux 镜像体积较小,因此在构建 Docker 镜像时,不少人都会推荐使用 Alpine Linux 做为基础镜像;包括不少 Docker 官方镜像也基本上都提供了基于 Alpine Linux 的镜像,甚至像 Docker 镜像等,是只提供了使用 Alpine Linux 做为基础镜像的版本。bash
报告一出,瞬间这个消息就被传播成了 “Alpine Linux Docker 镜像不安全”/“不要再使用 Alpine Linux 了”。固然 Google 的开发者也顺便推了一次自家的 distroless 镜像。less
咱们来看一下 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
用户是一个空密码;并不符合预期。这样也就致使了被攻击的可能性。咱们来看下如何复现攻击以及修复。ui
先来看下如何复现, 编写以下的 Dockerfile
spa
FROM alpine:3.9
RUN apk add --no-cache shadow
RUN adduser -S moelove
USER moelove
复制代码
用 docker build -t local/alpine:cve .
构建镜像,接下来复现:code
(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
权限。cdn
当前官方镜像已经修复,可直接更新对应镜像
或是
在 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】