unleash-server

Ecosystem: npm

Downloads: 138.26 K

Vulnerabilities from the last (months)
  • 0CriticalAffects 0 versions
  • 2HighAffects 4 versions
  • 0MediumAffects 0 versions
  • 4ModerateAffects 6 versions
  • 1LowAffects 1 version
Severity distribution (all time)
7vulnerabilities
  • Critical0 (0.0%)
  • High2 (28.6%)
  • Medium0 (0.0%)
  • Moderate4 (57.1%)
  • Low1 (14.3%)

Monthly breakdown

  • Critical
  • High
  • Medium
  • Moderate
  • Low
  • 4 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 2
    • Low: 1
  • 3 vulnerabilities
    • Critical: 0
    • High: 1
    • Medium: 0
    • Moderate: 2
    • Low: 0

Vulnerabilities (7)

Known vulnerabilities affecting unleash-server, based on data from OSV.

Vulnerabilities affecting unleash-server
IDSeveritySummaryAffected versionsPublishedSource
GHSA-5ffh-6f9q-5hhrModerateUnleash: A project member can reorder activation strategies belonging to any other project / environment (cross-project integrity write), bypassing project RBAC and the audit log## Summary Unleash scopes write permissions per project and per environment: a user with the `UPDATE_FEATURE_STRATEGY` permission on project `A` is supposed to be able to mutate activation strategies only within project `A`. The endpoint `POST /api/admin/projects/:projectId/features/:featureName/environments/:environment/strategies/set-sort-order` violates this. The RBAC middleware authorizes the request against the `:projectId` taken from the URL, but the handler then writes the strategy IDs supplied in the request *body* directly to the database by primary key, **without ever verifying that
  • < 8.0.3
GitHub (opens in a new tab)
GHSA-72h8-wp98-7hchHighUnleash: Missing await on permission check + cross-project IDOR in admin API## Summary Multiple authorization vulnerabilities in Unleash admin API, including a critical missing `await` that completely bypasses a permission check. ## Vulnerability 1: Missing `await` on Permission Check (HIGH) **File:** `src/lib/features/segment/segment-controller.ts` (line 345) `POST /api/admin/segments/strategies` has `permission: NONE` at the route level. The handler performs its own check via `this.accessService.hasPermission()`, but **omits the `await` keyword**. Since `hasPermission()` is async (returns `Promise<boolean>`), the variable always receives a truthy Promise object.
  • < 8.0.3
GitHub (opens in a new tab)
GHSA-7hvx-28gp-mf6jLowUnleash: CR-approval email renders user-controlled raw HTML### Summary The change-request approval HTML email template renders fields as raw HTML. User who can create a change request can inject HTML into approval notification emails. I was not able to confirm Enterprise platform is using vulnerable code nor that it doesn't sanitize input. ### Details `src/mailtemplates/requested-cr-approval/requested-cr-approval.html.mustache` uses Mustache triple-stash syntax for fields that can originate from users: ```mustache {{{ changeRequestTitle }}} {{{ requesterName }}} {{{ requesterEmail }}} {{{ changeRequestLink }}} ``` Triple-stash disables HTML escapin
  • < 8.0.3
GitHub (opens in a new tab)
GHSA-8xcj-9hfr-fh9jModerateUnleash: Clone-feature lets a user copy a feature from a project they cannot read### Summary The clone-feature endpoint supports copying features across projects, but it does not verify that the caller can access the source project. A user with _create_ permissions in one project can clone a feature from another project they cannot read and then inspect the copied configuration. This vulnerability cannot be confirmed without Enterprise access. Report is based on a circumstantial evidence in the open-source repository. ### Details `src/lib/features/feature-toggle/feature-toggle-service.ts` implements `cloneFeatureToggle`. This operation needs authorization for both sides
  • < 8.0.3
GitHub (opens in a new tab)
GHSA-5vf6-jrqr-78fjModerateUnleash: Addon webhook URL is dialed server-side with no internal-address filtering, enabling SSRF to internal services / cloud metadata and exfiltration of configured request headers## Summary Unleash's addon/integration subsystem lets an operator configure a webhook (and the Slack, Microsoft Teams, Datadog, and New Relic integrations) with a target `url` parameter. Whenever a subscribed feature-flag event fires, the Unleash server itself issues an HTTP request to that configured URL. The URL is taken verbatim from the addon's `parameters.url` and passed straight to the HTTP client (`ky`) with no validation of the host: there is no allow-list, no deny-list, and no blocking of loopback, link-local, RFC1918, or cloud-metadata addresses anywhere in the addon code path. A pr
  • < 7.5.2
  • >= 7.6.0, < 7.6.5
  • >= 8.0.0, < 8.0.2
GitHub (opens in a new tab)
GHSA-r5pq-6chh-j3xpHighUnleash: Unauthenticated single-request DoS via OpenAPI validation error formatter## Summary An unauthenticated `POST` to any OpenAPI-validated endpoint, including the anonymous `POST /edge/validate` and `POST /edge/issue-token`, crashes the entire Unleash server with one request body of deeply-nested JSON. When request-body validation fails, Unleash builds the error message by calling `JSON.stringify` on the raw offending value taken from the request body. A value nested a few thousand levels deep makes `JSON.stringify` recurse past the V8 call-stack limit and throw `RangeError: Maximum call stack size exceeded`. The throw is synchronous inside an Express error-handling
  • < 7.5.2
  • >= 7.6.0, < 7.6.5
  • >= 8.0.0, < 8.0.2
GitHub (opens in a new tab)
GHSA-w4mq-xh27-6xpxModerateUnleash: Global Mustache.escape override disables HTML escaping process-wide, enabling Slack/Teams link-injection via unrestricted username## Vulnerability Details **File**: `src/lib/addons/feature-event-formatter-md.ts` **Line**: 355 (in v8.0.1; `format()` method) ### Root Cause `FeatureEventFormatterMd.format()` does: ```ts Mustache.escape = (text) => text; const text = Mustache.render(action, context); ``` `mustache` (pinned `^4.2.0`, confirmed installed `4.2.0`) keeps `escape` as a **module-level singleton** (`mustache.js`: `mustache.escape = escapeHtml;`), read by every `Mustache.render()` call in the process unless a per-call `config.escape` override is passed (`var escape = this.getConfigEscape(config) || mustache.esc
  • < 8.0.3
GitHub (opens in a new tab)
  • GHSA-5ffh-6f9q-5hhrModerate
    Unleash: A project member can reorder activation strategies belonging to any other project / environment (cross-project integrity write), bypassing project RBAC and the audit log
    • < 8.0.3

    ## Summary Unleash scopes write permissions per project and per environment: a user with the `UPDATE_FEATURE_STRATEGY` permission on project `A` is supposed to be able to mutate activation strategies only within project `A`. The endpoint `POST /api/admin/projects/:projectId/features/:featureName/environments/:environment/strategies/set-sort-order` violates this. The RBAC middleware authorizes the request against the `:projectId` taken from the URL, but the handler then writes the strategy IDs supplied in the request *body* directly to the database by primary key, **without ever verifying that

    CVE: CVE-2026-77425

  • GHSA-72h8-wp98-7hchHigh
    Unleash: Missing await on permission check + cross-project IDOR in admin API
    • < 8.0.3

    ## Summary Multiple authorization vulnerabilities in Unleash admin API, including a critical missing `await` that completely bypasses a permission check. ## Vulnerability 1: Missing `await` on Permission Check (HIGH) **File:** `src/lib/features/segment/segment-controller.ts` (line 345) `POST /api/admin/segments/strategies` has `permission: NONE` at the route level. The handler performs its own check via `this.accessService.hasPermission()`, but **omits the `await` keyword**. Since `hasPermission()` is async (returns `Promise<boolean>`), the variable always receives a truthy Promise object.

    CVE: CVE-2026-77426

  • GHSA-7hvx-28gp-mf6jLow
    Unleash: CR-approval email renders user-controlled raw HTML
    • < 8.0.3

    ### Summary The change-request approval HTML email template renders fields as raw HTML. User who can create a change request can inject HTML into approval notification emails. I was not able to confirm Enterprise platform is using vulnerable code nor that it doesn't sanitize input. ### Details `src/mailtemplates/requested-cr-approval/requested-cr-approval.html.mustache` uses Mustache triple-stash syntax for fields that can originate from users: ```mustache {{{ changeRequestTitle }}} {{{ requesterName }}} {{{ requesterEmail }}} {{{ changeRequestLink }}} ``` Triple-stash disables HTML escapin

    CVE: CVE-2026-76909

  • GHSA-8xcj-9hfr-fh9jModerate
    Unleash: Clone-feature lets a user copy a feature from a project they cannot read
    • < 8.0.3

    ### Summary The clone-feature endpoint supports copying features across projects, but it does not verify that the caller can access the source project. A user with _create_ permissions in one project can clone a feature from another project they cannot read and then inspect the copied configuration. This vulnerability cannot be confirmed without Enterprise access. Report is based on a circumstantial evidence in the open-source repository. ### Details `src/lib/features/feature-toggle/feature-toggle-service.ts` implements `cloneFeatureToggle`. This operation needs authorization for both sides

    CVE: CVE-2026-76910

  • GHSA-5vf6-jrqr-78fjModerate
    Unleash: Addon webhook URL is dialed server-side with no internal-address filtering, enabling SSRF to internal services / cloud metadata and exfiltration of configured request headers
    • < 7.5.2
    • >= 7.6.0, < 7.6.5
    • +1 more
    Affected versions:
    • < 7.5.2
    • >= 7.6.0, < 7.6.5
    • >= 8.0.0, < 8.0.2

    ## Summary Unleash's addon/integration subsystem lets an operator configure a webhook (and the Slack, Microsoft Teams, Datadog, and New Relic integrations) with a target `url` parameter. Whenever a subscribed feature-flag event fires, the Unleash server itself issues an HTTP request to that configured URL. The URL is taken verbatim from the addon's `parameters.url` and passed straight to the HTTP client (`ky`) with no validation of the host: there is no allow-list, no deny-list, and no blocking of loopback, link-local, RFC1918, or cloud-metadata addresses anywhere in the addon code path. A pr

    CVE: CVE-2026-63004

  • GHSA-r5pq-6chh-j3xpHigh
    Unleash: Unauthenticated single-request DoS via OpenAPI validation error formatter
    • < 7.5.2
    • >= 7.6.0, < 7.6.5
    • +1 more
    Affected versions:
    • < 7.5.2
    • >= 7.6.0, < 7.6.5
    • >= 8.0.0, < 8.0.2

    ## Summary An unauthenticated `POST` to any OpenAPI-validated endpoint, including the anonymous `POST /edge/validate` and `POST /edge/issue-token`, crashes the entire Unleash server with one request body of deeply-nested JSON. When request-body validation fails, Unleash builds the error message by calling `JSON.stringify` on the raw offending value taken from the request body. A value nested a few thousand levels deep makes `JSON.stringify` recurse past the V8 call-stack limit and throw `RangeError: Maximum call stack size exceeded`. The throw is synchronous inside an Express error-handling

    CVE: CVE-2026-63462

  • GHSA-w4mq-xh27-6xpxModerate
    Unleash: Global Mustache.escape override disables HTML escaping process-wide, enabling Slack/Teams link-injection via unrestricted username
    • < 8.0.3

    ## Vulnerability Details **File**: `src/lib/addons/feature-event-formatter-md.ts` **Line**: 355 (in v8.0.1; `format()` method) ### Root Cause `FeatureEventFormatterMd.format()` does: ```ts Mustache.escape = (text) => text; const text = Mustache.render(action, context); ``` `mustache` (pinned `^4.2.0`, confirmed installed `4.2.0`) keeps `escape` as a **module-level singleton** (`mustache.js`: `mustache.escape = escapeHtml;`), read by every `Mustache.render()` call in the process unless a per-call `config.escape` override is passed (`var escape = this.getConfigEscape(config) || mustache.esc

    CVE: CVE-2026-63466

Showing 1-7 of 7 vulnerabilities