daehyuh/CVE-2026-41729

GitHub: daehyuh/CVE-2026-41729

该项目是 Spring Data REST SpEL 表达式注入漏洞 CVE-2026-41729 的最小化概念验证程序,演示了通过 JSON Patch 请求中的 Map Key 绕过转义并修改隐藏属性。

Stars: 0 | Forks: 0

# CVE-2026-41729:通过 JSON Patch 中的 Map Key 进行 Spring Data REST SpEL 注入 此仓库包含了一个最小化的 Java/Spring Boot 复现程序,用于 CVE-2026-41729,这是一个涉及通过 JSON Patch 请求中的 map keys 进行 SpEL 表达式注入的高严重性 Spring Data REST 漏洞。 官方公告:https://spring.io/security/cve-2026-41729/ ## 状态 已发布的 CVE 复现程序。 该问题由 Daehyun Kang (@daehyuh) 发现并负责任地报告。 此示例启动了一个真实的带有 Spring Data REST 的 Spring Boot 应用程序,暴露了一个 repository endpoint,并向该 endpoint 发送 HTTP `PATCH` 请求。它不需要 Docker、数据库服务器、消息代理、凭据或任何外部服务。 ## 示例所涉及的受影响组件 - 项目:Spring Data REST - Maven 包:`org.springframework.data:spring-data-rest-webmvc` - 此示例解析的版本:`4.5.11` - Spring Boot parent:`3.5.14` - 相关的 Spring 代码路径:`org.springframework.data.rest.webmvc.json.patch.SpelPath` ## 漏洞概述 Spring Data REST 在处理针对 map 类型属性的 JSON Patch (`application/json-patch+json`) 请求时,存在 SpEL 表达式注入漏洞。 当持久化实体暴露了一个 `Map` 类型的属性时,作为 map key 的 JSON Pointer path 片段可能会被嵌入到生成的 SpEL 表达式中。精心构造的 map key 可以跳出预期的 map-key 字面量,并作为属性路径继续进行解析。 此示例演示了精心构造的 JSON Patch path 是如何修改未通过常规 REST 表示暴露的属性的。 ## 运行示例 Windows: ``` .\mvnw.cmd test ``` macOS/Linux: ``` ./mvnw test ``` 预期的漏洞运行结果: ``` Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 BUILD SUCCESS ``` ## 示例演示内容 domain object 包含一个可见的 `people` map。每个 `Person` 还包含一个 `hiddenChildren` map,该 map 使用 `@JsonIgnore` 对 Spring Data REST/Jackson 隐藏。 测试验证了正常的 REST 表示不会暴露 `hiddenChildren` 或隐藏值。 然后,测试向 Spring Data REST repository endpoint 发送直接的 JSON Patch 请求: ``` PATCH /wrappers/sample Content-Type: application/json-patch+json [ { "op": "replace", "path": "/people/a/hiddenChildren/b/name", "value": "after" } ] ``` 该直接的隐藏属性路径被拒绝,并且隐藏值保持为 `before`。 然后,测试发送一个精心构造的 map-key JSON Patch path: ``` PATCH /wrappers/sample Content-Type: application/json-patch+json [ { "op": "replace", "path": "/people/a'].hiddenChildren['b/name", "value": "after" } ] ``` 观察到的漏洞行为:请求成功,并将隐藏值从 `before` 更改为 `after`。 测试还验证了该 map 不包含名为 `a'].hiddenChildren['b` 的字面量 key,因此该更改是由表达式突破引起的,而不是正常的 map-key 行为。 ## 为什么这会触发 Spring Data REST 代码 特定于应用程序的类仅提供了一个最小的 object graph 和 repository,以便 Spring Data REST 可以处理真实的 HTTP JSON Patch 请求。它们不解析 JSON Patch path,也不计算表达式。 相关行为发生在 Spring Data REST 将 JSON Patch path 转换为 SpEL path 时。对于以字符串为 key 的 map,原始 path 片段作为带引号的字符串嵌入到生成的 SpEL indexer 中,而没有事先对该片段进行转义。因此,map key 片段中的单引号可以跳出预期的 map-key 字面量,并作为属性路径继续执行。 ## 参考 - Spring 公告:https://spring.io/security/cve-2026-41729/
标签:CISA项目, CVE-2026-41729, JS文件枚举, Maven, PoC, SpEL注入, Spring Data REST, 域名枚举, 暴力破解, 漏洞验证