BuidlZone-Labs/zicket-web
Shared Mutable Module State Leaks Data Across SSR Requests
Open
#174 opened on Jul 29, 2026
Stellar Wavebugdifficulty: mediumhelp wantedsecurity
Repository metrics
- Stars
- (4 stars)
- PR merge metrics
- (PR metrics pending)
Description
Category
Bug
Priority
High
Description
In lib/user-session-sync.ts, state is defined at module scope (let state = { anonymousBrowsing: false, walletConnected: false }). During Server-Side Rendering (SSR), useSyncExternalStore invokes getServerSnapshot = () => state. Because Node.js keeps module scope variables across incoming HTTP requests, modifying state during SSR leaks state across concurrent users.
Evidence from lib/user-session-sync.ts#L16-L19:
let state: SessionState = {
anonymousBrowsing: false,
walletConnected: false,
};
Proposed Solution
- Replace module-level mutable variables with React Context or scoped state providers (
SessionProvider). - Ensure SSR fallback
getServerSnapshotreturns a static default state object.
Acceptance Criteria
- Session state is scoped per request / component tree using React Context.
- No module-level mutable variables used for SSR snapshots.
- Session persistence across tabs uses React Context +
useSyncExternalStoresafely.
Files
lib/user-session-sync.ts