2544 字
13 分鐘

CodeQL 2.27.0 升級怎麼查?從 Linux ARM64 到 SelfHostedQuery

GitHub 在 2026 年 9 月 9 日發布 CodeQL 2.27.0,新增原生 Linux ARM64 CLI 發行包、延伸 C# 與 Java/Kotlin 分析,並加入 Rust query。這次更新要和 8 月 19 日 CodeQL 2.26.3 移除 codeql.actions.security.SelfHostedQuery、以及 9 月 3 日 2.26.4 的 GitHub Actions 偵測調整放在一起看:前者可能讓自訂 query 無法載入,後兩者則可能讓 finding 位置或數量改變。

這篇的重點不是找一個可以直接替換的神奇 module,也不是把每個新 finding 都當成誤報。先盤點 query 與 runner 架構,再處理 SelfHostedQuery、CodeQL 2.27.0 的 CLI 下載方式與 2.26.x 的 finding 變化,最後用 code scanning 驗證 query 能編譯、結果可解釋。

CodeQL 2.27.0:Linux ARM64 要改成按架構取 CLI#

CodeQL 2.27.0 提供 Linux ARM64 的原生 CLI/bundle。這對使用 ARM64 self-hosted runner、ARM 架構建置主機,或自行快取 CodeQL CLI 的團隊最有感:下載與快取流程不能再假設所有 Linux runner 都是 x64,也不要把已標示 deprecated 的通用多平台 codeql.zip 當成長期介面。

先在 workflow 與安裝腳本盤點三件事:

Terminal window
rg -n 'codeql|linux64|arm64|x86_64|codeql\.zip' \
.github scripts Makefile package.json 2>/dev/null || true
uname -m

接著讓 runner 架構成為下載與 cache key 的明確輸入:

情境升級檢查常見漏點
GitHub-hosted Linux runner確認使用的 Action/CLI 會選到正確平台linux64 路徑寫死在共用腳本
ARM64 self-hosted runner使用 Linux ARM64 發行包,並讓 cache key 包含 arm64沿用 x64 binary 或把兩種架構共用 cache
既有 codeql.zip 下載器改成按平台選擇的發行資產並在測試分支驗證只改 URL,沒有測試 CLI 啟動與 query pack

這是工具鏈的部署邊界,不代表 ARM64 會自動修正 query 或 workflow 權限。升級後仍要執行一次完整分析,確認 database 建立、query pack 載入與 SARIF 上傳都成功。

此外,CodeQL 2.27.0 把 Java 9 與 Java 10 標為 deprecated,官方說明預計在 2027 年 1 月移除相關支援。如果你的分析矩陣仍包含這兩個版本,現在就應把它們列為 migration work,而不是等 CLI 下一次升級才處理。

先確認你是否真的使用了這個 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。

CodeQL 2.26.x:GitHub Actions finding 變多時先看規則變化#

2.26.4 的 GitHub Actions query 調整,可能讓同一個 workflow 在升級後出現新的 finding 或不同的 alert 位置。先把變化分成「偵測能力變強」和「原本的安全假設不再成立」,不要直接回退 CodeQL:

2.26.4 變更可能看到的結果盤點方向
event payload 的 actor field 只在事件真的提供該欄位時才算 protection使用 ControlCheck 的 query 可能出現更多 alert確認 workflow 觸發事件是否真的填入該 actor field
actions/unpinned-tag 開始偵測 reusable workflow 的 mutable reference原本只檢查 action tag 的 repository 可能新增 finding搜尋 reusable workflow 是否使用 branch 或未固定 tag
EnvironmentCheck 可透過 models-as-data 指定,ControlCheck 對 sanitizer 的判斷更細environment 不再足夠當 sanitizer 時可能出現更多結果重新檢查 environment protection、輸入來源與實際 sink

GitHub 的說明也列出其他語言的變化,例如 Rust data flow alert 會依實際 source/sink 調整位置,部分 alert 會關閉後以新位置重新出現。這種「舊 alert 關閉、新 alert 出現」不一定代表風險新增,但應在 code scanning diff 中留下對照。

為什麼不能把 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.4 也改善多個 Actions query 的路徑與判斷,因此 finding 的位置或數量改變不一定是 query 遷移失敗。先對照官方 changelog,再逐一檢查 workflow diff;不要把所有新增 finding 都當成誤報。

GitHub.com 與 GHES 的版本邊界#

GitHub 表示 GitHub.com 會自動部署新的 CodeQL 版本;未來的 GitHub Enterprise Server release 會包含 2.27.0,較舊的 GHES 版本則要依平台文件與可用的 CodeQL bundle 評估手動升級。這代表同一個 query pack 在不同環境可能同時遇到「已移除 module」、「CLI 架構不同」與「尚未更新」三種狀態。

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

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

SelfHostedQuery 被移除不是把 import 路徑換掉就結束;CodeQL 2.27.0 也提醒自訂工具鏈不能假設 runner 架構固定。先用 rg 盤點直接與間接依賴,讓 CLI 下載/cache 按架構分流,再依 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: CodeQL 2.27.0 會影響舊版 GHES 嗎?#

A: GitHub.com 會自動部署新的 CodeQL 版本;未來 GHES release 會包含 2.27.0,舊版 GHES 是否能使用則取決於平台支援的 Action/CLI 與手動 bundle。先確認 GHES、runner 架構、CodeQL Action/CLI 與 query pack 版本,再決定要同步遷移或等待平台更新。

Q: 我沒有 ARM64 runner,還需要處理 2.27.0 嗎?#

A: 仍應檢查下載器與 cache key,但不必為了公告立刻新增 ARM64 runner。若所有 runner 都是 x64,先確認現有 Linux 資產仍能啟動、通用 codeql.zip 沒有被腳本當成長期依賴,並在升級後保留一次完整掃描結果。

參考資料:

GitHub Changelog:CodeQL 2.26.4 improves GitHub Actions security detections

GitHub Changelog:CodeQL 2.27.0 adds support for Linux ARM64

CodeQL CLI 2.27.0 changelog

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.27.0 升級怎麼查?從 Linux ARM64 到 SelfHostedQuery
https://laplusda.com/posts/github-codeql-2-26-3-selfhostedquery/
作者
Zero
發佈於
2026-08-24
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

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