This release includes 24 security fixes for security teams reviewing exposed deployments.
Topics
+14 more
Affected surfaces
Summary
AI summaryHardening pass adds token‑login session regeneration, endpoint removals, aggregation stage blocks, SSRF protections, schema validations, mass‑assignment allowlists, and XSS fixes.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Security | Medium |
Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Require auth + per-widget app permission on /o/dashboards/test; remove unused endpoint Require auth + per-widget app permission on /o/dashboards/test; remove unused endpoint Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Identical response for missing/inaccessible dashboard (no enumeration) Identical response for missing/inaccessible dashboard (no enumeration) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Block $graphLookup aggregation stage in dbviewer (cross-collection data exfiltration) Block $graphLookup aggregation stage in dbviewer (cross-collection data exfiltration) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Apply SSRF protection to app.redirect_url outbound requests Apply SSRF protection to app.redirect_url outbound requests Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Authorize /i/tasks/{update,delete,name,edit} per task ownership / app admin / global admin Authorize /i/tasks/{update,delete,name,edit} per task ownership / app admin / global admin Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Authorize /o/export/download by task ownership / app_id Authorize /o/export/download by task ownership / app_id Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Bind notes to permission-checked app_id; check edit permissions against stored app_id Bind notes to permission-checked app_id; check edit permissions against stored app_id Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Enforce saveNote schema validation Enforce saveNote schema validation Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Replace updateApp/createApp mass-assignment with explicit field allowlist Replace updateApp/createApp mass-assignment with explicit field allowlist Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Whitelist updatable fields on create/update; scope reads by app_id in event_groups Whitelist updatable fields on create/update; scope reads by app_id in event_groups Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Sanitize user.picture filename before deletion (path traversal) Sanitize user.picture filename before deletion (path traversal) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Scope export download/delete to caller's app_id; reject path-traversal in filenames for app_users Scope export download/delete to caller's app_id; reject path-traversal in filenames for app_users Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries (logger, compliance-hub) Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries (logger, compliance-hub) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Bind push message routes to query-string app_id (cross-app push injection) Bind push message routes to query-string app_id (cross-app push injection) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Validate alertConfig.selectedApps against caller's permissions (cross-app metric exfiltration) Validate alertConfig.selectedApps against caller's permissions (cross-app metric exfiltration) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Escape regex metacharacters in sSearch parameters (ReDoS) Escape regex metacharacters in sSearch parameters (ReDoS) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
/users/check/username now requires global admin (parity with email check) /users/check/username now requires global admin (parity with email check) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
/i/cms/save_entries, /o/system/plugins, /i/systemlogs restricted to global admins (cms, system, systemlogs) /i/cms/save_entries, /o/system/plugins, /i/systemlogs restricted to global admins (cms, system, systemlogs) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Replace OTP-equality recaptcha bypass with twoFactorPassed session flag Replace OTP-equality recaptcha bypass with twoFactorPassed session flag Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Generate new-member invite prid with crypto.randomBytes (replace predictable HMAC) Generate new-member invite prid with crypto.randomBytes (replace predictable HMAC) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Remove noescape query-string bypass on returnOutput (reflected XSS via parameter) Remove noescape query-string bypass on returnOutput (reflected XSS via parameter) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Handle req.session.regenerate error in token login Handle req.session.regenerate error in token login Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Return 404 when event_groups lookup misses (not 500) Return 404 when event_groups lookup misses (not 500) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Defense-in-depth on image upload/serve routes (star-rating) Defense-in-depth on image upload/serve routes (star-rating) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Constrain export/import paths to allowed directories; reject path-traversal in target_path, multipart filenames, and exportid Constrain export/import paths to allowed directories; reject path-traversal in target_path, multipart filenames, and exportid Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Reject path-traversal in admin log file paths (errorlogs) Reject path-traversal in admin log file paths (errorlogs) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Harden streamed responses with error handlers (system-utility) Harden streamed responses with error handlers (system-utility) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Bugfix | Medium |
Add error handlers to crash report streamed responses (crashes) Add error handlers to crash report streamed responses (crashes) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
Full changelog
Security Fixes (backport of #7535 — bug-bounty-style hardening pass):
- [auth] Restrict
/login/token/:tokento login-purpose tokens; regenerate session id on token login to close fixation - [dashboards] Require auth + per-widget app permission on
/o/dashboards/test; remove the unused endpoint - [dashboards] Identical response for missing/inaccessible dashboard (no enumeration)
- [dbviewer] Block
$graphLookupaggregation stage (cross-collection data exfiltration) - [redirect] Apply SSRF protection (
api/utils/ssrf-protection.js) toapp.redirect_urloutbound requests - [tasks] Authorize
/i/tasks/{update,delete,name,edit}per task ownership / app admin / global admin - [exports] Authorize
/o/export/downloadby task ownership / app_id - [notes] Bind notes to permission-checked
app_id; check edit permissions against the note's storedapp_id - [notes] Enforce
saveNoteschema validation - [apps] Replace updateApp/createApp mass-assignment with explicit field allowlist
- [event_groups] Whitelist updatable fields on create/update; scope reads by
app_id - [app_users] Sanitize
user.picturefilename before deletion (path traversal) - [app_users] Scope export download/delete to caller's
app_id; reject path-traversal in filenames - [app_users / logger / compliance-hub] Strip dangerous Mongo operators (
$where,$expr,$function,$accumulator) from user-supplied queries - [push] Bind message create/test/update/one/remove/toggle to query-string
app_id(cross-app push injection) - [alerts] Validate
alertConfig.selectedAppsagainst caller's permissions (cross-app metric exfiltration) - [data] Escape regex metacharacters in
sSearchparameters (ReDoS) - [users]
/users/check/usernamenow requires global admin (parity with email check) - [cms / system / systemlogs]
/i/cms/save_entries,/o/system/plugins,/i/systemlogsrestricted to global admins - [auth] Replace OTP-equality recaptcha bypass with
twoFactorPassedsession flag - [auth] Generate new-member invite
pridwithcrypto.randomBytes(replace predictable HMAC) - [output] Remove
noescapequery-string bypass onreturnOutput(reflected-XSS via parameter) - [auth] Handle
req.session.regenerateerror in token login - [data] Return 404 (not 500) when
event_groupslookup misses
24.05-specific notes (some master fixes were not directly applicable):
- C-1 (
$graphLookup) and M-11 (dbviewer non-admin filter scope): master uses awhiteListedAggregationStagesmechanism (added by SER-2122) and agetBaseAppFilterper-collection app-id mechanism that 24.05 does not have. C-1 is implemented as a minimal targeted block; M-11 is not applicable here. A broader 24.05 dbviewer hardening (porting SER-2122 + filter scope + M-11) is left for a separate change. - M-14 (
--disable-web-security): the flag was never present in 24.05's puppeteer args, so the master fix is a no-op; only an explanatory comment was added. - L-7 (drop wildcard CORS from reports preview/pdf): intentionally not backported — the wildcard is needed for puppeteer PDF rendering against
data:URL documents (sub-resource fetches). Same decision as on master where the L-7 fix was reverted.
Fixes:
- [star-rating] Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes (backport of #7532)
- [star-rating] Defense-in-depth on image upload/serve routes
- [data_migration] Constrain export/import paths to allowed directories; reject path-traversal in
target_path, multipart filenames, and exportid (backport of #7491) - [errorlogs] Reject path-traversal in admin log file paths
- [system-utility] Harden streamed responses with error handlers
- [crashes] Add error handlers to crash report streamed responses
- [exports] Add stream error handlers to export download
- [reports] Add stream error handlers
- [dashboards] Constrain public screenshot route paths and stream error handling
- [core] Add
common.resolvePathInBasehelper for safe path containment checks
Breaking Changes
- [dashboards] Remove the unused endpoint `/o/dashboards/test`
- [auth] Regenerate session ID on token login (`/login/token/:token`) to close fixation
Security Fixes
- [auth] Restrict `/login/token/:token` to login‑purpose tokens and regenerate session ID (CVE not listed)
- [dashboards] Require auth + per‑widget app permission on previously unused endpoint (removal noted in breaking_changes)
- [dbviewer] Block `$graphLookup` aggregation stage (cross‑collection data exfiltration)
- [redirect] Apply SSRF protection to `app.redirect_url` outbound requests
- [tasks] Authorize `/i/tasks/{update,delete,name,edit}` per task ownership / app admin / global admin
- [exports] Authorize `/o/export/download` by task ownership / app_id
- [notes] Bind notes to permission‑checked `app_id` and enforce `saveNote` schema validation
- [apps] Replace mass‑assignment with explicit field allowlist on updateApp/createApp
- [event_groups] Whitelist updatable fields and scope reads by `app_id`
- [app_users] Sanitize `user.picture` filename before deletion (path traversal)
- [app_users] Scope export download/delete to caller's `app_id`; reject path‑traversal in filenames
- [app_users / logger / compliance-hub] Strip dangerous Mongo operators (`$where`, `$expr`, `$function`, `$accumulator`) from user‑supplied queries
- [push] Bind message routes to query‑string `app_id` (cross‑app push injection)
- [alerts] Validate `alertConfig.selectedApps` against caller's permissions (cross‑app metric exfiltration)
- [data] Escape regex metacharacters in `sSearch` parameters (ReDoS)
- [users] `/users/check/username` now requires global admin
- [cms / system / systemlogs] Restrict `/i/cms/save_entries`, `/o/system/plugins`, `/i/systemlogs` to global admins
- [auth] Replace OTP‑equality recaptcha bypass with `twoFactorPassed` session flag
- [auth] Generate new‑member invite `prid` with `crypto.randomBytes` (replace predictable HMAC)
- [output] Remove `noescape` query‑string bypass on `returnOutput` (reflected XSS)
- [star-rating] Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes
- [data_migration] Constrain export/import paths to allowed directories; reject path‑traversal
- [errorlogs] Reject path‑traversal in admin log file paths
- [system-utility / crashes / exports / reports / dashboards / core] Add stream error handlers for robustness
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About countly-server
Countly is a privacy-first, AI-powered analytics and engagement platform for understanding and optimizing customer journeys across digital applications, from desktop and mobile to IoT and connected environments.
Beta — feedback welcome: [email protected]