一把舊黃銅掛鎖扣在生鏽的鐵鍊上,鐵鍊繞在樹幹旁
示意圖,與 GitHub 無關。Dori 攝,CC BY 2.5,Wikimedia Commons。
資安GitHub供應鏈安全

GitHub Actions 鎖定檔正式上線,免費方案也能用:已導入的流程裡,借用的 Action 與間接依賴可固定在確切 commit,標籤被移動也不會跑到新程式碼;push protection 同日加入 AI 判斷沒有固定格式的密鑰(公開預覽、另計 AI 點數)

台灣的公司或個人開發者,如果把程式推上 GitHub 後交給 GitHub Actions 自動測試、自動部署到雲端或公司主機,部署用的金鑰也就交給了這些自動流程。GitHub 10 月 28 日(美國時間)宣布「工作流程鎖定檔」正式上線,免費(Free)、Team 與 Enterprise Cloud 方案都能用:自動流程裡借用的別人寫好的工具(Action),可以固定在確切的一版程式碼。就算對方的版本標籤被人改指到別的程式碼,導入鎖定檔的流程也只跑你鎖住的那一版;那一版若已無法從原本的標籤追溯到,GitHub 會拒絕執行,不會改跑新程式碼。同一天,GitHub 的「推送保護」(push protection)新增一項公開預覽功能,用 AI 擋下沒有固定格式的密碼與金鑰,但要另外付費。

以下說明鎖定檔防哪種攻擊、管不到什麼,以及 AI 推送保護誰能用、怎麼收費。

標籤會被移動,這就是破口

寫自動流程(workflow)時,大家習慣寫 uses: 某某/deploy-action@v3,意思是「用這個工具的 v3 版」。GitHub 文件寫:「標籤和分支可以移動。因此,實際執行的程式碼不保證是流程作者當初審過的那一份。」(本站譯)上游帳號被盜、標籤被改指,你的專案就可能執行惡意程式。

這不是假設。2025 年 3 月,熱門工具 tj-actions/changed-files 被入侵,GitHub 的安全公告記載,攻擊者「回頭修改了多個版本標籤」(本站譯),讓它們指向惡意 commit,把自動流程裡的密鑰印進執行紀錄;公告寫受影響的程式碼庫超過 23,000 個;執行紀錄公開的專案,印出來的密鑰其他人也讀得到。

打個比方:標籤像貨架上「v3」的牌子,可以被移到另一箱貨前面;鎖定檔記下那一箱的出廠序號,核對不過就停止出貨。比喻的極限是,序號只保證「同一箱」,不保證箱裡的東西安全。GitHub 自己也寫:「鎖定檔不判斷依賴項目是否安全,鎖定前請先審查。」(本站譯)

鎖定檔怎麼運作,管不到什麼

鎖定檔是程式碼庫裡的一個檔案 .github/workflows/actions.lock,用 GitHub 命令列工具的擴充套件 gh actions-lock 產生,官方說不要手動改。它替涵蓋到的 Action 記下引用的標籤或分支、確切的 commit(程式碼版本的唯一編號),以及來源擁有者與程式碼庫的數字 ID。執行時 GitHub 會核對:名稱背後還是不是當初那個程式碼庫,鎖住的 commit 能不能從記錄的標籤或分支追溯到;只存在於分叉(fork)裡、或已追溯不到的 commit,會被拒絕。它也涵蓋「間接依賴」,也就是你用的 Action 自己又引用的其他 Action。以前 GitHub 建議在流程檔裡把每個 Action 寫成 40 碼的 commit 編號;文件現在說,已導入鎖定檔的流程不必再這樣寫。

正式版可以一個流程一個流程慢慢導入;Dependabot(GitHub 的自動更新機器人)提出 Action 升級時,會在同一個合併請求裡一起更新鎖定檔;管理員可用「Require lockfile」政策強制採用;也能在 CI 裡檢查鎖定檔有沒有過期。功能在 10 月 14 日先開放公開預覽,兩週後轉正式。

它管不到的地方,官方列了:呼叫「可重複使用工作流程」這一步不會被鎖,要自己寫完整 commit 編號,那份流程裡用到的 Action 則由它所在程式碼庫的鎖定檔管;以 ./ 開頭引用的本機 Action 不會被追蹤,裡面若又引用遠端 Action,工具會報錯,要照說明改寫引用方式或明確選擇略過;容器映像檔不會被鎖,要用 @sha256: 摘要值固定;輸入參數、密鑰、執行環境映像檔也不在範圍內;自架的 GitHub Enterprise Server 目前不支援這個工具。有人在鎖定檔裡把浮動標籤(例如 v4)改回同一條歷史上的舊 commit,工具也偵測不到,所以鎖定檔的變更仍要有人看。

AI 推送保護:擋的是沒有固定格式的密鑰

推送保護是開發者把程式推上 GitHub 時,先檢查有沒有夾帶它認得的密碼或金鑰,偵測到就封鎖。這次預覽的是推送保護裡新增的「封鎖 AI 偵測密鑰」。過去它靠「預先定義的格式」辨認,例如某家雲端金鑰固定的開頭字樣。新功能加了一個和微軟 Applied Sciences 合作開發的分類模型,看可疑字串在程式碼裡怎麼被使用,沒有固定格式的密鑰(例如自己設的資料庫密碼)也能擋。GitHub 說初期結果中,推送保護攔到密鑰的推送次數「增加超過一倍」(本站譯),使用者回報的精確率(precision),可與密鑰掃描合作夥伴中、由金鑰發行商定義的偵測器相比;這是 GitHub 自己的數據,這篇更新紀錄沒有交代樣本大小。

誰能用:github.com 上買了 GitHub Secret Protection 或 GitHub Advanced Security 的組織,程式碼庫要先開啟推送保護與「AI 偵測密鑰」掃描,再另外打開預設關閉的「Block AI-detected secrets」。官方價目頁列 Secret Protection 每位活躍提交者每月 19 美元,約新台幣 616 元(臺灣銀行 2026 年 10 月 29 日 07:23 讀取的美元即期買賣中間價 32.42 元,本站換算)。AI 推送保護另外消耗 AI 點數(AI credits),開啟後開始計費;每次偵測耗多少點,更新紀錄沒有寫。推送後掃描產生的 AI 偵測警示,仍含在原方案內。被擋下時,要把密鑰從這次推送的每一個 commit 移除再推,原有的繞過與委派核准機制照樣適用;AI 代理則要先取得授權才能繞過。

對台灣用戶的意義

已知的是:鎖定檔開放給免費方案,個人開發者與小團隊都能用,更新紀錄沒有提到另外收費。本站的讀法:用 Actions 自動部署、又讓流程取用雲端金鑰的台灣團隊,如果部署流程已導入鎖定檔,而且鎖住的是審查過、未遭竄改的 commit,那麼 tj-actions 那種單純改指標籤的手法,就沒辦法讓這些 Action 改跑惡意版本。代價是多一個要維護的檔案。除非管理員用 Require lockfile 政策強制,要不要導入由各團隊自己決定。同樣是本站的讀法:還沒買上述資安方案的小團隊,目前開不了 AI 推送保護;實際能多擋多少,要等更多回報才判斷得了。

原文 GitHub 更新紀錄〈GitHub Actions workflow lockfiles are generally available〉(2026-10-28),正式上線日期、適用方案、正式版功能與「不判斷依賴是否安全」一句取自此頁; 〈GitHub Actions workflow lockfiles in public preview〉(2026-10-14),公開預覽日期取自此頁; GitHub Docs〈Workflow dependency lockfiles〉,標籤會移動的說明、鎖定檔記錄的欄位、間接依賴、可重複使用工作流程與其他不涵蓋範圍、與 SHA 釘選的比較取自此頁; gh-actions-lock 工具說明,不支援 GitHub Enterprise Server、容器映像檔不鎖、浮動標籤改回舊 commit 偵測不到等限制取自此頁; GitHub 更新紀錄〈Push protection beyond predefined secret patterns〉(2026-10-28),AI 推送保護的原理、初期成效、適用對象、開啟條件與 AI 點數計費取自此頁; GitHub 安全公告 GHSA-mrrh-fwg8-r2c3,tj-actions/changed-files 事件的經過與受影響數字取自此頁; GitHub 資安方案價目頁,Secret Protection 月費取自此頁(2026-10-29 讀取); 臺灣銀行牌告匯率,新台幣換算所用匯率。