CVE-2026-57449: Actual Sync Server CORS proxy GitHub allowlist bypass

CVE-2026-57449 · Severity: high · CVSS 4 · Published 2026-09-25

Actual Sync Server's CORS proxy feature, when enabled and configured with a GitHub token, allows authenticated users to access private GitHub repositories that the server can reach. An attacker with a valid user session can exploit a prefix-matching bug in the GitHub API allowlist to request private resources from repositories whose names start with an allowlisted repository name (e.g., requesting "acme/plugin-private" when "acme/plugin" is allowlisted). This could expose sensitive data like credentials stored in private repositories.

Technologies: Actual Budget Sync Server, @actual-app/sync-server (npm). Vendors: Actual Budget, npm.

Quick answers

Is CVE-2026-57449 exploited in the wild?
No. Junglewise Threat Intelligence has no report of CVE-2026-57449 being exploited in the wild.
How severe is CVE-2026-57449?
High severity, with a CVSS score of 4, published 25 September 2026.
Which products and versions are affected?
Actual Budget Sync Server prior to 26.7.0; @actual-app/sync-server (npm) <= 26.6.0, SEMVER:introduced=0,fixed=26.7.0.
Is there a fix for CVE-2026-57449?
Yes. @actual-app/sync-server (npm): upgrade to 26.7.0 or later. Junglewise finds every place you run it, drafts the upgrade and applies it once you approve.
How is CVE-2026-57449 attacked?
It is attacked over the network, in a software library.
Am I affected by CVE-2026-57449?
Check whether you run Actual Budget Sync Server or @actual-app/sync-server (npm) at an affected version. Junglewise does that check for you around the clock: connect your code, cloud and domains, and it matches new vulnerabilities like this one against what you actually run and tells you when one reaches you.

How to fix

  • @actual-app/sync-server (npm): upgrade to 26.7.0 or later
    npm install @actual-app/sync-server@26.7.0

Technical details

The vulnerability is an authorization bypass in the CORS proxy's GitHub API allowlist check. The code uses a raw startsWith() comparison on the GitHub API path without requiring a path boundary delimiter after the repository name, allowing `/repos/acme/plugin-private` to match the allowlist entry for `/repos/acme/plugin`. The proxy then forwards authenticated requests with the server's GitHub token to any such matching API endpoint. Exploitation requires: CORS proxy enabled, server configured with a GitHub token, an allowlisted public repository, and any authenticated Actual user session.

Affected products

  • Actual Budget Sync Server prior to 26.7.0

Identifiers

  • CVE-2026-57449
  • GHSA-m62c-5q34-f3cf

Timeline

  • 2026-09-23: disclosed: GitHub Security Advisory published
  • 2026-09-25: patched: Fix released in version 26.7.0

References

This page as Markdown. Free to reuse under CC BY 4.0 with a link back.