actual-app-sync-server

Ecosystem: npm

Downloads: 14.01 K

Vulnerabilities from the last (months)
  • 1CriticalAffects 1 version
  • 3HighAffects 3 versions
  • 0MediumAffects 0 versions
  • 4ModerateAffects 4 versions
  • 0LowAffects 0 versions
Severity distribution (all time)
8vulnerabilities
  • Critical1 (12.5%)
  • High3 (37.5%)
  • Medium0 (0.0%)
  • Moderate4 (50.0%)
  • Low0 (0.0%)

Monthly breakdown

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

Vulnerabilities (8)

Known vulnerabilities affecting actual-app-sync-server, based on data from OSV.

Vulnerabilities affecting actual-app-sync-server
IDSeveritySummaryAffected versionsPublishedSource
GHSA-m62c-5q34-f3cfHighActual Sync Server: CORS Proxy GitHub API Allowlist Prefix Bypass Leaks Private Repositories Through the Server GitHub Token## Summary Actual Sync Server's CORS proxy is intended to let authenticated users fetch resources only from repositories listed in the official plugin allowlist. When `ACTUAL_GITHUB_TOKEN` is configured, the proxy automatically attaches the server's GitHub token to GitHub requests. The GitHub API allowlist check uses a raw `startsWith()` prefix test for `/repos/{owner}/{repo}` without requiring a path boundary after the repository name. If an allowlisted public plugin repository is `https://github.com/acme/plugin`, the proxy also accepts GitHub API URLs such as: ```text https://api.github.c
  • < 26.7.0
GitHub (opens in a new tab)
GHSA-3f62-qv96-4p78Moderate@actual-app/sync-server's missing authorization on GET /secret/:name allows non-admin OpenID users to enumerate admin-configured bank-sync secrets## Summary In `@actual-app/sync-server`, the `GET /secret/:name` endpoint (`app-secrets.js:53`) checks only that the caller has a valid session — it does not verify the caller is an admin. The sibling `POST /secret/` handler does enforce an admin check in OpenID mode, exposing an authorization asymmetry. Any authenticated non-admin (BASIC) user in OpenID multi-user deployments can probe the secrets store and learn which admin-managed bank-sync integrations have been configured (existence, not values). This includes integration credentials that are not otherwise observable to non-admins, such
  • < 26.6.0
GitHub (opens in a new tab)
GHSA-cq9c-6w48-qmfgHigh@actual-app/sync-server: Disabled OpenID users keep access through existing session tokens### Summary In OpenID multi-user mode, disabling a user only blocks future OpenID login for that identity. Existing Actual session tokens for the disabled user remain valid, so the user can continue calling authenticated server endpoints after an administrator has disabled the account. ### Details The disabled-user check is present during OpenID login finalization. Existing users are only accepted when the matching row has `enabled = 1`, and a disabled row causes the OpenID grant to fail before a new session token is created. ```ts // packages/sync-server/src/accounts/openid.ts:284-291 con
  • < 26.6.0
GitHub (opens in a new tab)
GHSA-prp4-2f49-fcgpHighActual has Privilege Escalation via 'change-password' Endpoint on OpenID-Migrated Servers### Summary Any authenticated user (including `BASIC` role) can escalate to `ADMIN` on servers migrated from password authentication to OpenID Connect. Three weaknesses combine: `POST /account/change-password` has no authorization check, allowing any session to overwrite the password hash; the inactive password `auth` row is never removed on migration; and the login endpoint accepts a client-supplied `loginMethod` that bypasses the server's active auth configuration. Together these allow an attacker to set a known password and authenticate as the anonymous admin account created during the mul
  • < 26.4.0
GitHub (opens in a new tab)
GHSA-27vg-33gh-4hwgModerateActual Sync Server has an Authenticated Path Traversal# Description Actual Sync Server allows authenticated users to upload files through `POST /sync/upload-user-file`. In versions prior to 26.3.0, improper validation of the user-controlled `x-actual-file-id` header means that traversal segments (`../`) can escape the intended directory and write files outside `userFiles`. ## Mitigations The vulnerability can be mitigated in prior versions by running the sync server in a filesystem sandbox.
  • < 26.3.0
GitHub (opens in a new tab)
GHSA-qmjj-p7m9-wjrvModerate@actual-app/sync-server: Missing authorization in sync endpoints allows cross-user budget file access in multi-user modeIn multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don't verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user's budget files by providing their file ID. ## Affected Code File: `packages/sync-server/src/app-sync.ts` The `validateSessionMiddleware` on line 31 confirms the user is authenticated, but individual endpoints only check that the file *exists* (via `verifyFileExists`), never that the requesting user *owns* or *has access to* the file. Compare with `POST /sync/delete-use
  • < 26.2.1
GitHub (opens in a new tab)
GHSA-m2cq-xjgm-f668CriticalActualBudget server is Missing Authentication for SimpleFIN and Pluggy AI bank sync endpoints### Summary Missing authentication middleware in the ActualBudget server component allows any unauthenticated user to query the SimpleFIN and Pluggy.ai integration endpoints and read sensitive bank account balance and transaction information. ### Impact This vulnerability allows an unauthenticated attacker to read the bank account balance and transaction history of ActualBudget users. This vulnerability impacts all ActualBudget Server users with the SimpleFIN or Pluggy.ai integrations configured. The ActualBudget Server instance must be reachable over the network. ### Details The ActualBu
  • < 26.2.1
GitHub (opens in a new tab)
GHSA-xvp7-8vm8-xfxxModerateActual Sync-server Gocardless service is logging sensitive data including bearer tokens and account numbers### Summary The GoCardless components in Actualbudget in are logging responses to STDOUT in a parsed format using `console.log`and `console.debug` (Which in this version of node is an alias for `console.log`). This is exposing sensitive information in log files including, but not limited to: - Gocardless bearer tokens. - Account IBAN and Bank Account numbers. - PII of the account holder. - Transaction details (Payee bank information, Recipient account numbers, Transaction IDs)... ### Details Whenever GoCardless responds to a request, the payload is printed to the debug log: https://github.
  • < 25.11.0
GitHub (opens in a new tab)
  • GHSA-m62c-5q34-f3cfHigh
    Actual Sync Server: CORS Proxy GitHub API Allowlist Prefix Bypass Leaks Private Repositories Through the Server GitHub Token
    • < 26.7.0

    ## Summary Actual Sync Server's CORS proxy is intended to let authenticated users fetch resources only from repositories listed in the official plugin allowlist. When `ACTUAL_GITHUB_TOKEN` is configured, the proxy automatically attaches the server's GitHub token to GitHub requests. The GitHub API allowlist check uses a raw `startsWith()` prefix test for `/repos/{owner}/{repo}` without requiring a path boundary after the repository name. If an allowlisted public plugin repository is `https://github.com/acme/plugin`, the proxy also accepts GitHub API URLs such as: ```text https://api.github.c

    CVE: CVE-2026-57449

  • GHSA-3f62-qv96-4p78Moderate
    @actual-app/sync-server's missing authorization on GET /secret/:name allows non-admin OpenID users to enumerate admin-configured bank-sync secrets
    • < 26.6.0

    ## Summary In `@actual-app/sync-server`, the `GET /secret/:name` endpoint (`app-secrets.js:53`) checks only that the caller has a valid session — it does not verify the caller is an admin. The sibling `POST /secret/` handler does enforce an admin check in OpenID mode, exposing an authorization asymmetry. Any authenticated non-admin (BASIC) user in OpenID multi-user deployments can probe the secrets store and learn which admin-managed bank-sync integrations have been configured (existence, not values). This includes integration credentials that are not otherwise observable to non-admins, such

    CVE: CVE-2026-46700

  • GHSA-cq9c-6w48-qmfgHigh
    @actual-app/sync-server: Disabled OpenID users keep access through existing session tokens
    • < 26.6.0

    ### Summary In OpenID multi-user mode, disabling a user only blocks future OpenID login for that identity. Existing Actual session tokens for the disabled user remain valid, so the user can continue calling authenticated server endpoints after an administrator has disabled the account. ### Details The disabled-user check is present during OpenID login finalization. Existing users are only accepted when the matching row has `enabled = 1`, and a disabled row causes the OpenID grant to fail before a new session token is created. ```ts // packages/sync-server/src/accounts/openid.ts:284-291 con

    CVE: CVE-2026-49229

  • GHSA-prp4-2f49-fcgpHigh
    Actual has Privilege Escalation via 'change-password' Endpoint on OpenID-Migrated Servers
    • < 26.4.0

    ### Summary Any authenticated user (including `BASIC` role) can escalate to `ADMIN` on servers migrated from password authentication to OpenID Connect. Three weaknesses combine: `POST /account/change-password` has no authorization check, allowing any session to overwrite the password hash; the inactive password `auth` row is never removed on migration; and the login endpoint accepts a client-supplied `loginMethod` that bypasses the server's active auth configuration. Together these allow an attacker to set a known password and authenticate as the anonymous admin account created during the mul

    CVE: CVE-2026-33318

  • GHSA-27vg-33gh-4hwgModerate
    Actual Sync Server has an Authenticated Path Traversal
    • < 26.3.0

    # Description Actual Sync Server allows authenticated users to upload files through `POST /sync/upload-user-file`. In versions prior to 26.3.0, improper validation of the user-controlled `x-actual-file-id` header means that traversal segments (`../`) can escape the intended directory and write files outside `userFiles`. ## Mitigations The vulnerability can be mitigated in prior versions by running the sync server in a filesystem sandbox.

    CVE: CVE-2026-3089

  • GHSA-qmjj-p7m9-wjrvModerate
    @actual-app/sync-server: Missing authorization in sync endpoints allows cross-user budget file access in multi-user mode
    • < 26.2.1

    In multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don't verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user's budget files by providing their file ID. ## Affected Code File: `packages/sync-server/src/app-sync.ts` The `validateSessionMiddleware` on line 31 confirms the user is authenticated, but individual endpoints only check that the file *exists* (via `verifyFileExists`), never that the requesting user *owns* or *has access to* the file. Compare with `POST /sync/delete-use

    CVE: CVE-2026-27638

  • GHSA-m2cq-xjgm-f668Critical
    ActualBudget server is Missing Authentication for SimpleFIN and Pluggy AI bank sync endpoints
    • < 26.2.1

    ### Summary Missing authentication middleware in the ActualBudget server component allows any unauthenticated user to query the SimpleFIN and Pluggy.ai integration endpoints and read sensitive bank account balance and transaction information. ### Impact This vulnerability allows an unauthenticated attacker to read the bank account balance and transaction history of ActualBudget users. This vulnerability impacts all ActualBudget Server users with the SimpleFIN or Pluggy.ai integrations configured. The ActualBudget Server instance must be reachable over the network. ### Details The ActualBu

    CVE: CVE-2026-27584

  • GHSA-xvp7-8vm8-xfxxModerate
    Actual Sync-server Gocardless service is logging sensitive data including bearer tokens and account numbers
    • < 25.11.0

    ### Summary The GoCardless components in Actualbudget in are logging responses to STDOUT in a parsed format using `console.log`and `console.debug` (Which in this version of node is an alias for `console.log`). This is exposing sensitive information in log files including, but not limited to: - Gocardless bearer tokens. - Account IBAN and Bank Account numbers. - PII of the account holder. - Transaction details (Payee bank information, Recipient account numbers, Transaction IDs)... ### Details Whenever GoCardless responds to a request, the payload is printed to the debug log: https://github.

Showing 1-8 of 8 vulnerabilities