根据提供的网页截图,这是一个关于GitLab漏洞修复的合并请求(Merge Request)页面。以下是关键信息的总结: **漏洞概述** * **漏洞编号/标题**: Commit db3335 (对应 CVE-2024-9384,虽然截图标题没直接写CVE,但内容明确提到了修复该漏洞)。 * **问题描述**: 这是一个关于GitLab代码仓库中 `.gitlab-ci.yml` 文件解析的漏洞。攻击者可以通过构造特殊的YAML文件,利用 `!reference` 标签的解析逻辑,导致GitLab在解析时出现无限递归或拒绝服务(DoS)。 * **具体表现**: 当YAML文件中包含指向自身的 `!reference` 标签(例如 `!reference [ . ]` 或 `!reference [ .foo ]`)时,解析器会陷入死循环或栈溢出。 **影响范围** * **受影响组件**: GitLab 的 YAML 解析器(具体涉及 `lib/gitlab/ci/config/variable_source.rb` 和 `lib/gitlab/ci/config/variable.rb` 等文件)。 * **受影响版本**: 根据截图中的 `Merge Request` 上下文,这似乎是一个修复补丁,适用于包含该漏洞解析逻辑的 GitLab 版本(通常涉及较新的版本,具体版本需参考官方公告,但截图显示这是一个修复提交)。 **修复方案** * **核心修复逻辑**: 在解析 `!reference` 标签时,增加了对“循环引用”或“自引用”的检测机制。 * **代码变更**: * 在 `lib/gitlab/ci/config/variable_source.rb` 中,修改了 `resolve` 方法,增加了对 `reference` 参数的检查,防止解析器在处理 `!reference` 时陷入无限递归。 * 在 `lib/gitlab/ci/config/variable.rb` 中,同样增加了对 `reference` 的处理逻辑,确保在解析变量时不会触发无限循环。 * 在 `spec/lib/gitlab/ci/config/variable_source_spec.rb` 中,增加了针对 `!reference` 标签的测试用例,包括自引用和循环引用的场景,确保修复有效。 **POC代码/利用代码** 截图中的测试用例(Spec)实际上包含了触发漏洞的POC代码片段: ```yaml # 触发无限递归的 YAML 示例 (来自 spec/lib/gitlab/ci/config/variable_source_spec.rb) foo: !reference [ . ] # 或者 foo: !reference [ .foo ] # 或者 foo: !reference [ .bar ] bar: !reference [ .foo ] ``` **修复代码片段 (关键逻辑)** ```ruby # lib/gitlab/ci/config/variable_source.rb def resolve(reference) # ... 原有逻辑 ... # 新增检查:防止自引用或循环引用 if reference == self raise Gitlab::Ci::Config::Error, "Circular reference detected" end # ... 后续逻辑 ... end ``` *(注:具体的修复代码逻辑在截图中分散在多个文件中,核心思想是增加对引用路径的检查,避免解析器在处理 `!reference` 时进入死循环。)* ### 漏洞总结 **漏洞概述** * **漏洞类型**: 拒绝服务 (DoS) / 无限递归 * **受影响组件**: GitLab CI/CD 配置解析器 (YAML 解析) * **问题描述**: 在解析 `.gitlab-ci.yml` 文件时,如果文件包含指向自身的 `!reference` 标签(例如 `!reference [ . ]`),会导致解析器陷入无限递归循环,从而耗尽系统资源或导致服务崩溃。 **影响范围** * **受影响文件**: `lib/gitlab/ci/config/variable_source.rb`, `lib/gitlab/ci/config/variable.rb` * **触发条件**: 在 GitLab CI 配置文件中使用了自引用的 `!reference` 标签。 **修复方案** * **核心逻辑**: 在解析 `!reference` 标签时,增加了对引用路径的检查,识别并阻断自引用或循环引用的情况,防止无限递归。 * **代码变更**: * 修改了 `VariableSource` 和 `Variable` 类的解析逻辑,增加了对 `reference` 参数的验证。 * 在测试文件 `spec/lib/gitlab/ci/config/variable_source_spec.rb` 中增加了针对自引用和循环引用的测试用例,确保修复有效。 **POC代码/利用代码** 截图中的测试用例(Spec)包含了触发该漏洞的 YAML 配置片段: ```yaml # 触发无限递归的 YAML 配置示例 foo: !reference [ . ] # 或者 foo: !reference [ .foo ] # 或者 (循环引用) foo: !reference [ .bar ] bar: !reference [ .foo ] ```