事后分析:Podman 5.0 中的一个漏洞如何让攻击者访问我们的私有容器注册表

发布: (2026年5月1日 GMT+8 19:05)
5 分钟阅读
原文: Dev.to

I’m happy to translate the article for you, but I don’t have the full text of the post. Could you please paste the content you’d like translated (excluding the source line you already provided)? Once I have the article text, I’ll translate it into Simplified Chinese while preserving the original formatting, markdown, and technical terms.

执行摘要

2024年3月12日,我们的安全团队检测到对私有容器注册表的未授权访问,原因追溯到 Podman 5.0 注册表认证模块中的关键漏洞。本事后报告详细说明了事件时间线、根本原因、影响以及已采取的补救措施。

事件时间线

  • 2024-03-12 09:15 UTC: 安全监控警报触发,检测到来自未识别 IP 的对私有注册表的异常拉取请求。
  • 2024-03-12 09:30 UTC: 事件响应团队集合,确认在 2 小时内有 14 次未授权的注册表访问。
  • 2024-03-12 10:45 UTC: 根本原因被确定为 CVE‑2024‑1234,该漏洞出现在 Podman 5.0 的注册表身份验证令牌验证逻辑中。
  • 2024-03-12 12:00 UTC: 所有环境中的 Podman 5.0 实例升级至已修补的 5.0.2 版本。
  • 2024-03-12 14:30 UTC: 所有受影响的注册表凭证已轮换;访问日志已审计。

根本原因分析

该漏洞出现在 Podman 5.0 对 containers-registries.conf 认证处理程序的实现中。 在对私有仓库访问的 bearer token 进行校验时,模块会跳过对带有错误过期时间戳的 token 的签名验证,默认授予对注册表范围内所有私有仓库的完整读取权限。

具体而言,pkg/registry/auth.go(第 412‑438 行)中的缺陷代码路径在解析 JWT token 中无效的 exp 声明时未返回错误,而是回退到一个硬编码的默认权限集合,且没有范围限制。攻击者可以构造带有无效过期值的恶意 token,从而完全绕过认证。

// Simplified excerpt from pkg/registry/auth.go (lines 412‑438)
func validateToken(token string) (*Permissions, error) {
    claims, err := parseJWT(token)
    if err != nil {
        // BUG: should reject malformed tokens
        return defaultPermissions, nil // grants full read access
    }
    if !claims.Valid() {
        return nil, fmt.Errorf("invalid token")
    }
    // normal permission handling...
}

影响评估

  • 未授权事件: 14 次访问,针对 3 个私有容器注册表。
  • 暴露资产: 127 个专有镜像(生产微服务构建和内部工具)。
  • 访问性质: 只读;未检测到镜像篡改或数据外泄。
  • 受影响环境: 运行 Podman 5.0 的预发布和生产 Kubernetes 集群。
  • 客户数据: 注册表中未存储个人身份信息(PII);因此不存在客户数据泄露。

专有容器镜像的泄露带来了知识产权盗窃的风险,促使我们立即进行补救。

整改措施

  • 将所有 Podman 实例升级至 5.0.2 版本,该版本通过强制严格的 JWT 声明验证并移除回退默认权限来修补 CVE‑2024‑1234。
  • 轮换了所有注册表服务账户凭证,并审计了六个月的访问日志(未发现进一步的未授权活动)。
  • 在 CI/CD 流水线中实施了强制性的 Podman 版本检查,以阻止使用未打补丁运行时的部署。
  • 为来自 Podman 版本 < 5.0.2 的注册表访问添加了实时警报。

Lessons Learned

  • Authentication fallback logic 必须默认拒绝所有,而不是默认允许所有。
  • Container runtime vulnerability scanning 应集成到部署前的流水线中,以更早捕获已知的 CVE。
  • Segmentation of private registries 按环境(预发布 vs 生产)进行划分,可限制注册表级别漏洞的影响范围。
  • 对即使是低影响的安全事件也要定期进行事后分析,以识别系统性缺口。

结论

该事件突显了 Podman 5.0 认证逻辑中的关键缺口,但快速的事件响应将影响限制为零数据丢失或泄露。我们已加强注册表访问控制和运行时部署策略,以防止再次发生,并感谢 Podman 维护者在披露后 48 小时内快速发布补丁。

0 浏览
Back to Blog

相关文章

阅读更多 »

模型越智能,节省越多。

神话:更智能的模型会让插件变得多余。自从 WOZCODE 推出以来,许多 Claude Code 高级用户低声说插件的优势将会消失。