This release includes 27 security fixes for security teams reviewing exposed deployments.
Topics
+14 more
Affected surfaces
Summary
AI summaryUpdates ReDoS, api/utils/ssrf-protection.js, and disable-web-security across a mixed release.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| 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 |
Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries 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 Scope export download/delete to caller's app_id; reject path-traversal in filenames 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 |
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 |
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 |
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 |
Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login to close fixation Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login to close fixation 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 /i/cms/save_entries, /o/system/plugins, /i/systemlogs restricted to global admins Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Add common.resolvePathInBase helper for safe path containment checks Add common.resolvePathInBase helper for safe path containment checks Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Add error handlers to crash report streamed responses Add error handlers to crash report streamed responses Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Constrain public screenshot route paths and stream error handling Constrain public screenshot route paths and stream error handling Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Require auth + per-widget app permission on /o/dashboards/test; remove the unused endpoint Require auth + per-widget app permission on /o/dashboards/test; remove the unused endpoint Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | 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 |
— |
| 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 |
Block $graphLookup aggregation stage (cross-collection data exfiltration) Block $graphLookup aggregation stage (cross-collection data exfiltration) Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Wrap non-admin scope as top-level $and so user-supplied $or/$nor cannot bypass per-tenant filter Wrap non-admin scope as top-level $and so user-supplied $or/$nor cannot bypass per-tenant filter Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Reject path-traversal in admin log file paths Reject path-traversal in admin log file paths Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Whitelist updatable fields on create/update; scope reads by app_id Whitelist updatable fields on create/update; scope reads by app_id Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Add stream error handlers to export download Add stream error handlers to export download 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 the note's stored app_id Bind notes to permission-checked app_id; check edit permissions against the note's 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 |
Bind message create/test/update/one/remove/toggle to query-string app_id (cross-app push injection) Bind message create/test/update/one/remove/toggle to query-string app_id (cross-app push injection) 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 |
Add stream error handlers Add stream error handlers Source: granite4.1:8b-q6_K@2026-05-19 Confidence: high |
— |
| Security | Medium |
Return 404 when event_groups lookup misses Return 404 when event_groups lookup misses Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
| 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: low |
— |
| Refactor | Medium |
(--disable-web-security) removed from puppeteer (--disable-web-security) removed from puppeteer Source: granite4.1:8b-q6_K@2026-05-19 Confidence: low |
— |
Full changelog
Security fixes:
- [alerts] Validate alertConfig.selectedApps against caller's permissions (cross-app metric exfiltration)
- [app_users / logger / compliance-hub] Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user-supplied queries
- [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
- [apps] Replace updateApp/createApp mass-assignment with explicit field allowlist
- [auth] Generate new-member invite prid with crypto.randomBytes (replace predictable HMAC)
- [auth] Handle req.session.regenerate error in token login
- [auth] Replace OTP-equality recaptcha bypass with twoFactorPassed session flag
- [auth] Restrict /login/token/:token to login-purpose tokens; regenerate session id on token login to close fixation
- [cms / system / systemlogs] /i/cms/save_entries, /o/system/plugins, /i/systemlogs restricted to global admins
- [core] Add common.resolvePathInBase helper for safe path containment checks
- [crashes] Add error handlers to crash report streamed responses
- [dashboards] Constrain public screenshot route paths and stream error handling
- [dashboards] Identical response for missing/inaccessible dashboard (no enumeration)
- [dashboards] Require auth + per-widget app permission on /o/dashboards/test; remove the unused endpoint
- [data_migration] Constrain export/import paths to allowed directories; reject path-traversal in target_path, multipart filenames, and exportid (backport of #7491)
- [data] Escape regex metacharacters in sSearch parameters (ReDoS)
- [data] Return 404 (not 500) when event_groups lookup misses
- [dbviewer] Block $graphLookup aggregation stage (cross-collection data exfiltration)
- [dbviewer] Wrap non-admin scope as top-level $and so user-supplied $or/$nor cannot bypass per-tenant filter (cross-tenant data exfiltration)
- [errorlogs] Reject path-traversal in admin log file paths
- [event_groups] Whitelist updatable fields on create/update; scope reads by app_id
- [exports] Add stream error handlers to export download
- [exports] Authorize /o/export/download by task ownership / app_id
- [notes] Bind notes to permission-checked app_id; check edit permissions against the note's stored app_id
- [notes] Enforce saveNote schema validation
- [output] Remove noescape query-string bypass on returnOutput (reflected-XSS via parameter)
- [push] Bind message create/test/update/one/remove/toggle to query-string app_id (cross-app push injection)
- [redirect] Apply SSRF protection (api/utils/ssrf-protection.js) to app.redirect_url outbound requests
- [render] (--disable-web-security) removed from puppeteer
- [reports] Add stream error handlers
- [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
- [system-utility] Harden streamed responses with error handlers
- [tasks] Authorize /i/tasks/{update,delete,name,edit} per task ownership / app admin / global admin
- [users] /users/check/username now requires global admin (parity with email check)
Enterprise Features:
- [journey_engine] Maker checker approver
- [journey_engine] Engagement cooldown information added to journey builder and user profiles
Enterprise Fixes:
- [active_users] Fixed logic to prevent triggering active users calculation if it
- [cognito] Fix crash on GET /clogin/:code when body-parser 2.x leaves req.body undefined on requests with no bodyis already running.
- [drill] Add query hint based on default indexes
- [drill] Add contextual links in drill table for user IDs and crash groups
- [drill] Resolve device IDs to user profiles via server-side redirect endpoint
- [drill] Open crash group and user profile links in new tab
- [drill] Show user-friendly error message when saving a query fails
- [users] Fix MongoDB dot encoding (.) leaking into user profile UI filters, breakdown dropdown, and URLs
Breaking Changes
- --disable-web-security removed from puppeteer
Security Fixes
- [alerts] Validate alertConfig.selectedApps against caller's permissions (prevents cross‑app metric exfiltration)
- [app_users / logger / compliance-hub] Strip dangerous Mongo operators ($where, $expr, $function, $accumulator) from user‑supplied queries
- [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
- [apps] Replace mass‑assignment with explicit field allowlist
- [auth] Generate invite prid with crypto.randomBytes (replaces predictable HMAC)
- [auth] Handle req.session.regenerate error in token login
- [auth] Use twoFactorPassed session flag instead of OTP‑equality recaptcha bypass
- [auth] Restrict /login/token/:token to login‑purpose tokens; regenerate session ID on token login (fixes fixation)
- [cms / system / systemlogs] Restrict /i/cms/save_entries, /o/system/plugins, /i/systemlogs to global admins
- [core] Add common.resolvePathInBase helper for safe path containment checks
- [crashes] Add error handlers to crash report streamed responses
- [dashboards] Constrain public screenshot route paths and add stream error handling
- [dashboards] Return identical response for missing/inaccessible dashboard (prevents enumeration)
- [dashboards] Require auth + per‑widget app permission on /o/dashboards/test; remove unused endpoint
- [data_migration] Constrain export/import paths to allowed directories; reject path‑traversal in target_path, filenames, and exportid
- [data] Escape regex metacharacters in sSearch parameters (prevents ReDoS)
- [dbviewer] Block $graphLookup aggregation stage (cross‑collection data exfiltration)
- [dbviewer] Wrap non‑admin scope as top‑level $and to prevent bypass of per‑tenant filter (cross‑tenant exfiltration)
- [errorlogs] Reject path‑traversal in admin log file paths
- [event_groups] Whitelist updatable fields; scope reads by app_id
- [exports] Add stream error handlers to export download; authorize /o/export/download by task ownership/app_id
- [notes] Bind notes to permission‑checked app_id; enforce saveNote schema validation
- [output] Remove noescape query‑string bypass on returnOutput (prevents reflected XSS)
- [push] Bind message routes to query‑string app_id (prevents cross‑app push injection)
- [redirect] Apply SSRF protection (api/utils/ssrf-protection.js) to outbound app.redirect_url requests
- [star-rating] Close stored XSS in feedback widget logo upload/preview; restrict uploads to image MIME types and validate magic bytes
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]