当你拉取一个 Alpine 镜像时,可能很少去想里面真正跑着什么。大多数团队看到“极简”就继续了。
但关键在于:Alpine Linux 基于 BusyBox。一个二进制文件,其他所有东西都链接到它。
docker run --rm alpine:latest ls -la /bin/ | head -10
lrwxrwxrwx 1 root root 12 /bin/ls -> /bin/busybox
你看到的每个工具,都是同一个1.3MB的二进制。这就是你的整个操作系统。
CVE 问题
当 BusyBox 存在漏洞时,你的整个用户空间就都有漏洞。没有隔离机制。
以 CVE-2022-28391 为例,它影响了 BusyBox 的 DHCP 客户端。任何作为 DHCP 客户端运行的 Alpine 容器,都可能因恶意 DHCP 响应而遭受远程代码执行。这覆盖了整个行业的 Kubernetes Pod、CI 运行器和网络 sidecar。
多数团队的修复方式是:docker pull alpine:latest。但这并不能保证你处于已打补丁的版本。
检查 BusyBox 版本:docker run --rm alpine:3.19 busybox | head -1,然后到 security.alpinelinux.org 核对。
你可以做什么
1. 审计你实际运行的内容:在集群里找出 Alpine 镜像,检查是否存在 BusyBox。
2. 应用容器考虑使用 distroless:对于静态编译的 Go 或 Rust 服务,使用 distroless 镜像。没有 shell、没有包管理器、没有 BusyBox。镜像会稍大一些,但攻击面更小。
3. 如果必须用 Alpine,固定版本并自动化重建:使用类似 alpine:3.19 的明确版本标签,而不是 :latest。配置 Renovate 或 Dependabot 来跟踪 Alpine 发布标签,在漏洞公布时重建。
诚实的权衡
Alpine 很方便。Distroless 需要更多构建工作。但如果你运行的是面向互联网的工作负载,或任何有高权限的东西,这份便利并不值得那看不见的攻击面。
去检查你的基础镜像吧。看看有多少是 Alpine。然后决定你是否还想继续玩这个游戏。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.