写点什么

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:153445

评论

发布
暂无评论

如何将营销模板以小程序的形式上架至App?

FinFish

小程序容器 小程序技术 营销模板

架构实战 - 模块 9 毕业项目

mm

#架构实战营

无处不在的边缘网络感知

阿里云CloudImagine

云计算 边缘云 边缘网络

电脑风扇控制软件:Macs Fan Control Pro中文激活版

真大的脸盆

Mac Mac 软件 电脑风扇控制 风扇转速控制

技术领导力之路 - 安全感

阿里技术

技术成长

精准测试之分布式调用链底层逻辑

京东科技开发者

分布式 精准测试 调用链 Spark 源码 企业号 3 月 PK 榜

SpringBoot快速搭建、自动流程进阶、装配机制、功能扩展点详解

三十而立

Java 程序员 IT

阿里云资深技术专家闫卫斌:打造具备极致容灾能力的对象存储

云布道师

阿里云 云存储

深扒RocketMQ源码之后,我找出了RocketMQ消息重复消费的7种原因

程序员小毕

程序员 RocketMQ 后端 架构师 消息中间件

一个基于序列的弱监督视觉信息抽取学习框架

合合技术团队

人工智能 计算机视觉 OCR

聊聊To B企业的客户成功价值

老张

交付 客户成功

智能健康管理正当时,脉冲技术的一次自证与他证

脑极体

skg 按摩仪

OpenAI创始人:GPT-4的研究起源和构建心法

OneFlow

人工智能 深度学习 ChatGPT Greg Brockman

PopupWindow(悬浮框)的基本使用

芯动大师

android AlertDialog PopupWindow

阿里菜鸟国际Java研发面经(三面+总结):JVM+架构+MySQL+Redis等

三十而立

面试 java

面试滴滴、中信字节跳动等10+公司面经+面试题及答案分享(java岗)

三十而立

PyTorch 深度学习实战 |用TensorFlow训练神经网络

TiAmo

神经网络 tensorflow MNIST

Go 第三方 log 库之 logrus 使用

江湖十年

后端 日志 Go 语言

一种异步延迟队列的实现方式

京东科技开发者

架构 软件架构 企业号 3 月 PK 榜 延迟处理

复杂度分析:如何分析、统计算法的执行效率和资源消耗

京东科技开发者

数据结构和算法 算法和数据结构 复杂度分析 空间复杂度 企业号 3 月 PK 榜

探索大语言模型垂直化训练技术和应用-陈运文

NLP资深玩家

人工智能 ChatGPT

dubbo Triple 统一参数验证

昵称不能为null

dubbo triple协议 参数验证

[译]探索 Go 中 io/fs 包以提高测试性能和可测试性

蓬蒿

golang 测试 io/fs

如此丝滑的按钮交互效果

南城FE

css3 前端 设计 动画 交互

朴素系统优化思维的实践

京东科技开发者

方案 构架 系统优化

OMG!Go语言设计模式,这样用简直不要太爽!

博文视点Broadview

组装式应用新趋势:小程序技术科提高软件开发效率

FinFish

小程序容器 组装式应用 小程序技术

如何自动化测试你的接口?—— Rest Assured

JAVA旭阳

Java springboot

深入了解 JavaScript 内存泄漏

京东科技开发者

JavaScript 前端 内存 计算

浪潮 KaiwuDB x 河工大 | 推进能源行业数字化转型建设

KaiwuDB

解决方案 数字能源 KaiwuDB

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