Skip to content

countly-server

v25.03.44 Security

This release includes 27 security fixes for security teams reviewing exposed deployments.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 27 known CVEs

Topics

ai analytics coppa crash-analytics customer-engagement web
+14 more
data-ownership data-privacy digital-analytics feature-flags gdpr hipaa insights mobile-analytics push-notifications remote-configuration tracking user-feedback user-journeys web-analytics

Affected surfaces

auth rbac rce_ssrf breaking_upgrade

Summary

AI summary

Updates ReDoS, api/utils/ssrf-protection.js, and disable-web-security across a mixed release.

Changes in this release

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

Track countly-server

Get notified when new releases ship.

Sign up free

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.

All releases →

Related context

Beta — feedback welcome: [email protected]