Skip to content

Commit a5f05da

Browse files
committed
Remove fixed JWTEventListener vulnerability from open issues in CLAUDE.md
1 parent ef947dd commit a5f05da

1 file changed

Lines changed: 0 additions & 36 deletions

File tree

CLAUDE.md

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -689,42 +689,6 @@ The bundle ships Doctrine migrations. Currently migrations live in the PHP files
689689

690690
---
691691

692-
### JWTEventListener: cross-user Set-Cookie leakage in FrankenPHP worker mode
693-
694-
**File:** `src/EventListener/Jwt/JWTEventListener.php`
695-
696-
`JWTEventListener` holds `private ?string $token = null` as an instance variable (line 29). In FrankenPHP worker mode the service container is never rebuilt between requests — the same `JWTEventListener` instance handles all requests on a given worker. When `onJWTRefreshed()` sets `$this->token` during an authenticated request (JWT expiry auto-refresh), that value persists into the next request on the same worker. If that next request is anonymous and matches the Souin `@use_cache` rule, the anonymous response gets a `Set-Cookie: api_component=<other_user_jwt>` header, which Souin may then cache and serve to further users.
697-
698-
**Fix:** Implement `Symfony\Contracts\Service\ResetInterface`. Symfony's DI container auto-calls `reset()` between requests in worker mode:
699-
700-
```php
701-
use Symfony\Contracts\Service\ResetInterface;
702-
703-
final class JWTEventListener implements ResetInterface
704-
{
705-
private ?string $token = null;
706-
707-
public function reset(): void
708-
{
709-
$this->token = null;
710-
}
711-
```
712-
713-
Also clear `$this->token` at the top of `onKernelResponse()` before use as defense-in-depth (so the method is idempotent even if `reset()` is not called):
714-
715-
```php
716-
public function onKernelResponse(ResponseEvent $event): void
717-
{
718-
$token = $this->token;
719-
$this->token = null;
720-
if (!empty($token)) { ... }
721-
}
722-
```
723-
724-
**Status:** Fix needed. Reported from `components-web-app` investigation 2026-06-19.
725-
726-
---
727-
728692
### #60 — Uploadable: Private files (S3 pre-signed URLs)
729693

730694
When a component has a file uploaded to S3 with private ACL, accessing the file requires a pre-signed temporary URL. The bundle's uploadable system doesn't currently handle the pre-signed URL lifecycle — the URL returned may be permanent and publicly accessible (or inaccessible).

0 commit comments

Comments
 (0)