CodeQL 2.26.3:Actions污点边界变了

发布时间:2026/8/25 4:35:03
CodeQL 2.26.3:Actions污点边界变了 CodeQL 2.26.3 这次更新里我最关注的不是新增了多少查询而是 GitHub Actions 的“可信输入边界”发生了几处很具体的调整。官方列出的变化包括merge_group 事件中的 github.event.merge_group 现在会被识别为不可信数据来源以及移除 codeql.actions.security.SelfHostedQuery原因很直接Runner Label 不能可靠区分 Self-hosted Runner 和 Managed Runner。这两条变化都在提醒同一件事CI 安全查询最容易犯的错误就是把“看起来像可信”的元数据当成真正可信边界。对写 GitHub Actions、自定义 CodeQL Query 和 Agent 自动修改 CI 的团队来说这个版本值得认真过一遍。merge_group为什么值得单独处理很多团队现在开启 Merge Queue。Workflow 可能监听on:merge_group:过去自定义查询如果只重点考虑pull_request pull_request_target workflow_dispatch很可能漏掉merge_group的输入传播。CodeQL 2.26.3 现在把github.event.merge_group识别为不可信数据。这意味着类似-run:|echo ${{ github.event.merge_group.some_field }}如果进一步进入Shell Path Environment就应该进入数据流分析。不可信不是等于“恶意”而是不能直接相信这是安全建模里很重要的区别。merge_group数据不是说一定来自攻击者。而是它受外部仓库事件影响所以如果直接进入高权限步骤就可能形成输入传播风险。例如Untrusted Event Data ↓ env ↓ shell ↓ privileged step这才是 CodeQL 真正在建模的东西。SelfHostedQuery被删很值得注意GitHub 明确说codeql.actions.security.SelfHostedQuery被移除因为runner labels 不能可靠区分 self-hosted 和 managed runner这非常现实。很多 Query 会写if label self-hosted then high risk问题是企业内部 Runner Label 往往是linux x64 large secure gpu internal甚至 Managed Runner 也可能有类似标签。所以字符串标签不是可靠的安全身份。如果你有自定义 Query 依赖这个模块需要尽快改。Runner身份最好来自确定性配置源企业内部可以维护Runner Group ID Runner Registration Source Org Policy Environment而不是从 YAML Label 猜。安全逻辑runner_is_trusted最好来自组织配置而不是名字里有没有 self-hostedCodeQL 2.26.3还修了Actions缓存投毒判断官方提到多条actions/cache-poisoning/code-injection actions/cache-poisoning/direct-cache actions/cache-poisoning/poisonable-step现在会考虑低信任触发器对默认分支 Cache Scope 是否拥有read-only如果低信任事件只能读取缓存不能写不应该继续把它判成可投毒路径这能减少误报。安全扫描真正有用的前提不是“报得多”。而是Source → Data Flow → Sink → 权限都建模正确。为什么Cache Poisoning特别容易误报假设pull_request只能读默认分支 Cache。Query 如果只看到低信任事件 Cache就报警Possible Poisoning会产生大量无效告警。真正投毒还需要attacker can write cache所以权限语义必须进入数据流模型。envvar injection也更严格了2.26.3 调整actions/envvar-injection/critical要求untrusted source 和 privileged context 来自同一个 trigger event同时不再把 PR Head Label 当作可注入换行的来源因为它不能包含换行。这也是很典型的误报修正。如果一个 Query 没理解字段实际字符约束只因为它“用户可控”就判注入噪声会很大。写自定义Query时别只问“是否用户可控”还要问可控到什么程度 允许哪些字符 在哪个事件里 是否同一个信任边界 最终Sink如何解析例如branch name label title body environment虽然都可能是外部输入但风险完全不同。CodeQL还修了output clobbering的性能问题官方说明actions/output-clobbering/high不再对仍保持 JSON Encode 的简单jqPath Filter 报警同时修复了由未转义正则输入引起的性能问题。这一条对大型仓库很重要。静态分析如果一个 Query 自己跑得过慢扫描超时 CI排队 开发者关闭规则最后安全收益反而下降。所以 Query Performance 本身也是工程质量。我会给自定义Query做性能基线至少记录Repo Size Query Time Peak Memory Result Count每次 CodeQL 版本升级后重跑。例如codeql-regression:max-query-time-regression:20%max-alert-growth:30%如果某个 Query结果从 20 条变 1200 条不要直接上线。先看是真发现更多 还是模型变化制造噪声JavaScript/Vue这次也补了几个真实数据流模型官方新增ref shallowRef toRef reactive computed等 Vue Composition API Helper 的 Flow Model。同时useRoute()的query params path fullPath hash被识别为客户端远程数据来源。这会直接影响XSS Path Injection URL相关数据流的发现能力。如果你的前端大量使用 Vue 3这个版本比单纯 Actions 更新更值得升级。一个Vue Router例子constrouteuseRoute()constnextroute.query.next window.location.hrefnextroute.query.next本质上来自 URL。如果 Query 模型不知道useRoute()是 Source后面的数据流可能根本连不起来。2.26.3 把这层模型补上以后类似路径更容易进入分析。Sails Action2也被补成Remote Source声明的inputs现在会被识别为远程数据源。这可能影响js/path-injection等查询。如果你有 Sails 老项目这类框架模型比新增一条泛化 Query 更有价值。fastify/rate-limit也被识别了js/missing-rate-limiting现在认识fastify/rate-limit这能降低一种常见误报实际上已经有Rate Limit 但分析器不认识框架框架模型越准确安全报告才越有用。升级CodeQL前我会做两组回归第一组Alert Regression比较旧版 新版每个 Query新增多少 消失多少 Severity变化第二组Performance Regression比较扫描时间 CPU Memory不要只看“新版支持更多规则”一个升级报告{from:2.26.2,to:2.26.3,new_alerts:38,resolved_by_model_change:12,query_time_delta:8.4%,critical_new:2,custom_query_failures:[internal/self-hosted-runner-check]}尤其要找custom_query_failures因为SelfHostedQuery这类 Breaking Change 会直接让内部 Query Pack 失败。自定义Query必须固定CodeQL版本测试如果你维护security/codeql-customCI 至少跑当前生产版本 目标升级版本避免 GitHub.com 自动升级后自定义 Query 才突然坏。GitHub.com 会自动部署新版 CodeQLGHES 则会在未来版本包含这些功能旧 GHES 可以手动升级 CodeQL。环境不同升级节奏也要分开管理。Agent自动改Workflow时更应该先跑CodeQLCoding Agent 很喜欢修改.github/workflows/*.yml而 Workflow 本身就是高风险代码。我会给 Agent 的 PR Gate 单独加Actions CodeQL而且Workflow Change一律提高 Review Risk。ifpath.startswith(.github/workflows/):risk5不要把 CI YAML 当普通配置。一个最小CI Gatesecurity:codeql:version:2.26.3required:-actions-javascript-typescriptblock:severity:-critical-high如果有自定义 Query Pack再锁pack version避免环境漂移。CodeQL 2.26.3 这次最值得关注的不是“多支持了几个框架”。而是它连续修正了几种信任边界建模包括merge_group runner identity cache write capability event source relation Vue route source这类变化决定静态分析到底是在理解真实攻击路径还是只做字符串匹配。对企业来说升级 CodeQL 最重要的动作也不是点击“升级”。而是跑一遍Query Compatibility Alert Delta Performance Delta特别是内部自定义 GitHub Actions Query。因为安全扫描器的版本变化本身也应该像业务代码一样进入回归测试。