写点什么

GitHub 如何利用 CodeQL 保障代码安全

作者:Craig Risi

  • 2025-05-13
    北京
  • 本文字数:1390 字

    阅读完需:约 5 分钟

大小:678.52K时长:03:51
GitHub 如何利用 CodeQL 保障代码安全

GitHub 产品安全工程团队通过开发 CodeQL 等工具来大规模检测和修复漏洞,从而确保 GitHub 代码的安全。他们分享了自己的方法,以便其他组织可以学习如何使用 CodeQL 来更好地保护自己的代码库。

 

CodeQL 让用户可以用与查询数据库类似的方式查询代码,从而实现自动化安全分析。与简单的文本搜索相比,这种方法更有效,因为它可以跟踪数据在代码中的移动,定位不安全的模式,并检测出仅通过文本无法发现的漏洞。这样就能更深入地了解代码模式,发现潜在的安全问题。

 

该团队以各种方式使用 CodeQL 来确保 GitHub 存储库的安全。标准配置使用了默认及安全扩展查询套件,这足以满足企业大多数存储库的需要。这种设置使 CodeQL 可以自动审查 pull 请求是否存在安全问题。

 

对于某些存储库,比如 GitHub 的大型 Ruby 单体库,就需要额外采取一些措施。在这种情况下,团队会使用为特定安全需求量身定制的查询包。此外,还可以使用多存储库变体分析 (MRVA)进行安全审计,识别需要进一步调查的代码模式。还可以编写自定义查询用于检测 GitHub 代码库特有的潜在漏洞。

 

最初,自定义 CodeQL 查询是直接发布在存储库中的。然而,这种方法带来了一些挑战,包括每次更新都需要经过生产部署流程、CI 分析速度比较慢以及 CodeQL CLI 更新导致的问题。为了应对这些挑战,团队转为在 GitHub 容器注册表(GCR)中发布查询包。这一变化简化了流程,提高了可维护性,并减少了更新查询的阻力。

 

在开发自定义查询包时,要考虑到依赖关系,如 ruby-all 包。通过扩展默认查询包中的类,团队可以避免不必要的重复,同时保持查询简洁有效。不过,CodeQL 库 API 在更新时可能会带来破坏性的变化,有可能会影响查询性能。为了降低这种风险,团队会针对最新版本的 ruby-all 来开发查询,但在发布前会锁定特定的版本。这样就能确保已经部署的查询可以可靠地运行,而不会因意外更新而产生意想不到的问题。

 

为了保持查询的稳定性,每个新查询都要编写单元测试。这些测试被集成到查询包存储库的 CI 管道中,以便可以在部署前尽早发现潜在的问题。发布过程涉及多个步骤,包括打开 pull 请求、编写单元测试、合并更改、增大查询包版本号、解决依赖性问题以及将更新后的查询包发布到 GCR。这种结构化方法兼顾了开发灵活性和稳定性需求。

 

采用何种方法将查询包集成到存储库取决于组织的部署策略。GitHub 安全团队没有在 CodeQL 配置文件中锁定查询包的特定版本,而是选择通过 GCR 管理版本。这种方法使存储库可以自动使用最新发布的版本,同时在必要时提供快速回滚更改的能力。

 

在 GCR 中发布查询包时,他们遇到的一个挑战是如何确保组织内多个存储库的可访问性。他们考虑了几种解决方案,包括手动授予访问权限、使用个人访问令牌以及将存储库链接到软件包以获得继承访问权限。最终,团队采用了链接存储库的方法,无需人工干预即可有效管理多个存储库的权限。

 

为加强安全分析,GitHub 安全团队编写了各种自定义查询。这些查询的重点是识别高风险 API、执行安全编码实践,以及检测 API 端点中缺失的授权控制。有些查询是告警工具,而不是严格的执行机制,它们只会使用较低的严重性级别来提醒工程师,而不会阻止部署。这种方法允许开发人员评估安全问题,同时又能确保及时处理最关键的漏洞。

 

声明:本文为 InfoQ 翻译,未经许可禁止转载。

 

原文链接:https://www.infoq.com/news/2025/03/how-github-uses-codeql-security/

2025-05-13 10:15163

评论

发布
暂无评论

参加前端培训班学web前端技术靠谱吗

小谷哥

干货|语义网、Web3.0、Web3、元宇宙这些概念还傻傻分不清楚?(中)

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

Redis为什么这么快?Redis的线程模型与Redis多线程

程序员啊叶

Java 编程 程序员 架构 Java 面试

使用python玩转文字类视频

技能实验室

签约计划第三季

向日葵远程控制为何采用BGP服务器?自动最优路线、跨运营商高速传输

贝锐

远程控制 向日葵

目标检测网络R-CNN 系列

阿炜小菜鸡

深度学习 目标检测 7月月更

万字长文,浅谈企业数字化建模蓝图

产品老高

数字化 中台架构

1对1直播源码——1对1语音聊天源码

开源直播系统源码

直播系统源码 语音聊天系统软件开发 一对一语音聊天软件

海外APP推送(下篇):海外厂商通道集成指南

极光JIGUANG

sdk 厂商通道

面试京东T5,被按在地上摩擦,鬼知道我经历了什么?

程序员啊叶

Java 编程 程序员 架构 java面试

Plato Farm有望通过Elephant Swap,进一步向外拓展生态

西柚子

深度学习3D人体姿态估计国内外研究现状及痛点

阿炜小菜鸡

深度学习 人体姿态估计

银行业客户体验管理现状与优化策略分析

易观分析

银行

TDSQL-C Serverless:助力初创企业实现降本增效

石云升

全球架构师峰会 ArchSummit

敏捷开发与DevOps的对比

码语者

DevOps 敏捷

最新战报:十项认证,五项最佳实践

天翼云开发者社区

云计算 分布式云

@千行百业,一起乘云而上!

天翼云开发者社区

云计算 云平台

公司刚来的阿里p8,看完我构建的springboot框架,甩给我一份文档

程序员啊叶

Java 编程 程序员 架构 java面试

敲黑板画重点:七种常见“分布式事务”详解

程序员啊叶

Java 编程 程序员 架构 java面试

行业案例|指标中台如何助力银行业普惠金融可持续发展

Kyligence

大数据 普惠金融 指标中台

「中高级试题」:MVCC实现原理是什么?

程序员啊叶

Java 编程 程序员 架构 java面试

Java 将OFD转换为PDF

在下毛毛雨

Java PDF OFD 格式转换

在北京选择前端培训班学习大数据

小谷哥

尤雨溪向初学者推荐Vite 【为什么使用Vite】

flow

签约计划第三季

什么是RPC?RPC框架dubbo的核心流程

程序员啊叶

Java 编程 程序员 架构 java面试

一百五十个终极Java 经典面试题(你会多少题?)

程序员啊叶

Java 编程 程序员 架构 java面试

数据泄漏、删除事件频发,企业应如何构建安全防线?

京东科技开发者

公司管理 网络安全 安全 删库 程序员‘

天翼云Web应用防火墙(边缘云版)支持检测和拦截Apache Spark shell命令注入漏洞

天翼云开发者社区

Shell 防火墙

Plato Farm有望通过Elephant Swap,进一步向外拓展生态

小哈区块

10 万字节Spring Boot +redis详细面试笔记(带完整目录)免费分享

程序员啊叶

Java 编程 程序员 架构 java面试

聚力打造四个“高地”,携手合作伙伴共铸国云!

天翼云开发者社区

云计算 云平台

GitHub 如何利用 CodeQL 保障代码安全_安全_InfoQ精选文章