v0.8.5
Released
Fix
Security Hardening, SSE Fixes & Memory Leak Cleanup
Five cross-org and auth security fixes, corrected SSE real-time streams, resolved 20+ Svelte memory leaks on navigation, and multiple bug fixes across SIEM, incidents, webhooks, and retention jobs.
- Cross-org isolation and auth bypass fixes in SIEM and pattern routes
- SSRF protection for legacy webhook path and disabled-user login blocked
- SSE real-time events and log stream duplicate emission fixed
- 20+ Svelte memory leaks from unsubscribed auth stores resolved
- Docker config sync and dependency security bumps (picomatch, brace-expansion, fast-xml-parser)
Security
- Cross-org isolation fix in SIEM:
linkDetectionEventsToIncidentnow scopes detection events to the requesting organization, preventing cross-tenant data corruption via crafted API calls - Cross-org auth bypass in pattern routes: PUT and DELETE handlers for correlation patterns now verify organization membership before mutating data (same check GET/POST already had)
- SSRF protection for legacy webhook path: the alert-notification job’s direct
fetch()call now validates URLs against private/internal IP ranges, matching theWebhookProvidersafeguard - Disabled user login blocked:
POST /loginnow checks thedisabledflag before creating a session, preventing disabled accounts from obtaining tokens - Expired invitation info leak:
getInvitationByTokennow filters onexpires_at > NOW(), preventing enumeration of expired invitation details
Fixed
- SIEM dashboard timeline crash:
time_bucket()call was missing::intervalcast on the parameterized bucket width, causing a PostgreSQL type error that broke the timeline widget for all users - SSE real-time events broken: SIEM store and incident detail page read auth token from
localStorage('session_token')(wrong key), so the SSE connection never authenticated; now usesgetAuthToken()from the shared auth utility - SSE log stream duplicate emission: when multiple logs shared the same timestamp, the inclusive
frombound caused them to be re-sent on every poll tick; stream now tracks sent log IDs to deduplicate - Incident severity auto-grouping wrong:
MAX(severity)used PostgreSQL alphabetical ordering (medium>critical), producing incorrect severity on auto-grouped incidents; now uses ordinal ranking - Sigma notification failures silent: notification job payload was missing
organization_idandproject_id, andmarkAsNotifiedwas called withnullhistoryId; both now handled correctly - Incidents pagination total always zero:
loadIncidentsin the SIEM store never wroteresponse.totaltoincidentsTotal - Memory leaks on navigation: 20+ Svelte components called
authStore.subscribe()without cleanup; all now store the unsubscribe function and call it inonDestroy offset=0silently dropped: API client functions usedif (filters.offset)which is falsy for zero, so page-1 requests never sent theoffsetparameter; changed toif (filters.offset != null)- Search debounce timer leak:
searchDebounceTimerwas not cleared inonDestroy, causing post-unmount API calls when navigating away mid-search verifyProjectAccessdouble call: whenprojectIdis an array, the first element was verified twice (once before the loop, once inside it); consolidated into a single loopupdateIncidentsilent field skip:title,severity, andstatusused truthy checks (&&) instead of!== undefined, inconsistent withdescriptionandassigneeId- Webhook error messages empty:
response.statusTextis empty for HTTP/2; error now reads the response body for useful detail - Retention job crash on empty orgs:
Math.max(...[])returns-Infinity, cascading to anInvalid Datein thedrop_chunkscall; early return added when no organizations exist escapeHtmlDOM leak: PDF export’sescapeHtmlcreated orphaned DOM nodes in the parent document; replaced with pure string replacement- Webhook headers validation missing:
CreateChannelDialogsilently swallowed invalid JSON in the custom headers field; now validates on submit getIncidentDetectionsno org scope: query now accepts optionalorganizationIdfor defense-in-depth filtering- Stale shared package types: dist contained outdated
ProjectandIncidentinterfaces with phantom fields (slug,statusPageVisibility,source,monitorId); rebuilt from source
Changed
- Docker config sync:
docker-compose.build.ymlnow matchesdocker-compose.ymlwith all environment variables (MongoDB,TRUST_PROXY,FRONTEND_URL,INTERNAL_DSN,DOCKER_CONTAINER), MongoDB service, andfluent-bit-metricsservice NODE_ENVfor backend: productiondocker-compose.ymlnow setsNODE_ENV: productionon the backend service (worker and frontend already had it)docker/.env.example: addedSTORAGE_ENGINE, ClickHouse, and MongoDB configuration sections
Dependencies
picomatch4.0.3 → 4.0.4 (fix ReDoS via extglob quantifiers + POSIX character class method injection)brace-expansion5.0.2 → 5.0.5 (fix zero-step sequence DoS)fast-xml-parser5.5.6 → 5.5.9 (fix entity expansion limits bypass)fastifybumped via dependabotkyselybumped via dependabot