{"id":"CVE-2026-41695","aliases":["CLSA-2026-1787403789","CLSA-2026-1788196484","CLSA-2026-1788196519","CLSA-2026-1788196634","CLSA-2026-1788200476","CLSA-2026-1788203900","CLSA-2026-1789995986","CLSA-2026-1789999145","CLSA-2026-1790241337","CLSA-2026-1790601895","CLSA-2026-1790612737","CLSA-2026-1790623749","CLSA-2026-1790666472","CLSA-2026-1790666525","CLSA-2026-1790672048","CLSA-2026-1790673665","CLSA-2026-1790691536","CLSA-2026-1790696548","CLSA-2026-1790951905","CLSA-2026-1791192746","CLSA-2026-1791973815","CLSA-2026-1792489414","CLSA-2026-1792489831","CLSA-2026-1793200289","CLSA-2026-1794214732","EUVD-2026-35891","GHSA-88fw-v6x4-3f58","ROOT-APP-MAVEN-CVE-2026-41695"],"status":"published","title":"Denial of Service in Spring Data Commons Property Path Resolution","description":"Spring Data Commons applications may be vulnerable to denial of service through resource exhaustion when attacker-controlled property path strings are passed to MappingContext property path resolution.\n\nAffected versions:\nSpring Data Commons 4.0.0 through 4.0.5; 3.5.0 through 3.5.11; 3.4.0 through 3.4.14.","severity":{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00364,"percentile":0.30499,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-400"],"published":"2026-06-09T23:47:33Z","modified":"2026-11-09T19:15:04Z","fixes":[{"ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","fixed_in":["4.0.6","3.5.12"],"sources":["ghsa","osv"]},{"ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","fixed_in":["3.3.12-tuxcare.2","2.7.18-tuxcare.10"],"sources":["osv"]},{"ecosystem":"Root:Maven","package":"org.springframework.data:spring-data-commons","fixed_in":["4.0.5-aikido.2","3.5.11-aikido.1","3.5.10-aikido.2","4.0.4-aikido.1","4.0.5-aikido.1","3.5.10-aikido.1"],"sources":["osv"]},{"ecosystem":"Root:Maven","package":"io.root.org.springframework.data:spring-data-commons","fixed_in":["4.0.5-root.io.2","3.5.11-root.io.1","3.5.10-root.io.2","4.0.4-root.io.1","4.0.5-root.io.1","3.5.10-root.io.1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.0.0"},{"last_affected":"4.0.5"},{"fixed":"4.0.6"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.5.0"},{"last_affected":"3.5.11"},{"fixed":"3.5.12"}]}]},{"source":"ghsa","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.0"},{"last_affected":"3.4.13"}]}]},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.3.13"},{"fixed":"3.3.13-tuxcare.3"}]}],"versions":["3.3.13","3.3.13-tuxcare.1","3.3.13-tuxcare.2"],"bundled":3},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.13"},{"fixed":"3.4.13-tuxcare.1"}]}],"versions":["3.4.13"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.2.12"},{"fixed":"3.2.12-tuxcare.1"}]}],"versions":["3.2.12"],"bundled":3},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.3.12"},{"fixed":"3.3.12-tuxcare.2"}]}],"versions":["3.3.12","3.3.12-tuxcare.1"]},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.4.8"},{"fixed":"2.4.8-tuxcare.1"}]}],"versions":["2.4.8"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.12"},{"fixed":"3.4.12-tuxcare.1"}]}],"versions":["3.4.12"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.2.3"},{"fixed":"3.2.3-tuxcare.1"}]}],"versions":["3.2.3"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.7.14"},{"fixed":"2.7.14-tuxcare.1"}]}],"versions":["2.7.14"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.2.11"},{"fixed":"3.2.11-tuxcare.1"}]}],"versions":["3.2.11"],"bundled":3},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.5.11"},{"fixed":"2.5.11-tuxcare.1"}]}],"versions":["2.5.11"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.5.12"},{"fixed":"2.5.12-tuxcare.1"}]}],"versions":["2.5.12"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.3"},{"fixed":"3.4.3-tuxcare.1"}]}],"versions":["3.4.3"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.11"},{"fixed":"3.4.11-tuxcare.1"}]}],"versions":["3.4.11"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.7.16"},{"fixed":"2.7.16-tuxcare.2"}]}],"versions":["2.7.16","2.7.16-tuxcare.1"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.1.10.RELEASE"},{"fixed":"2.1.10.RELEASE-tuxcare.1"}]}],"versions":["2.1.10.RELEASE"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.7.18"},{"fixed":"2.7.18-tuxcare.10"}]}],"versions":["2.7.18","2.7.18-tuxcare.2","2.7.18-tuxcare.3","2.7.18-tuxcare.4","2.7.18-tuxcare.5","2.7.18-tuxcare.6","2.7.18-tuxcare.7","2.7.18-tuxcare.8","2.7.18-tuxcare.9","2.7.18.tuxcare","2.7.18.tuxcare.1"]},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.4.9"},{"fixed":"2.4.9-tuxcare.3"}]}],"versions":["2.4.9","2.4.9-tuxcare.1","2.4.9-tuxcare.2"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.6.10"},{"fixed":"2.6.10-tuxcare.3"}]}],"versions":["2.6.10","2.6.10-tuxcare.1","2.6.10-tuxcare.2"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.3.5.RELEASE"},{"fixed":"2.3.5.RELEASE-tuxcare.1"}]}],"versions":["2.3.5.RELEASE"],"bundled":2},{"source":"osv","ecosystem":"TuxCare:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.1.21.RELEASE"},{"fixed":"2.1.21.RELEASE-tuxcare.1"}]}],"versions":["2.1.21.RELEASE"],"bundled":2},{"source":"osv","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.0.0"},{"fixed":"4.0.6"}]}],"versions":["4.0.0","4.0.1","4.0.2","4.0.3","4.0.4","4.0.5"]},{"source":"osv","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.5.0"},{"fixed":"3.5.12"}]}],"versions":["3.5.0","3.5.1","3.5.10","3.5.11","3.5.2","3.5.3","3.5.4","3.5.5","3.5.6","3.5.7","3.5.8","3.5.9"]},{"source":"osv","ecosystem":"Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"3.4.0"},{"last_affected":"3.4.13"}]}],"versions":["3.4.0","3.4.1","3.4.10","3.4.11","3.4.12","3.4.13","3.4.2","3.4.3","3.4.4","3.4.5","3.4.6","3.4.7","3.4.8","3.4.9"]},{"source":"osv","ecosystem":"Root:Maven","package":"org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.0.5-aikido.2"},{"fixed":"3.5.11-aikido.1"},{"fixed":"3.5.10-aikido.2"},{"fixed":"4.0.4-aikido.1"},{"fixed":"4.0.5-aikido.1"},{"fixed":"3.5.10-aikido.1"}]}]},{"source":"osv","ecosystem":"Root:Maven","package":"io.root.org.springframework.data:spring-data-commons","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.0.5-root.io.2"},{"fixed":"3.5.11-root.io.1"},{"fixed":"3.5.10-root.io.2"},{"fixed":"4.0.4-root.io.1"},{"fixed":"4.0.5-root.io.1"},{"fixed":"3.5.10-root.io.1"}]}]}],"products":[{"vendor":"broadcom","product":"spring_data_commons"},{"vendor":"pivotal","product":"spring data commons"},{"vendor":"spring","product":"spring data commons"}],"references":[{"url":"https://spring.io/security/cve-2026-41695","tags":["Vendor Advisory","web"]},{"url":"https://github.com/spring-projects/security-advisories/security/advisories/GHSA-88fw-v6x4-3f58","tags":["web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-41695","tags":["advisory"]},{"url":"https://github.com/spring-projects/spring-data-commons/commit/96e9475b963218bb702959524187342671f6b080","tags":["web"]},{"url":"https://github.com/spring-projects/spring-data-commons/commit/a4f893b66c18c70f2b22f29a2b55097b73c89941","tags":["web"]},{"url":"https://github.com/spring-projects/spring-data-commons/releases/tag/3.5.12","tags":["web"]},{"url":"https://github.com/spring-projects/spring-data-commons/releases/tag/4.0.6","tags":["web"]},{"url":"https://github.com/advisories/GHSA-88fw-v6x4-3f58"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/41xxx/CVE-2026-41695.json","tags":["advisory"]},{"url":"https://github.com/spring-projects/security-advisories","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-41695","title":"Denial of Service in Spring Data Commons Property Path Resolution","description":"Spring Data Commons applications may be vulnerable to denial of service through resource exhaustion when attacker-controlled property path strings are passed to MappingContext property path resolution.\n\nAffected versions:\nSpring Data Commons 4.0.0 through 4.0.5; 3.5.0 through 3.5.11; 3.4.0 through 3.4.14.","status":"published","published":"2026-06-09T23:47:33.927Z","modified":"2026-06-27T21:31:50.685Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"cna"}],"cwes":["CWE-400"],"updated_at":"2026-11-02T13:41:08.498858Z"}],"euvd":[{"id":"EUVD-2026-35891","description":"Spring Data Commons applications may be vulnerable to denial of service through resource exhaustion when attacker-controlled property path strings are passed to MappingContext property path resolution.\n\nAffected versions:\nSpring Data Commons 4.0.0 through 4.0.5; 3.5.0 through 3.5.11; 3.4.0 through 3.4.14.","status":"published","published":"2026-06-09T23:47:33Z","modified":"2026-06-27T21:31:50Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"updated_at":"2026-11-02T18:20:23.349194Z"}],"ghsa":[{"id":"GHSA-88fw-v6x4-3f58","title":"Spring Data: Unbounded property-path cache keyed by externally-supplied path string","description":"`src/main/java/org/springframework/data/mapping/context/PersistentPropertyPathFactory.java:175` · Unbounded Resource Allocation (Algorithmic DoS)\n\n### Impact\n\nWhen a consuming module routes user-supplied dot-paths (sort parameters, projection paths, PATCH paths) through `MappingContext.getPersistentPropertyPath(String, Class)`, each distinct string — including invalid ones — is cached forever. A remote attacker can send millions of requests with unique `?sort=aaaa\u003cn\u003e` values and grow the heap until the service OOMs.\n\n### Description\n\n`PersistentPropertyPathFactory.propertyPaths` (line 53) is a `ConcurrentHashMap\u003cTypeAndPath, PathResolution\u003e` populated by `getPotentiallyCachedPath()` (line 174-177) via `computeIfAbsent`. The key is `(TypeInformation, rawPathString)`. Crucially, unresolvable paths are also cached (as `PathResolution.unresolved`, line 204) so that the same `InvalidPersistentPropertyPath` can be re-thrown — meaning every distinct garbage string an attacker sends creates a permanent entry. There is no eviction. This is reachable from `AbstractMappingContext.getPersistentPropertyPath(String, Class)` (`AbstractMappingContext.java:345`), which Spring Data REST and several store query mappers call with HTTP-request-derived sort/filter property names.\n\nBy contrast, the sibling `SimplePropertyPath.cache` was already hardened to use `ConcurrentReferenceHashMap` (soft refs); this cache was not given the same treatment.\n\n### Exploit scenario\n\nAgainst a Spring Data REST endpoint, an attacker scripts `GET /things?sort=\u003crandom-40-char-string\u003e` in a loop. Each request fails fast with `InvalidPersistentPropertyPath`, but each distinct random string leaves behind a `TypeAndPath` key, a `PathResolution` object holding the split segments list, and the source string in the map. After ~10M requests the JVM OOMs.\n\n### Preconditions\n\n- A downstream component (Spring Data REST, a store-specific `QueryMapper`, or application code) passes externally-supplied strings to `MappingContext.getPersistentPropertyPath(String, ...)`\n- No upstream rate-limiting or path-string validation\n\n### How to fix\n\nA cache whose key can be derived from external input must be bounded. Replace `propertyPaths` (line 53) with a `ConcurrentLruCache\u003cTypeAndPath, PathResolution\u003e` of fixed capacity, or `ConcurrentReferenceHashMap` (matching the sibling `SimplePropertyPath.cache`). Additionally, do not cache `PathResolution.unresolved` results at all (line 204 in `createPersistentPropertyPath`) — re-computing a failed lookup is cheap, and caching negative results for arbitrary attacker strings is what makes this exploitable.\n\n### Adversarial verification\n\n**Verdict:** TRUE_POSITIVE (confidence: 7/10) — unbounded hard-ref `ConcurrentHashMap` keyed by raw path string, caches unresolved entries (line 204), reachable via public `MappingContext.getPersistentPropertyPath(String, ...)`; sibling `PropertyPath` cache was already converted to soft-refs but this one was missed. -3 confidence because the HTTP-input wiring lives in downstream modules (Spring Data REST / store mappers), not verifiable in this repo.\n\n**Code at the line — CONFIRMED**\n- Line 53: `private final Map\u003cTypeAndPath, PathResolution\u003e propertyPaths = new ConcurrentHashMap\u003c\u003e();` — plain CHM, hard refs, no eviction, no size bound.\n- Line 175: `propertyPaths.computeIfAbsent(TypeAndPath.of(type, propertyPath), ...)` — every distinct `(type, string)` pair is inserted.\n- Line 204: `return PathResolution.unresolved(parts, segment, type, currentPath);` — returned from inside `computeIfAbsent`'s mapping function, so unresolvable paths are cached. The `PathResolution` retains the full attacker string (`source = StringUtils.collectionToDelimitedString(parts, \".\")`, line 452).\n\n**Callers within spring-data-commons**\n- `AbstractMappingContext.getPersistentPropertyPath(String, Class\u003c?\u003e)` (line 345) and `(String, TypeInformation\u003c?\u003e)` (line 350) → `persistentPropertyPathFactory.from(type, propertyPath)` → straight into the unbounded cache. No validation, no `PropertyPath.from` gate.\n- This is the public `MappingContext` interface (`MappingContext.java:174,186`), documented to throw `InvalidPersistentPropertyPath` on bad input — i.e., the contract explicitly anticipates being called with possibly-invalid strings.\n- No in-repo caller routes HTTP input directly into the `String` overload. The `Sort.Order.property` → `getPersistentPropertyPath(String, ...)` bridge lives in store modules (Spring Data MongoDB `QueryMapper`, Spring Data REST sort translator). That wiring is out-of-repo as the finding states.\n\n**Protections — NONE on this cache**\nContrast: `SimplePropertyPath.java:52` (the `PropertyPath.from` cache) uses `ConcurrentReferenceHashMap` (soft refs, GC-evictable). Spring already hardened the sibling cache against exactly this pattern. `PersistentPropertyPathFactory.propertyPaths` was not given the same treatment.\n\n**Stress-test**\nIs this exclusion #3 (intended design)? The `PathResolution` javadoc (line 426-430) says caching unresolved paths is deliberate — to make repeated lookups of the *same* bad path cheap. But unbounded hard-ref caching of *arbitrary attacker-chosen* keys is not the intent; the sibling fix proves Spring considers this a bug class.","status":"published","published":"2026-07-31T16:44:15Z","modified":"2026-07-31T16:44:16Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"cwes":["CWE-400"],"updated_at":"2026-11-02T14:40:55.903445Z"}],"nvd":[{"id":"CVE-2026-41695","description":"Spring Data Commons applications may be vulnerable to denial of service through resource exhaustion when attacker-controlled property path strings are passed to MappingContext property path resolution.\n\nAffected versions:\nSpring Data Commons 4.0.0 through 4.0.5; 3.5.0 through 3.5.11; 3.4.0 through 3.4.14.","status":"published","published":"2026-06-10T00:16:50.683Z","modified":"2026-07-23T09:10:00.113Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high","assessor":"secondary"}],"cwes":["CWE-400"],"updated_at":"2026-11-02T14:12:23.485267Z"}],"osv":[{"id":"CVE-2026-41695","title":"Denial of Service in Spring Data Commons Property Path Resolution","description":"Spring Data Commons applications may be vulnerable to denial of service through resource exhaustion when attacker-controlled property path strings are passed to MappingContext property path resolution.\n\nAffected versions:\nSpring Data Commons 4.0.0 through 4.0.5; 3.5.0 through 3.5.11; 3.4.0 through 3.4.14.","status":"published","published":"2026-06-09T23:47:33.927Z","modified":"2026-10-28T02:31:13.21879598Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"cwes":["CWE-400"],"updated_at":"2026-11-02T15:45:03.764807Z"},{"id":"GHSA-88fw-v6x4-3f58","title":"Spring Data: Unbounded property-path cache keyed by externally-supplied path string","description":"`src/main/java/org/springframework/data/mapping/context/PersistentPropertyPathFactory.java:175` · Unbounded Resource Allocation (Algorithmic DoS)\n\n### Impact\n\nWhen a consuming module routes user-supplied dot-paths (sort parameters, projection paths, PATCH paths) through `MappingContext.getPersistentPropertyPath(String, Class)`, each distinct string — including invalid ones — is cached forever. A remote attacker can send millions of requests with unique `?sort=aaaa\u003cn\u003e` values and grow the heap until the service OOMs.\n\n### Description\n\n`PersistentPropertyPathFactory.propertyPaths` (line 53) is a `ConcurrentHashMap\u003cTypeAndPath, PathResolution\u003e` populated by `getPotentiallyCachedPath()` (line 174-177) via `computeIfAbsent`. The key is `(TypeInformation, rawPathString)`. Crucially, unresolvable paths are also cached (as `PathResolution.unresolved`, line 204) so that the same `InvalidPersistentPropertyPath` can be re-thrown — meaning every distinct garbage string an attacker sends creates a permanent entry. There is no eviction. This is reachable from `AbstractMappingContext.getPersistentPropertyPath(String, Class)` (`AbstractMappingContext.java:345`), which Spring Data REST and several store query mappers call with HTTP-request-derived sort/filter property names.\n\nBy contrast, the sibling `SimplePropertyPath.cache` was already hardened to use `ConcurrentReferenceHashMap` (soft refs); this cache was not given the same treatment.\n\n### Exploit scenario\n\nAgainst a Spring Data REST endpoint, an attacker scripts `GET /things?sort=\u003crandom-40-char-string\u003e` in a loop. Each request fails fast with `InvalidPersistentPropertyPath`, but each distinct random string leaves behind a `TypeAndPath` key, a `PathResolution` object holding the split segments list, and the source string in the map. After ~10M requests the JVM OOMs.\n\n### Preconditions\n\n- A downstream component (Spring Data REST, a store-specific `QueryMapper`, or application code) passes externally-supplied strings to `MappingContext.getPersistentPropertyPath(String, ...)`\n- No upstream rate-limiting or path-string validation\n\n### How to fix\n\nA cache whose key can be derived from external input must be bounded. Replace `propertyPaths` (line 53) with a `ConcurrentLruCache\u003cTypeAndPath, PathResolution\u003e` of fixed capacity, or `ConcurrentReferenceHashMap` (matching the sibling `SimplePropertyPath.cache`). Additionally, do not cache `PathResolution.unresolved` results at all (line 204 in `createPersistentPropertyPath`) — re-computing a failed lookup is cheap, and caching negative results for arbitrary attacker strings is what makes this exploitable.\n\n### Adversarial verification\n\n**Verdict:** TRUE_POSITIVE (confidence: 7/10) — unbounded hard-ref `ConcurrentHashMap` keyed by raw path string, caches unresolved entries (line 204), reachable via public `MappingContext.getPersistentPropertyPath(String, ...)`; sibling `PropertyPath` cache was already converted to soft-refs but this one was missed. -3 confidence because the HTTP-input wiring lives in downstream modules (Spring Data REST / store mappers), not verifiable in this repo.\n\n**Code at the line — CONFIRMED**\n- Line 53: `private final Map\u003cTypeAndPath, PathResolution\u003e propertyPaths = new ConcurrentHashMap\u003c\u003e();` — plain CHM, hard refs, no eviction, no size bound.\n- Line 175: `propertyPaths.computeIfAbsent(TypeAndPath.of(type, propertyPath), ...)` — every distinct `(type, string)` pair is inserted.\n- Line 204: `return PathResolution.unresolved(parts, segment, type, currentPath);` — returned from inside `computeIfAbsent`'s mapping function, so unresolvable paths are cached. The `PathResolution` retains the full attacker string (`source = StringUtils.collectionToDelimitedString(parts, \".\")`, line 452).\n\n**Callers within spring-data-commons**\n- `AbstractMappingContext.getPersistentPropertyPath(String, Class\u003c?\u003e)` (line 345) and `(String, TypeInformation\u003c?\u003e)` (line 350) → `persistentPropertyPathFactory.from(type, propertyPath)` → straight into the unbounded cache. No validation, no `PropertyPath.from` gate.\n- This is the public `MappingContext` interface (`MappingContext.java:174,186`), documented to throw `InvalidPersistentPropertyPath` on bad input — i.e., the contract explicitly anticipates being called with possibly-invalid strings.\n- No in-repo caller routes HTTP input directly into the `String` overload. The `Sort.Order.property` → `getPersistentPropertyPath(String, ...)` bridge lives in store modules (Spring Data MongoDB `QueryMapper`, Spring Data REST sort translator). That wiring is out-of-repo as the finding states.\n\n**Protections — NONE on this cache**\nContrast: `SimplePropertyPath.java:52` (the `PropertyPath.from` cache) uses `ConcurrentReferenceHashMap` (soft refs, GC-evictable). Spring already hardened the sibling cache against exactly this pattern. `PersistentPropertyPathFactory.propertyPaths` was not given the same treatment.\n\n**Stress-test**\nIs this exclusion #3 (intended design)? The `PathResolution` javadoc (line 426-430) says caching unresolved paths is deliberate — to make repeated lookups of the *same* bad path cheap. But unbounded hard-ref caching of *arbitrary attacker-chosen* keys is not the intent; the sibling fix proves Spring considers this a bug class.","status":"published","published":"2026-07-31T16:44:15Z","modified":"2026-09-10T03:51:11.064911109Z","cvss":[{"version":"3.1","score":7.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","level":"high"}],"cwes":["CWE-400"],"updated_at":"2026-11-02T15:46:42.077781Z"},{"id":"CLSA-2026-1787403789","title":"TuxCare security update for org.springframework.data:spring-data-commons (3 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 3 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"published","published":"2026-08-22T13:03:09Z","modified":"2026-10-15T09:47:25.297279693Z","updated_at":"2026-11-02T15:43:47.20725Z"},{"id":"CLSA-2026-1788196484","title":"TuxCare security update for org.springframework.data (4 CVEs)","description":"TuxCare rebuilt 4 org.springframework.data packages to address 4 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"withdrawn","published":"2026-08-31T17:14:44Z","modified":"2026-10-26T13:21:31Z","updated_at":"2026-11-02T15:43:47.591214Z"},{"id":"CLSA-2026-1788196519","title":"TuxCare security update for org.springframework.data:spring-data-ldap (4 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-ldap to address 4 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"withdrawn","published":"2026-08-31T17:15:19Z","modified":"2026-10-26T13:21:31Z","updated_at":"2026-11-02T15:43:47.591214Z"},{"id":"CLSA-2026-1788196634","title":"TuxCare security update for org.springframework.data (4 CVEs)","description":"TuxCare rebuilt 5 org.springframework.data packages to address 4 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"withdrawn","published":"2026-08-31T17:17:14Z","modified":"2026-10-26T13:21:31Z","updated_at":"2026-11-02T15:43:47.591214Z"},{"id":"CLSA-2026-1788200476","title":"TuxCare security update for org.springframework.data:spring-data-keyvalue (4 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-keyvalue to address 4 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"withdrawn","published":"2026-08-31T18:21:16Z","modified":"2026-10-26T13:21:31Z","updated_at":"2026-11-02T15:43:47.591214Z"},{"id":"CLSA-2026-1788203900","title":"TuxCare security update for org.springframework.data:spring-data-redis (4 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-redis to address 4 CVEs. Fixed in 3.3.13-tuxcare.3.","status":"withdrawn","published":"2026-08-31T19:18:20Z","modified":"2026-10-26T13:21:31Z","updated_at":"2026-11-02T15:43:47.591214Z"},{"id":"CLSA-2026-1789995986","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 3.4.13-tuxcare.1.","status":"published","published":"2026-09-21T13:06:26Z","modified":"2026-10-15T09:45:21.325951362Z","updated_at":"2026-11-02T15:43:48.28229Z"},{"id":"CLSA-2026-1789999145","title":"TuxCare security update for org.springframework.data:spring-data-commons (3 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 3 CVEs. Fixed in 3.2.12-tuxcare.1.","status":"published","published":"2026-09-21T13:59:05Z","modified":"2026-10-15T09:45:21.023649351Z","updated_at":"2026-11-02T15:43:48.28229Z"},{"id":"CLSA-2026-1790241337","title":"TuxCare security update for org.springframework.data:spring-data-commons (1 CVE)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 1 CVE. Fixed in 3.3.12-tuxcare.2.","status":"published","published":"2026-09-24T09:15:37Z","modified":"2026-10-15T09:45:22.420471122Z","updated_at":"2026-11-02T15:43:48.28229Z"},{"id":"CLSA-2026-1790601895","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.4.8-tuxcare.1.","status":"published","published":"2026-09-28T13:24:55Z","modified":"2026-10-15T09:47:44.796624365Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790612737","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 3.4.12-tuxcare.1.","status":"published","published":"2026-09-28T16:25:37Z","modified":"2026-10-15T09:47:44.894327858Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790623749","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 3.2.3-tuxcare.1.","status":"published","published":"2026-09-28T19:29:09Z","modified":"2026-10-15T09:47:44.89859446Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790666472","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.7.14-tuxcare.1.","status":"published","published":"2026-09-29T07:21:12Z","modified":"2026-10-15T09:47:44.783268071Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790666525","title":"TuxCare security update for org.springframework.data:spring-data-commons (3 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 3 CVEs. Fixed in 3.2.11-tuxcare.1.","status":"published","published":"2026-09-29T07:22:05Z","modified":"2026-10-15T09:47:44.753475341Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790672048","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.5.11-tuxcare.1.","status":"published","published":"2026-09-29T08:54:08Z","modified":"2026-10-15T09:47:44.801487664Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790673665","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.5.12-tuxcare.1.","status":"published","published":"2026-09-29T09:21:05Z","modified":"2026-10-15T09:46:56.217204721Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790691536","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 3.4.3-tuxcare.1.","status":"published","published":"2026-09-29T14:18:56Z","modified":"2026-10-15T09:47:44.824979202Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790696548","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 3.4.11-tuxcare.1.","status":"published","published":"2026-09-29T15:42:28Z","modified":"2026-10-15T09:47:44.731702566Z","updated_at":"2026-11-02T15:43:48.65893Z"},{"id":"CLSA-2026-1790951905","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.7.16-tuxcare.2.","status":"published","published":"2026-10-02T14:38:25Z","modified":"2026-10-15T09:46:50.377850634Z","updated_at":"2026-11-02T15:43:49.016976Z"},{"id":"CLSA-2026-1791192746","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.1.10.RELEASE-tuxcare.1.","status":"published","published":"2026-10-05T09:32:26Z","modified":"2026-10-15T09:46:51.491763956Z","updated_at":"2026-11-02T15:43:49.016976Z"},{"id":"CLSA-2026-1791973815","title":"TuxCare security update for org.springframework.data:spring-data-commons (1 CVE)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 1 CVE. Fixed in 2.7.18-tuxcare.10.","status":"published","published":"2026-10-14T10:30:15Z","modified":"2026-10-15T09:45:55.749141405Z","updated_at":"2026-11-02T15:43:50.599064Z"},{"id":"CLSA-2026-1792489414","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.4.9-tuxcare.3.","status":"published","published":"2026-10-20T09:43:34Z","modified":"2026-10-20T13:45:04.958774304Z","updated_at":"2026-11-02T15:43:54.378946Z"},{"id":"CLSA-2026-1792489831","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.6.10-tuxcare.3.","status":"published","published":"2026-10-20T09:50:31Z","modified":"2026-10-20T13:45:03.969462239Z","updated_at":"2026-11-02T15:43:54.378946Z"},{"id":"CLSA-2026-1793200289","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.3.5.RELEASE-tuxcare.1.","status":"published","published":"2026-10-28T15:11:29Z","modified":"2026-10-28T19:45:06.121956747Z","updated_at":"2026-11-02T15:43:55.669514Z"},{"id":"CLSA-2026-1794214732","title":"TuxCare security update for org.springframework.data:spring-data-commons (2 CVEs)","description":"TuxCare rebuilt org.springframework.data:spring-data-commons to address 2 CVEs. Fixed in 2.1.21.RELEASE-tuxcare.1.","status":"published","published":"2026-11-09T09:58:53Z","modified":"2026-11-09T19:15:04.83262015Z","updated_at":"2026-11-09T19:38:09.278998Z"},{"id":"ROOT-APP-MAVEN-CVE-2026-41695","title":"CVE-2026-41695 in org.springframework.data:spring-data-commons - Patched by Root","description":"Root has patched CVE-2026-41695 in the org.springframework.data:spring-data-commons package for Root:Maven. Multiple fixed versions available.","status":"published","published":"2026-09-18T08:23:48Z","modified":"2026-09-18T09:15:03.645038426Z","updated_at":"2026-11-02T15:53:27.066589Z"}]}}
