1746 字
9 分鐘

CodeQL 2.26.3 移除 SelfHostedQuery 怎麼辦?先盤點自訂 GitHub Actions query

GitHub 在 2026 年 8 月 19 日發布 CodeQL 2.26.3,這次更新除了改善 GitHub Actions 與 JavaScript/TypeScript 的分析,也移除了 codeql.actions.security.SelfHostedQuery module。這是一個會影響自訂 query 的 breaking change;如果 repository 只使用 GitHub 內建 query suite,通常不需要為了這個 module 手動改 workflow,但仍應知道如何確認。

這篇的重點不是找一個可以直接替換的神奇 module。GitHub 移除它的理由是 runner labels 不能可靠區分 self-hosted runner 與 managed runner。先找出哪些自訂 query 依賴它,再把「runner 身分判斷」從靜態安全結論中拆開,最後用 code scanning 驗證 query 仍能編譯與產生預期結果。

先確認你是否真的使用了這個 module#

GitHub 會自動把新的 CodeQL 版本部署到 GitHub.com 的 code scanning;如果你使用 advanced setup、遠端 query pack 或 repository 內的 .ql 檔案,先在 repository 根目錄盤點引用:

Terminal window
rg -n 'SelfHostedQuery|codeql\.actions\.security' \
.github codeql 2>/dev/null || true

接著把搜尋結果分成三類:

搜尋結果判斷方式下一步
只出現在 changelog、文件或測試 fixture沒有被正式 query 載入不要為了字串出現就修改 production workflow
.ql.qlref 直接 import module自訂 query 依賴已移除的 API進入 query 設計檢查與分支驗證
query pack 或中央設定檔間接載入依賴可能不在目前 repository查 pack 版本、來源與 code scanning log

如果你只使用 default setup,仍可參考 GitHub Code Scanning default setup 的中央設定檔;那篇處理的是設定檔如何套用,不是這次被移除的 query module。

為什麼不能把 runner label 當成安全邊界#

SelfHostedQuery 原本提供的是與 self-hosted runner 判斷相關的 query 能力。GitHub 在 2.26.3 的說明中指出,runner labels 並不能可靠地區分 self-hosted 與 managed runner,因此把這個 module 移除。

這裡有一個容易誤判的地方:工作流裡的 runs-on 字串可以描述選擇條件,卻不等於一個經過驗證的信任根。若自訂 query 把某個 label 名稱直接當成「一定是自架 runner」或「一定不是自架 runner」,query 可能輸出看似精準、實際上不可靠的安全結論。

因此,遷移時不要只把 import 換成另一個名稱相近的 API,也不要用 runs-on 的字串比對把原問題搬到 query 裡。先寫清楚這條 query 真正要回答的是:

  • 哪個 workflow 會接受不受信任的輸入?
  • 哪個 job 會在較高權限的 context 執行?
  • 哪個步驟會把輸入帶到 shell、action、artifact 或 cache?
  • 這個風險是否應由 CodeQL finding、repository ruleset 或 runner 管理政策處理?

依依賴目的選擇遷移方向#

官方 changelog 沒有提供一個一對一的替代 module,因為原本的判斷本身就不應再被當作可靠條件。可以依自訂 query 的目的做保守分流:

只為了標出 self-hosted runner#

如果 query 的唯一用途是用 label 推斷「這個 job 跑在 self-hosted runner」,先把這個 query 從 production pack 移除或改為報告型檢查,不要在沒有可驗證證據時保留一個看似嚴格的安全 finding。Runner 的允許範圍、隔離方式與敏感工作流的核准,應交由 runner 註冊與 GitHub Actions 的權限政策管理。

還有其他 workflow 資料流分析#

如果 query 同時追蹤 untrusted input、expression 或 privileged context,先保留與資料流相關、能用具體 source/sink 證明的部分,移除對 SelfHostedQuery 的依賴。每次修改只做一個目的,讓 code scanning 的 alert diff 能回答「哪個判斷改變了」。

依賴來自遠端 query pack#

不要直接把 repository 裡的字串刪掉就當成完成。先找 pack 的版本與來源,確認維護者是否已發布相容版本;如果 pack 沒有更新,將它放進隔離分支測試,並把目前 CodeQL 版本、query pack 版本與編譯錯誤記錄給維護者。

用測試分支驗證 query,而不是直接改 default branch#

遷移應至少保留三份證據:query 是否能載入、workflow 是否仍成功、finding 是否有預期差異。可以用下列檢查整理分支中的變更:

Terminal window
# 只看 CodeQL 相關設定與 query 變更
git diff -- .github/workflows .github/codeql codeql
# 確認不再載入已移除的 module
rg -n 'SelfHostedQuery|codeql\.actions\.security' \
.github codeql 2>/dev/null || true

接著在測試 repository 或 pull request 執行既有的 code scanning workflow,確認:

  1. query pack 可以成功解析,沒有 import 或 compilation error。
  2. GitHub Actions job 的 permissions、runner 與 secrets 行為沒有因遷移被放寬。
  3. 原本應該存在的 finding 仍能出現,預期消失的 finding 有留下原因。
  4. 若 query 是在 GHES 或本機 CodeQL CLI 執行,使用的 CodeQL 版本與 GitHub.com 的版本差異已被記錄。

CodeQL 2.26.3 也改善多個 Actions query 的路徑與判斷,因此 finding 的位置或數量改變不一定是 query 遷移失敗。先對照官方 changelog,再逐一檢查 workflow diff;不要把所有新增 finding 都當成誤報。

GitHub.com 與 GHES 的版本邊界#

GitHub 表示 GitHub.com 會自動部署 CodeQL 2.26.3;未來的 GitHub Enterprise Server release 會包含這項功能,較舊的 GHES 版本則可以手動升級 CodeQL。這代表同一個 query pack 在不同環境可能同時遇到「已移除 module」與「尚未更新」兩種狀態。

在 organization 的遷移紀錄中至少留下:平台(GitHub.com 或 GHES)、CodeQL Action/CLI 版本、query pack commit、編譯結果與 finding diff。這些資料比只寫「掃描已恢復」更容易在下一次升級時重現。

結論:移除不可靠的 runner 推論,保留可驗證的資料流#

SelfHostedQuery 被移除不是把 import 路徑換掉就結束,而是提醒自訂 query 不應把 runner label 當成安全邊界。先用 rg 盤點直接與間接依賴,依 query 目的拆出 runner 管理政策和 workflow 資料流分析,再在測試分支編譯、執行與比對 findings。若是遠端 pack,優先確認維護者的相容版本,不要在 production 中自行猜一個替代 API。

常見問題#

Q: 使用 CodeQL default setup 也要改 SelfHostedQuery 嗎?#

A: 先搜尋 repository 與中央 query pack 是否真的載入這個 module。只使用 GitHub 內建 query suite、沒有自訂 query 依賴時,不要為了版本公告直接修改 workflow;仍應在下一次掃描後確認 job 成功。

Q: 可以用 runs-on 的 label 取代 SelfHostedQuery 嗎?#

A: 不應直接這樣做。GitHub 移除該 module 的理由就是 runner labels 不能可靠區分 self-hosted 與 managed runner。若規則需要可信的執行環境邊界,應改由 runner 管理、repository policy 或可驗證的 workflow 資料流條件處理。

Q: 這次更新會影響舊版 GHES 嗎?#

A: GitHub.com 會自動部署 2.26.3;未來 GHES release 會包含這項功能,較舊 GHES 可以手動升級 CodeQL。先確認你的 GHES、CodeQL Action/CLI 與 query pack 版本,再決定要同步遷移或等待平台更新。

參考資料:

GitHub Changelog:CodeQL 2.26.3 improves GitHub Actions queries and JavaScript modeling

GitHub Docs:GitHub Actions queries for CodeQL analysis

CodeQL Query Help:GitHub Actions

CodeQL 2.26.3 移除 SelfHostedQuery 怎麼辦?先盤點自訂 GitHub Actions query
https://laplusda.com/posts/github-codeql-2-26-3-selfhostedquery/
作者
Zero
發佈於
2026-08-24
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。