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 與安裝腳本盤點三件事:
rg -n 'codeql|linux64|arm64|x86_64|codeql\.zip' \ .github scripts Makefile package.json 2>/dev/null || trueuname -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 根目錄盤點引用:
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 是否有預期差異。可以用下列檢查整理分支中的變更:
# 只看 CodeQL 相關設定與 query 變更git diff -- .github/workflows .github/codeql codeql
# 確認不再載入已移除的 modulerg -n 'SelfHostedQuery|codeql\.actions\.security' \ .github codeql 2>/dev/null || true接著在測試 repository 或 pull request 執行既有的 code scanning workflow,確認:
- query pack 可以成功解析,沒有 import 或 compilation error。
- GitHub Actions job 的
permissions、runner 與 secrets 行為沒有因遷移被放寬。 - 原本應該存在的 finding 仍能出現,預期消失的 finding 有留下原因。
- 若 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
GitHub Changelog:CodeQL 2.26.3 improves GitHub Actions queries and JavaScript modeling
回報錯字、失效連結,或告訴我你想看的延伸主題。