实战解读 CodeQL Actions 查询:UnnecessaryUseOfAdvancedConfig 与工作流默认设置简化
静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载本指南围绕 CodeQL 仓库中actions/ql/src/Violations Of Best Practice/CodeQL/UnnecessaryUseOfAdvancedConfig.md这一查询文档展开深入解析它背后的检测规则、源码实现与测试用例。读完本文你将掌握CodeQL 查询是如何识别未使用任何自定义配置、本可直接采用默认设置Default Setup的 CodeQL 工作流的以及如何在自己的 GitHub Actions 仓库中运行并验证这条维护性最佳实践查询。一、这条查询要解决什么问题GitHub Code Scanning 的 CodeQL 分析有两种接入方式默认设置Default Setup与高级配置Advanced Setup。默认设置由 GitHub 托管、几乎零配置适合绝大多数仓库高级配置则通过提交.github/workflows/codeql.yml之类的自定义工作流引入github/codeql-action/init、autobuild、analyze等步骤以获得对语言矩阵、查询集、构建逻辑的完全控制。问题恰恰出现在用了高级配置却没用到任何高级能力的仓库上工作流完整复制了模板init步骤除了指定languages外没有设置任何其他参数既承担了自定义工作流的维护成本又没有享受默认设置的自动化和托管便利。CodeQL Actions 查询包codeql/actions-queries中的UnnecessaryUseOfAdvancedConfig查询正是为此而生。其官方查询文档即本指南对应的 Markdown 文件给出了两条核心结论Overview概述如果 CodeQL 工作流未使用任何自定义设置那么它可以简化——切换到 CodeQL 默认设置Default Setup即可。Recommendation建议如果仓库没有必须使用自定义配置的理由就切换到 CodeQL 默认设置。文档同时还引用了 GitHub 官方文档《Configuring Default Setup for a repository》作为参考依据。换言之这不是一条安全漏洞查询而是一条维护性maintainability最佳实践查询用于降低仓库中 GitHub Actions 工作流的冗余复杂度。二、查询的元数据与定位查询本体位于 UnnecessaryUseOfAdvancedConfig.ql文件头部的元数据注释完整定义了它的身份/** * name Workflow Should Use Default Setup * description Workflows should use CodeQL Action with default setup instead of advanced configuration if there are no customizations * kind problem * problem.severity recommendation * precision high * id actions/unnecessary-use-of-advanced-config * tags actions * maintainability */这些元数据逐项说明了查询的性质元数据项值含义nameWorkflow Should Use Default Setup查询显示名称直译即工作流应使用默认设置description无自定义配置时工作流应使用 CodeQL Action 默认设置而非高级配置一句话概括检测目标kindproblem查询输出类型为问题problemproblem.severityrecommendation严重级别为建议级非安全漏洞precisionhigh精确度标记为高误报率预期很低idactions/unnecessary-use-of-advanced-config查询唯一 ID用于结果去重与引用tagsactions、maintainability归入 actions 领域与可维护性主题从 qlpack.yml 可以看到该查询隶属于名为codeql/actions-queries的查询包extractor 为actions默认套件文件指向codeql-suites/actions-code-scanning.qls。该查询同时被收录进安全与质量套件 actions-security-and-quality.qls——这一点可以从集成测试的期望清单 actions-security-and-quality.qls.expected 中看到它的完整路径条目得到印证。三、检测逻辑源码级剖析查询主体极其精简全部核心逻辑都被抽到了共享库中import codeql.actions.Violations_Of_Best_Practices.DefaultableCodeQLInitiatlizeActionQuery from DefaultableCodeQLInitiatlizeActionQuery action select action, CodeQL Action could use default setup instead of advanced configuration.它导入共享库DefaultableCodeQLInitiatlizeActionQuery遍历所有可默认化的init步骤并输出固定消息CodeQL Action could use default setup instead of advanced configuration.CodeQL Action 可使用默认设置替代高级配置。真正的判定逻辑位于库文件 DefaultableCodeQLInitiatlizeActionQuery.qll全文只有两个构件3.1 类DefaultableCodeQLInitiatlizeActionQuery/** * Holds if workflow step uses the github/codeql-action/init action with no customizations. * e.g. * - name: Initialize * uses: github/codeql-action/initv2 * with: * languages: ruby, javascript */ class DefaultableCodeQLInitiatlizeActionQuery extends UsesStep { DefaultableCodeQLInitiatlizeActionQuery() { this.getCallee() github/codeql-action/init and not customizedWorkflowStep(this) } }该类的特征谓词characteristic predicate由两个条件组成调用目标匹配this.getCallee() github/codeql-action/init——即该工作流步骤调用的 Action 正是github/codeql-action/init未被自定义not customizedWorkflowStep(this)——该步骤没有携带任何自定义参数。只有同时满足这两点一个init步骤才会被判定为可以使用默认设置。3.2 谓词customizedWorkflowStep/** * Holds if the with: part of the workflow step contains any arguments for with: other than languages. * e.g. * - name: Initialize CodeQL * uses: github/codeql-action/initv3 * with: * languages: ${{ matrix.language }} * config-file: ./.github/codeql/${{ matrix.language }}/codeql-config.yml */ predicate customizedWorkflowStep(UsesStep codeQLInitStep) { exists(string arg | exists(codeQLInitStep.getArgument(arg)) and arg ! languages ) }这是整个规则最关键的细节自定义的判定标准是with:参数中是否存在除languages之外的任何参数。查询使用exists(string arg | exists(codeQLInitStep.getArgument(arg)) and arg ! languages)遍历步骤的全部with参数只要发现任意一个参数名不等于languages例如config-file、queries、packs、db-location等customizedWorkflowStep就成立进而init步骤不再可默认化查询不会报警反过来说只写languages语言矩阵的init步骤被认为是纯模板行为——语言列表本就是默认设置也能自动检测的内容不构成必须使用高级配置的理由。这个只认 languages、其余皆自定义的判定粒度保证了查询的precision high声明只要出现任何真正的自定义痕迹就不会误报而完全没有自定义痕迹的模板工作流则会被稳定地标记出来。四、测试用例正反两个工作流样本查询仓库内配有完整的 QL 测试位于 actions/ql/test/query-tests/Violations Of Best Practice/CodeQL/包含两个工作流样本、一个.qlref引用文件和一个.expected期望输出。4.1 反面样本应触发告警defaultable_workflow.yml 是一份照抄官方模板的典型工作流它配置了push、pull_request、schedule触发器通过 matrix 指定language: [javascript]随后依次执行actions/checkoutv4、github/codeql-action/initv3、autobuildv3与analyzev3。其中init步骤的完整写法是# Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/initv3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with to use these queries and those in the config file. # queries: ./path/to/local/query, your-org/your-repo/queriesmain注意queries:一行被注释掉了——with:下实际只有languages这一个参数。依据库中customizedWorkflowStep的判定arg ! languages无解该步骤即被判定为可默认化。期望输出文件 UnnecessaryUseOfAdvancedConfig.expected 精确记录了告警位置|| .github/workflows/defaultable_workflow.yml:44:9:55:6 | Uses Step | CodeQL Action could use default setup instead of advanced configuration. |该结果行的要素包括触发文件.github/workflows/defaultable_workflow.yml、位置区间44:9:55:6第 44 行第 9 列起、第 55 行第 6 列止恰好覆盖init步骤的整体范围、元素类型Uses Step以及告警消息。.qlref文件 UnnecessaryUseOfAdvancedConfig.qlref 则把测试目录指向查询本体供codeql test run驱动测试框架完成比对。4.2 正面样本不应触发告警should_be_using_advanced_setup.yml 则是一份确实需要高级配置的对照工作流其init步骤为- name: Initialize CodeQL uses: github/codeql-action/initv3 with: languages: ${{ matrix.language }} config-file: ./.github/codeql/${{ matrix.language }}/codeql-config.yml这里出现了第二个参数config-file指向仓库内的codeql-config.yml配置文件并按语言matrix.language区分配置。由于customizedWorkflowStep在遍历参数时命中config-file该步骤被判定为已自定义因此不会被查询标记。这个文件出现在同一测试目录但从未出现在.expected结果中正反两例共同验证了查询只报警真正无自定义的工作流这一行为边界。五、如何在自己的仓库中运行这条查询5.1 通过套件整体运行最直接的方式是随 CodeQL Actions 查询套件一起运行。在仓库根目录执行 CodeQL CLI 即可对某一 GitHub Actions 数据库运行安全与质量套件codeql database create actions-db --languageactions codeql database analyze actions-db \ --formatsarif-latest --outputresults.sarif \ actions/ql/src/codeql-suites/actions-security-and-quality.qlsUnnecessaryUseOfAdvancedConfig会随该套件被加载见集成测试期望清单 actions-security-and-quality.qls.expected 中第 28 行条目。也可以只运行代码质量相关套件或直接指定查询文件codeql database analyze actions-db \ --formatsarif-latest --outputresults.sarif \ actions/ql/src/Violations Of Best Practice/CodeQL/UnnecessaryUseOfAdvancedConfig.ql5.2 通过测试框架验证针对该查询已有的正反样本可以用 CodeQL 的测试机制做回归验证codeql test run \ actions/ql/test/query-tests/Violations Of Best Practice/CodeQL测试框架会依据 UnnecessaryUseOfAdvancedConfig.qlref 找到查询对两个工作流样本做分析并将实际输出与 UnnecessaryUseOfAdvancedConfig.expected 逐行比对——任何输出变化都会以测试失败的形式呈现这正是保证查询precision: high长期有效的机制。六、实战建议什么时候该听这条查询的结合查询文档的建议与实现细节可以给出如下落地方案优先采用默认设置新仓库或现有仓库若无特殊需求直接在 GitHub 仓库 Settings → Code security → Code scanning 中启用 Default Setup由 GitHub 托管 CodeQL 运行无需维护任何工作流文件这是文档 Recommendation 的直接落地。自查模板病工作流如果仓库目前用的是从模板生成的高级配置工作流且init步骤的with:里只有languages其余如queries、config-file全部保持注释或未使用就属于本查询的告警对象可考虑删除工作流文件、切换到默认设置。保留高级配置的合法场景查询并非要求所有仓库都放弃高级配置——只要with:中出现config-file、queries、packs等任一参数即视为有自定义需求而放行。需要自定义查询集、编译构建或精细语言矩阵的仓库继续使用高级配置是合理的。把维护性纳入质量门槛这类recommendation级别的查询适合加入代码扫描的定期评估流程配合maintainability标签在结果面板中统一筛选持续发现配置复杂度悄悄累积的工作流。一句话总结这条查询用极简的源码实现一个类、一个谓词捕捉了一个高频的仓库维护性问题——高级配置一旦失去自定义内容就应当回归默认设置而仓库内配套的正反测试样本则把这一最佳实践固化成了可回归、可验证的自动化规则。赞分享静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security项目地址https://gitcode.com/gh_mirrors/co/codeql点击查看免费下载相关推荐3个核心技术揭秘盲水印如何实现隐形版权保护3个核心技术揭秘盲水印如何实现隐形版权保护 你是否曾发现自己的原创图片被他人盗用却无法提供有力证据你是否担心水印破坏作品美感却又需要保护知识产权传统可静态分析SAST应用安全漏洞扫描代码质量CodeQL 实战检测与修复 GitHub Actions 工作流代码注入漏洞CWE-094CodeQL 实战检测与修复 GitHub Actions 工作流代码注入漏洞CWE 094 导读 本文围绕 CodeQL 代码库中 actions 查静态分析SAST应用安全漏洞扫描代码质量niri 按键绑定配置完全指南binds 段语法、动作系统与热键覆盖层定制niri 按键绑定配置完全指南binds 段语法、动作系统与热键覆盖层定制 导读 本文是 niri一个滚动平铺式 Wayland 合成器配置文件 bind静态分析SAST应用安全漏洞扫描代码质量上一篇从Caffe到Minerva5分钟实现模型迁移与多GPU加速训练的完整指南下一篇语音转文本技术选型agents-js插件对比 — Deepgram vs AssemblyAI vs Azure STT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考