一个 2023 年 3 月留在镜像构建历史里的令牌,2026 年 7 月还能用:它带着 AI 推理平台 Baseten 主仓库的管理员权限一家安全公司要给自己的推理挑供应商,签合同前先扫了对方的域名。大约 25 分钟后,它拿到一个仍然有效的 GitHub 个人访问令牌,账号叫 basetenbot——这个令牌对 Baseten 的主产品仓库、驱动集群的 GitOps 仓库,以及它的 Homebrew tap 都有管理员和推送权限,另外还能读写 release-platform、basevibe、trainers、baseten-dbt 等私有仓库。Baseten 是估值 130 亿美元的 AI 推理平台,很多公司把生产流量放在它上面。
问题出在一个大多数人不会去看的地方。扫描是从一个公开的 Harbor 镜像仓库切进去的:那个项目对外开放,不用任何凭证就能匿名拉取 baseten/baseten-app 镜像。真正致命的不是镜像本身,是它的构建历史——Docker 镜像除了文件系统层,还有一份配置,里面 history[].created_by 记录了每一步构建命令。令牌就藏在那里,来自 2023 年 3 月的一次构建:当时有人把 GITHUB_TOKEN 直接展开进了构建命令,而这个令牌没有设过期。
时间线是这样的:7 月 13 日深夜报告,7 月 14 日早上那个 Harbor 项目被改成私有,当天下午 Baseten 安全团队确认这是严重问题并轮换了令牌,7 月 17 日其余问题关闭,9 月双方对外公开。从报告到修好不到一天,这一部分做得比多数公司好。
但有两件事值得记住。第一,令牌三年没换,说明「没出事」和「没问题」是两回事。第二,评论区里有人点出一个容易被忽略的细节:GitHub 自带的密钥扫描读的是仓库内容,不读镜像层,所以这条路径它扫不出来;更稳的做法是别用构建参数传密钥,改成挂载式注入,或者确认构建产物里不带构建元数据。
这是扫描方自己发布的单次黑盒结果,而它正好在卖同类产品,动机上不算中立;扫描只覆盖一个域名的暴露面,不代表平台整体安全水平;HN 上也有争议,有人认为拿 130 亿美元估值的公司只回赠了几件卫衣不太好看。
我的判断:这件事对读者更有用的一面不是看别人翻车,而是一条五分钟的自查——用自己的账号跑一遍 docker history --no-trunc,把镜像的构建历史读出来,看有没有哪一步把密钥写进去了;顺手确认构建用的令牌有没有过期、有没有被给到管理员权限。
