flawopen.com/Teardowns/cve-2026-102437-deepseek-reasonix-git-filter-command-injection
CVE-2026-102437:Reasonix 差异视图 Git 命令注入
被植入的 .gitattributes/.git/config 可在 Reasonix 显示差异时运行 Git clean 过滤器。将 npm 包升级至 1.39.3,或 Studio 升级至 2.21.0。[1], [2], [3], [6], [7]
想象一张分拣桌,它承诺只比较两张标签。包裹上却可以附带一张路线便条,要求分拣桌在比较内容前运行一个已注册的助手。Reasonix 禁用了 Git 的一些助手机制,但按文件调用的 clean 过滤器是另一条路径。当差异窗口要求 Git 准备文件以便比较时,该过滤器可能以开发者的权限运行。[1], [3]
核心概念与专有名词
框架映射
- 本指南所述弱点的 CWE 参考: CWE-78
根本原因剖析 (Root Cause)
Reasonix 在 git diff 调用中加入了 --no-ext-diff 和 --no-textconv ,但这些选项控制外部 diff 和文本转换机制,并不会禁用 Git 的 clean 内容过滤器。工作区变更视图会针对选定路径调用 git diff 。如果仓库内容通过 .gitattributes 为该路径分配了过滤器,而本地 Git 配置又定义了该驱动的命令,Git 就可能在生成比较 blob 时调用它。该 CVE 描述的是本地攻击者,且需要用户查看 diff。GitLab 的披露说明,普通克隆不会传递 .git/config ;归档文件、同步目录、缓存或预构建 devcontainer 可能带有该文件。披露还描述了具有相同用户权限的本地代理直接写入仓库本地配置的情形。影响是以 Reasonix 用户权限执行本地命令,而不是仅因打开 GitLab 托管仓库就发生远程代码执行。[1], [3]
攻击执行流程分解
源代码对比:漏洞与安全实现
这是用于说明的参数构造器示例,并非可直接套用的补丁。调用方必须枚举由 .gitattributes、.git/info/attributes 以及全局/系统属性文件选中的所有 driver,并且只有在完整扫描成功后才能将 discoveryComplete 设为 true。此函数只验证传入的名称并生成命令行配置覆盖项;它不会发现或核实 driver 集合。易受影响的调用来自 GitLab 的披露;防御模式是对维护者指导及已合并加固 PR 的原创综合。[1], [3], [4], [5]
源码摘录: desktop/workspace_changes.go
// GitLab Threat Research 引用的源代码调用;这是调用点,不是完整函数。
args := []string{"-C", base, "diff", "--no-ext-diff", "--no-textconv", "--relative", "HEAD", "--", filepath.FromSlash(rel)}
// Go 参数构造器示例,并非供应商补丁原文。
package gitguard
import (
"errors"
"fmt"
"path/filepath"
"regexp"
)
// 调用方必须找出有效属性选中的所有过滤器,并传入完整集合。
// 此辅助函数只会在 Git 的所有配置范围内禁用这些 driver 键。
var filterDriverName = regexp.MustCompile(`^[A-Za-z0-9_-]{1,64}$`)
func hardenedDiffArgs(base, rel string, drivers []string, discoveryComplete bool) ([]string, error) {
if !discoveryComplete {
return nil, errors.New("cannot safely diff: filter-driver discovery failed")
}
args := []string{"-C", base}
seen := map[string]struct{}{}
for _, driver := range drivers {
if !filterDriverName.MatchString(driver) {
return nil, fmt.Errorf("cannot safely diff: unsupported Git filter driver name %q", driver)
}
// Git config 子节名称区分大小写:不要转换 driver 名称的大小写。
key := driver
if _, ok := seen[key]; ok {
continue
}
seen[key] = struct{}{}
for _, setting := range []string{"clean", "smudge", "process", "required"} {
args = append(args, "-c", "filter."+driver+"."+setting+"=")
}
}
return append(args, "diff", "--no-ext-diff", "--no-textconv", "--relative", "HEAD", "--", filepath.FromSlash(rel)), nil
}
工程与系统安全加固清单
- ✓✓ 按照项目当前建议,将 Reasonix npm 更新至 1.39.3 或更高版本,或将 Reasonix Studio 更新至 2.21.0 或更高版本。[2], [6], [7]
- ✓✓ 如果工具会在用户控制的工作区中运行 Git,应将仓库本地配置和跟踪的属性视为不可信输入。[1], [3]
- ✓✓ 对于每次会转换内容的主机 Git 调用,识别
.gitattributes、.git/info/attributes和全局/系统属性文件所选中的过滤器;在 system、global、local 和 worktree 配置范围中和对应驱动键;发现不完整时安全失败。[1], [3], [4], [5] - ✓✓ 将
--no-ext-diff与--no-textconv作为不同控制保留,但不能用它们代替过滤器驱动处理。[1] - ✓✓ 添加使用真实 Git 的回归测试,验证由仓库配置的恶意过滤器不会通过 diff、status、staging、checkout 或 wrapper 支持的其他内容处理操作运行。[4], [5]
- ✓✓ 检查归档文件、共享目录、缓存和 devcontainer 是否包含本地提供的
.git/config;不要声称普通 clone 会携带此文件。[1], [3]
参考来源
- GitLab Threat Research — DeepSeek-Reasonix vulnerability details and affected call site
- GitLab Advisory Database — CVE-2026-102437
- DeepSeek-Reasonix maintainer advisory — GHSA-grg2-7gc6-36m6
- DeepSeek-Reasonix Studio host Git hardening PR #11110
- DeepSeek-Reasonix 1.x host Git hardening PR #11114
- DeepSeek-Reasonix 1.39.3 release
- DeepSeek-Reasonix Studio 2.21.0 release
- MITRE CWE-78 — Improper Neutralization of Special Elements used in an OS Command