一家資安廠商在評估 Baseten 作為推論服務供應商時,把自動掃描代理指向這家公司的網域,既沒有提供憑證,也沒有提供原始碼。大約 25 分鐘後,代理手上已經有一組對內部儲存庫具備管理員權限的 GitHub 權杖。Strix 於 9 月 1 日公開這份揭露報告,距離 Baseten 修補完成已過了七週。
重點摘要
- 這組憑證在 2023 年 3 月 3 日被寫入容器映像檔的建置歷程,到 2026 年 7 月受測時仍可通過驗證。
- 權杖帶有 repo 範圍,對 Baseten 的主要產品儲存庫、驅動叢集的 GitOps 儲存庫以及 Homebrew tap 都握有管理員與推送權限。
- Baseten 資安團隊在收到通報後約 17 小時內,把登錄伺服器改為私有並輪替了權杖。
掃描是怎麼走到這一步的
整個過程從一般的偵察開始:列舉主機、查閱憑證透明度紀錄,結果在 Baseten 的子網域上發現一台 Harbor 容器登錄伺服器。Harbor 以專案為單位管理映像檔,而這台主機上有一個專案是公開的。列出其中的儲存庫、取得匿名 pull 權限、下載 manifest 與 blob,全程都不需要任何權杖,其中就包含一個名為 baseten/baseten-app 的映像檔。
登錄伺服器暴露在外本身不算什麼,許多公司本來就刻意公開映像檔。真正的問題在於映像檔裡放了什麼。第一個發現是一組 AWS 金鑰,但已經失效,讀取身分的唯讀呼叫回傳了權杖無效的錯誤。代理沒有停手,繼續拉下各層內容,執行開源掃描工具 TruffleHog,接著不只看檔案系統,還讀了映像檔的設定檔。
憑證藏在中繼資料,不在檔案裡
權杖出現在建置歷程的 created_by 欄位,那是記錄每一層由哪道指令產生的地方。出問題的步驟,為了透過 Git 抓取私有相依套件,直接把 GITHUB_TOKEN 這個建置參數展開寫進 RUN 指令。Docker 會把這段歷程存進映像檔設定,而設定會隨映像檔一起下載。
這才是值得記住的細節:就算把憑證檔案從某一層刪掉,只要建置歷程裡還留著副本,刪除就等於白做。如果建置過程又把帶有驗證資訊的遠端網址寫進全域 Git 設定,副本還會再多一份。
一次唯讀的 GitHub 請求,對一個名為 basetenbot 的帳號回傳 200,該帳號帶有 repo 範圍,並且隸屬於 basetenlabs 組織。逐一檢查儲存庫後發現,其中三個具備管理員與推送權限,另有多個私有儲存庫(包括客戶專屬儲存庫)可讀可寫。Strix 表示自己到此為止,沒有複製、沒有推送、也沒有更動任何設定,隨即寄出揭露信。
反應速度很快
報告中的時間線,以廠商通報而言相當緊湊。Strix 在 7 月 13 日晚間 11 點 10 分提出通報;隔天早上 Harbor 專案已改為私有,但權杖本身仍然有效。7 月 14 日下午 4 點 34 分,Baseten 確認此事為重大問題,表示已輪替權杖,並要求研究人員安全刪除下載的映像檔,對方在半小時後回覆已完成。其餘發現於 7 月 17 日結案,Baseten 也在文章發布前檢視過草稿。
舊映像檔為何一再出事
估值 130 億美元的 Baseten,在工具與資安意識上並不落後,揭露內容也提到這家公司本身就在運行自家的 AI 資安工具。真正的疏失在於:2023 年留下的建置產物,在周邊程式碼改版之後,從來沒有被當成攻擊面的一部分來管理。改 Dockerfile 無法改變別人早就拉走的映像檔,所以關鍵動作是撤銷憑證,而不是修補程式碼。
建議的做法是改用 BuildKit 的 secret mount,讓憑證根本不會留存,接著同時檢查各層內容與建置歷程。這類問題在軟體供應鏈上反覆出現,例如一個累計 2.45 億次下載的套件,遭投毒的版本在線上存活了 86 分鐘。
這件事還有另一個看點:找出問題的是誰。一個 AI 代理自行把偵察、登錄伺服器列舉、一條死路的憑證、中繼資料搜尋與權限盤點串成一氣,沒有人叫它去找 Harbor,也沒有人叫它去找權杖。這種能力,並不專屬於簽約前對 Baseten 做盡職調查的廠商。
常見問題
客戶資料有被存取嗎?
沒有。Strix 表示自己只用唯讀的 GitHub 請求確認權杖的權限範圍就停手,沒有複製可存取的客戶儲存庫、沒有推送程式碼,也沒有更動任何設定,並應 Baseten 要求刪除了先前下載的容器映像檔。
檔案是乾淨的,權杖是怎麼外流的?
它記錄在容器映像檔的建置歷程裡,而不是某個檔案中。Docker 會把產生每一層的指令存進映像檔設定,而這次建置直接把權杖值插進 RUN 指令,該設定又會隨映像檔一併下載。
建置用的憑證應該怎麼處理?
改用 BuildKit 的 secret mount,讓憑證只在建置期間可用,不會留在映像檔或其中繼資料裡。既有映像檔應同時稽核各層內容與建置歷程,而在已公開映像檔中找到的憑證,必須撤銷,而不是刪掉了事。


