編按:本文綜合整理自 Strix 官方部落格(事件揭露報告)、Hacker News 討論串(#49646752)、The Hacker News 與 El Solitario 二手報導,並加入 Siami 編輯部觀點與技術解讀。Strix 是專門做 AI 自動滲透測試的公司,本文描述的是他們對 AI 推論平台 Baseten 主動進行安全掃描後的負責任揭露(responsible disclosure)。
AI 滲透測試新創 Strix 在 9 月初公開一份安全研究報告,指出他們只給 AI 代理人一個網域名稱、沒有原始碼、沒有任何憑證,25 分鐘內就在 Baseten(一個估值約 130 億美元的 AI 推論平台)的公開 Docker 映像檔裡,找到一支 2023 年 build 留下的 GitHub personal access token(PAT),而且這支 token 至今仍然有效、擁有產品與部署倉庫的管理員權限。
事件時間軸:從 domain 到 admin token 只花 25 分鐘
Strix 在部落格詳述整個攻擊鏈,每一步都由他們自家的 AI 代理人「Strix」自動執行:
| 時間 | 動作 |
|---|---|
| T+0 | 給 Strix 一個 wildcard 網域 *.baseten.co,無原始碼、無憑證 |
| T+3 分鐘 | 列舉子網域、掃 certificate transparency log、定位 Harbor container registry 位於 gcp-us-east4-zlw.registry.baseten.co |
| T+8 分鐘 | 發現 Harbor 中有公開專案,無需認證即可列出 repos、取得匿名 pull token |
| T+15 分鐘 | Pull baseten/baseten-app 映像,dump 檔案層與 build config |
| T+22 分鐘 | 在映像的 history[].created_by 欄位中找到明文 GitHub PAT,呼叫 GET /user 確認為 basetenbot 帳號,scope 為 repo |
| T+25 分鐘 | 列舉 basetenbot 對 basetenlabs 組織下倉庫的權限,確認對 basetenlabs/b***、basetenlabs/f***、basetenlabs/h***(產品、GitOps、Homebrew tap)皆為 admin: true, push: true |
Strix 在確認這不是誤判後立刻停手、沒有 clone、沒有 push,並寫信給 Baseten 資安團隊進行負責任揭露。Baseten 在 24 小時內將 Harbor 專案改為 private、撤銷該 token,並在 7 月 17 日關閉剩餘的次要發現。作為感謝,Baseten 還寄了 T-shirt 與帽 T 給 Strix。
漏洞根因:ARG 傳 token 進 Docker build
這個漏洞的根因藏在一段 2023 年 3 月 3 日的 Dockerfile 裡,模式大概長這樣:
ARG GITHUB_TOKEN
RUN GITHUB_TOKEN=${GITHUB_TOKEN} bash -c '
if [[ "${GITHUB_TOKEN}" != "" ]]; then
git config --global --add \
url."https://***@github.com/".insteadOf "[email protected]:";
fi'
這段程式碼當年是為了解決「build 需要從 private repo 拉相依套件」的需求。Docker 官方文件有明確警告:ARG 傳進來的 secret 會被記錄在映像的 build history 與 metadata 裡,即使事後刪除檔案也救不回來。而且 git config --global 會把含 token 的 URL 寫進 ~/.gitconfig,同樣會被一起打包進映像。
更糟的是,這支 token 的 scope 是整個 repo——代表它對 Baseten 整個 GitHub 組織的所有私人倉庫(包括每個客戶專屬的部署倉庫)都有 admin 與 push 權限,而它的有效期限超過 3 年。
Strix 在部落格中引用 Docker 官方警告:「Build arguments are recorded in the image’s history. Don’t use them for secrets.」並指出正確做法應該是 BuildKit secret mount(
--mount=type=secret),這樣 token 只在 build 期間存在於記憶體,不會被打包進任何 layer 或 history。
🚨 為什麼這件事重要
這次事件值得整個產業警惕,理由有三:
第一,受害方不是小公司。Baseten 是估值約 130 億美元、許多嚴肅企業都用來跑生產環境 AI 推論的平台。他們的資安團隊「已經在使用 AI 資安工具」、「在 24 小時內修復」——但漏洞還是從 2023 年沉睡到 2026 年才被發現。
第二,AI 代理人改變了攻擊成本曲線。過去這類供應鏈漏洞需要專業白帽花數天手工測試,現在一個 AI 代理在 25 分鐘內就走完整條鏈。Strix 強調,他們沒有給代理人 Harbor 的任何提示、沒有指定尋找 token——「它只是像一個真正的駭客一樣工作」。
第三,設定漂移(configuration drift)是看不見的定時炸彈。Harbor 預設專案是 private 的,但只要某個工程師在某一天把它勾成 public,就再也沒人會回去檢查。Token 也是同理——build 結束就忘了,直到三年後一支 AI 代理人把它撈出來。
🚨 數據解讀與質疑
幾個值得追問的數字:
- 25 分鐘 vs 3 年——漏洞從 2023 年 3 月沉睡到 2026 年 7 月才被發現,中間超過 1,200 天。如果不是 Strix 帶有行銷意圖的揭露(他們是賣 AI 滲透測試工具的),這個漏洞可能還會繼續沉睡。
- 單一 token 多重 admin——一支 build 用 token 對產品倉庫、GitOps 倉庫(直接驅動線上叢集)、Homebrew tap 都有 admin/push,這代表入侵者可以同時植入後門、竊取客戶原始碼、影響所有用
brew install baseten-cli的開發者。 - 修復速度 vs 發現速度——Baseten 在 24 小時內修復,但發現卻花了 3 年。這之間存在巨大的偵測不對稱(detection asymmetry):攻擊者只要贏一次,防守者必須永遠贏。
- 為什麼
docker history沒有被任何掃描工具抓到?——主流 SCA(software composition analysis)工具通常掃檔案層,但很少人會主動 parsehistory[].created_by。這是一個工具鏈的集體盲點。
業界怎麼看
Hacker News 討論串(72 則留言、158 分)出現幾個高頻關鍵字:BuildKit secret mount、configuration drift、25 minutes、AI agent、pre-commit hook。資深 DevOps 普遍認為這是「2018 年就知道的反模式」,但承認「到 2026 年還是有團隊在犯」。
值得注意的相關事件:
- 2026 年 5 月 Grafana GitHub token 外洩:攻擊者透過洩漏的 token 下載了整個 codebase,與 Baseten 案同樣是「舊 token 沒撤銷」的典型案例。
- 2026 年 7 月 GitLost 研究:另一組安全研究人員騙過 GitHub 的 AI 代理人洩漏私人 repo 內容,顯示 AI 代理人本身就是新的攻擊面。
給團隊的具體檢查清單
如果你們也在用容器 + GitHub,至少應該做這五件事:
- 掃公開映像的 build history:
docker history --no-trunc <image>或直接 inspect config blob 的history[].created_by欄位,不只掃檔案層。 - 把所有 token 從 ARG 改成 BuildKit secret mount:
--mount=type=secret,id=github_token,並確保消費 secret 的指令不會把它寫回任何檔案。 - 檢查 Harbor / ECR / GCR 的 public 專案:很多團隊不知道自己有哪些專案被設成 public,可以用
harbor-cli project ls --public或平台原生指令列出。 - 限制 build token 的 scope:fetch private dependency 只需要該 dependency 的 read-only token,絕對不要給整個
reposcope,更不要設為無限期。 - token 強制過期 + 自動輪替:用 GitHub Apps 或 GitHub Actions 的
GITHUB_TOKEN自動產生的臨時憑證,絕對不要用 long-lived PAT。
編按:本文綜合整理自 Strix 官方部落格(事件揭露報告)、Hacker News 討論串(#49646752)、The Hacker News 與 El Solitario 二手報導,並加入 Siami 編輯部觀點與技術解讀。
網友熱門留言 (4)