### Impact `#[ApiProperty(security: ...)]` is evaluated per request to decide whether a property is exposed. The `componentsCache` arrays in `ApiPlatform\JsonApi\Serializer\ItemNormalizer` and `ApiPlatform\Hal\Serializer\ItemNormalizer` are keyed on `$context['cache_key']`, which is set unconditionally before delegating to the parent normalizer. The component structure (attributes, relationships, links) computed for one request can therefore be reused for a subsequent request whose user has a different set of accessible properties. A user with lower privileges may end up seeing the structure of properties that the security predicate would otherwise have hidden for them. This is the same vulnerability class as [GHSA-428q-q3vv-3fq3](https://github.com/api-platform/core/security/advisories/GHSA-428q-q3vv-3fq3) / CVE-2025-31485, which fixed only the GraphQL `ItemNormalizer`. The JSON:API and HAL paths were not addressed at the time. ### Exploitation conditions Exploitation requires all of the following to coincide: - The application exposes a resource via the JSON:API and/or HAL formats. - At least one property of that resource uses `#[ApiProperty(security: ...)]` with a predicate whose result depends on the current user (or on per-request state). - A request from a user for whom the predicate evaluates to `true` populates `componentsCache` before a request from a user for whom the predicate evaluates to `false`, within the lifetime of the same PHP process. - The deployment uses a long-running PHP runtime that keeps the normalizer instance alive across requests (FrankenPHP worker mode, RoadRunner, Swoole, ReactPHP, etc.). With classic `php-fpm` workers the cache only survives the duration of a single request, which makes the issue much harder to observe in practice. ### Patches - 4.1.29 - 4.2.25 - 4.3.8 All three branches receive patched releases of `api-platform/core`, `api-platform/json-api`, and `api-platform/hal`. ### Workarounds Override the JSON:API and HAL `ItemNormalizer` services to gate `$context['cache_key']` with a resource-class security check, or avoid `#[ApiProperty(security: ...)]` on resources served as JSON:API or HAL until the patch is applied. Pinning the deployment to classic `php-fpm` workers also limits exposure since the cache does not survive across requests. ### Credits - Tillmann Baumgart (@tillmon) — originally identified the broader cache-key gap and proposed moving `isCacheKeySafe` to `AbstractItemNormalizer`. - Antoine Bluchet (@soyuka) — extended the gate to JSON:API and HAL normalizers.
### Impact `#[ApiProperty(security: ...)]` is evaluated per request to decide whether a property is exposed. The `componentsCache` arrays in `ApiPlatform\JsonApi\Serializer\ItemNormalizer` and `ApiPlatform\Hal\Serializer\ItemNormalizer` are keyed on `$context['cache_key']`, which is set unconditionally before delegating to the parent normalizer. The component structure (attributes, relationships, links) computed for one request can therefore be reused for a subsequent request whose user has a different set of accessible properties. A user with lower privileges may end up seeing the structure of properties that the security predicate would otherwise have hidden for them. This is the same vulnerability class as [GHSA-428q-q3vv-3fq3](https://github.com/api-platform/core/security/advisories/GHSA-428q-q3vv-3fq3) / CVE-2025-31485, which fixed only the GraphQL `ItemNormalizer`. The JSON:API and HAL paths were not addressed at the time. ### Exploitation conditions Exploitation requires all of the following to coincide: - The application exposes a resource via the JSON:API and/or HAL formats. - At least one property of that resource uses `#[ApiProperty(security: ...)]` with a predicate whose result depends on the current user (or on per-request state). - A request from a user for whom the predicate evaluates to `true` populates `componentsCache` before a request from a user for whom the predicate evaluates to `false`, within the lifetime of the same PHP process. - The deployment uses a long-running PHP runtime that keeps the normalizer instance alive across requests (FrankenPHP worker mode, RoadRunner, Swoole, ReactPHP, etc.). With classic `php-fpm` workers the cache only survives the duration of a single request, which makes the issue much harder to observe in practice. ### Patches - 4.1.29 - 4.2.25 - 4.3.8 All three branches receive patched releases of `api-platform/core`, `api-platform/json-api`, and `api-platform/hal`. ### Workarounds Override the JSON:API and HAL `ItemNormalizer` services to gate `$context['cache_key']` with a resource-class security check, or avoid `#[ApiProperty(security: ...)]` on resources served as JSON:API or HAL until the patch is applied. Pinning the deployment to classic `php-fpm` workers also limits exposure since the cache does not survive across requests. ### Credits - Tillmann Baumgart (@tillmon) — originally identified the broader cache-key gap and proposed moving `isCacheKeySafe` to `AbstractItemNormalizer`. - Antoine Bluchet (@soyuka) — extended the gate to JSON:API and HAL normalizers.
Update api-platform/core to 4.1.29; api-platform/core to 4.2.25; api-platform/core to 4.3.8; api-platform/hal to 4.1.29; api-platform/hal to 4.2.25; api-platform/hal to 4.3.8; api-platform/json-api to 4.1.29; api-platform/json-api to 4.2.25; api-platform/json-api to 4.3.8 if you use the affected versions. Test the change in a non-production environment first.
Local check
hol-guard supply-chain scanAPI Platform Core vulnerable to cross-user attribute leak in JSON:API and HAL item normalizers due to missing isCacheKeySafe gate affects api-platform/core (composer), api-platform/core (composer), api-platform/core (composer), api-platform/hal (composer), api-platform/hal (composer), api-platform/hal (composer), api-platform/json-api (composer), api-platform/json-api (composer), api-platform/json-api (composer). Severity is medium. ### Impact `#[ApiProperty(security: ...)]` is evaluated per request to decide whether a property is exposed. The `componentsCache` arrays in `ApiPlatform\JsonApi\Serializer\ItemNormalizer` and `ApiPlatform\Hal\Serializer\ItemNormalizer` are keyed on `$context['cache_key']`, which is set unconditionally before delegating to the parent normalizer. The component structure (attributes, relationships, links) computed for one request can therefore be reused for a subsequent request whose user has a different set of accessible properties. A user with lower privileges may end up seeing the structure of properties that the security predicate would otherwise have hidden for them. This is the same vulnerability class as [GHSA-428q-q3vv-3fq3](https://github.com/api-platform/core/security/advisories/GHSA-428q-q3vv-3fq3) / CVE-2025-31485, which fixed only the GraphQL `ItemNormalizer`. The JSON:API and HAL paths were not addressed at the time. ### Exploitation conditions Exploitation requires all of the following to coincide: - The application exposes a resource via the JSON:API and/or HAL formats. - At least one property of that resource uses `#[ApiProperty(security: ...)]` with a predicate whose result depends on the current user (or on per-request state). - A request from a user for whom the predicate evaluates to `true` populates `componentsCache` before a request from a user for whom the predicate evaluates to `false`, within the lifetime of the same PHP process. - The deployment uses a long-running PHP runtime that keeps the normalizer instance alive across requests (FrankenPHP worker mode, RoadRunner, Swoole, ReactPHP, etc.). With classic `php-fpm` workers the cache only survives the duration of a single request, which makes the issue much harder to observe in practice. ### Patches - 4.1.29 - 4.2.25 - 4.3.8 All three branches receive patched releases of `api-platform/core`, `api-platform/json-api`, and `api-platform/hal`. ### Workarounds Override the JSON:API and HAL `ItemNormalizer` services to gate `$context['cache_key']` with a resource-class security check, or avoid `#[ApiProperty(security: ...)]` on resources served as JSON:API or HAL until the patch is applied. Pinning the deployment to classic `php-fpm` workers also limits exposure since the cache does not survive across requests. ### Credits - Tillmann Baumgart (@tillmon) — originally identified the broader cache-key gap and proposed moving `isCacheKeySafe` to `AbstractItemNormalizer`. - Antoine Bluchet (@soyuka) — extended the gate to JSON:API and HAL normalizers.
AI coding agents often install or upgrade packages automatically in composer. A medium vulnerability in a dependency can be pulled into a project through a normal install or update without a human reviewing the change, expanding the blast radius from a single package to every agent workspace that depends on it.
| Package | Affected range | Fixed version |
|---|---|---|
| api-platform/corecomposer | >=2.6.0,<4.1.29 | 4.1.29 |
| api-platform/corecomposer | >=4.2.0,<4.2.25 | 4.2.25 |
| api-platform/corecomposer | >=4.3.0,<4.3.8 | 4.3.8 |
| api-platform/halcomposer | >=4.0.0,<4.1.29 | 4.1.29 |
| api-platform/halcomposer | >=4.2.0,<4.2.25 | 4.2.25 |
| api-platform/halcomposer | >=4.3.0,<4.3.8 | 4.3.8 |
| api-platform/json-apicomposer | >=4.0.0,<4.1.29 |
Reported by GitHub Security Advisories (ghsa).
HOL Guard can help your team review package activity against supported protection paths.
Explore HOL GuardUpdate api-platform/core to 4.1.29; api-platform/core to 4.2.25; api-platform/core to 4.3.8; api-platform/hal to 4.1.29; api-platform/hal to 4.2.25; api-platform/hal to 4.3.8; api-platform/json-api to 4.1.29; api-platform/json-api to 4.2.25; api-platform/json-api to 4.3.8 if you use the affected versions. Test the change in a non-production environment first.
Local check
hol-guard supply-chain scanAPI Platform Core vulnerable to cross-user attribute leak in JSON:API and HAL item normalizers due to missing isCacheKeySafe gate affects api-platform/core (composer), api-platform/core (composer), api-platform/core (composer), api-platform/hal (composer), api-platform/hal (composer), api-platform/hal (composer), api-platform/json-api (composer), api-platform/json-api (composer), api-platform/json-api (composer). Severity is medium. ### Impact `#[ApiProperty(security: ...)]` is evaluated per request to decide whether a property is exposed. The `componentsCache` arrays in `ApiPlatform\JsonApi\Serializer\ItemNormalizer` and `ApiPlatform\Hal\Serializer\ItemNormalizer` are keyed on `$context['cache_key']`, which is set unconditionally before delegating to the parent normalizer. The component structure (attributes, relationships, links) computed for one request can therefore be reused for a subsequent request whose user has a different set of accessible properties. A user with lower privileges may end up seeing the structure of properties that the security predicate would otherwise have hidden for them. This is the same vulnerability class as [GHSA-428q-q3vv-3fq3](https://github.com/api-platform/core/security/advisories/GHSA-428q-q3vv-3fq3) / CVE-2025-31485, which fixed only the GraphQL `ItemNormalizer`. The JSON:API and HAL paths were not addressed at the time. ### Exploitation conditions Exploitation requires all of the following to coincide: - The application exposes a resource via the JSON:API and/or HAL formats. - At least one property of that resource uses `#[ApiProperty(security: ...)]` with a predicate whose result depends on the current user (or on per-request state). - A request from a user for whom the predicate evaluates to `true` populates `componentsCache` before a request from a user for whom the predicate evaluates to `false`, within the lifetime of the same PHP process. - The deployment uses a long-running PHP runtime that keeps the normalizer instance alive across requests (FrankenPHP worker mode, RoadRunner, Swoole, ReactPHP, etc.). With classic `php-fpm` workers the cache only survives the duration of a single request, which makes the issue much harder to observe in practice. ### Patches - 4.1.29 - 4.2.25 - 4.3.8 All three branches receive patched releases of `api-platform/core`, `api-platform/json-api`, and `api-platform/hal`. ### Workarounds Override the JSON:API and HAL `ItemNormalizer` services to gate `$context['cache_key']` with a resource-class security check, or avoid `#[ApiProperty(security: ...)]` on resources served as JSON:API or HAL until the patch is applied. Pinning the deployment to classic `php-fpm` workers also limits exposure since the cache does not survive across requests. ### Credits - Tillmann Baumgart (@tillmon) — originally identified the broader cache-key gap and proposed moving `isCacheKeySafe` to `AbstractItemNormalizer`. - Antoine Bluchet (@soyuka) — extended the gate to JSON:API and HAL normalizers.
AI coding agents often install or upgrade packages automatically in composer. A medium vulnerability in a dependency can be pulled into a project through a normal install or update without a human reviewing the change, expanding the blast radius from a single package to every agent workspace that depends on it.
| Package | Affected range | Fixed version |
|---|---|---|
| api-platform/corecomposer | >=2.6.0,<4.1.29 | 4.1.29 |
| api-platform/corecomposer | >=4.2.0,<4.2.25 | 4.2.25 |
| api-platform/corecomposer | >=4.3.0,<4.3.8 | 4.3.8 |
| api-platform/halcomposer | >=4.0.0,<4.1.29 | 4.1.29 |
| api-platform/halcomposer | >=4.2.0,<4.2.25 | 4.2.25 |
| api-platform/halcomposer | >=4.3.0,<4.3.8 | 4.3.8 |
| api-platform/json-apicomposer | >=4.0.0,<4.1.29 |
Reported by GitHub Security Advisories (ghsa).
HOL Guard can help your team review package activity against supported protection paths.
Explore HOL Guard| 4.1.29 |
| api-platform/json-apicomposer | >=4.2.0,<4.2.25 | 4.2.25 |
|---|
| api-platform/json-apicomposer | >=4.3.0,<4.3.8 | 4.3.8 |
|---|
Fixed versions are reported by the source feed; confirm compatibility before updating.
| 4.1.29 |
| api-platform/json-apicomposer | >=4.2.0,<4.2.25 | 4.2.25 |
|---|
| api-platform/json-apicomposer | >=4.3.0,<4.3.8 | 4.3.8 |
|---|
Fixed versions are reported by the source feed; confirm compatibility before updating.