GHSA-7vfx-4246-jcfh: SolidInvoice IDOR Vulnerability

HIGH
CWE-639 CWE-862
Published
Advisory Summary

GHSA-7vfx-4246-jcfh is a HIGH idor vulnerability (CWE-639: Authorization Bypass Through User-Controlled Key) affecting SolidInvoice libraries in the Packagist ecosystem. The issue involves idor in livecomponent allows same-company cross-user access to api tokens and notification transport settings. Remediation is available by upgrading affected packages to version 2.3.16.

GHSA-7vfx-4246-jcfh at a Glance

CVE Identifier N/A
GHSA Identifier GHSA-7vfx-4246-jcfh
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-639: Authorization Bypass Through User-Controlled Key
Affected Product SolidInvoice
Package Ecosystem Packagist
Published Date
Last Updated

How to Fix GHSA-7vfx-4246-jcfh

To remediate this vulnerability, upgrade all affected SolidInvoice dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

solidinvoice/solidinvoice fixed: 2.3.16
Upgrade solidinvoice/solidinvoice to 2.3.16
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for solidinvoice/solidinvoice

How to Check if You Are Affected

To determine whether your application is affected by GHSA-7vfx-4246-jcfh, inspect your project dependencies for SolidInvoice:

inspect dependencies for solidinvoice/solidinvoice

Analyze the terminal output to locate any version of SolidInvoice in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.3.16), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-639: Authorization Bypass Through User-Controlled Key, where the system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data. In SolidInvoice, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary Four authorization bypass vulnerabilities in Symfony LiveComponent actions allow any authenticated user within a company to access, modify, or delete other users' API tokens and notification transport settings. The root cause is that LiveComponent actions accept entity IDs without verifying ownership, while the listing methods correctly filter by user. ## Findings ### 1. Cross-User API Token Revocation (MEDIUM) **File:** `src/UserBundle/Twig/Components/ApiTokens.php`, lines 50-55 The `revoke()` LiveAction accepts any `ApiToken` via `#[LiveArg]` without checking ownership. The `apiTokens()` method correctly filters by user (`getApiTokensForUser($this->security->getUser())`). ```php #[LiveAction] public function revoke(#[LiveArg] ApiToken $token): void { $this->apiTokenRepository->revoke($token); // No ownership check } ``` ### 2. Cross-User API Token History Disclosure (MEDIUM) **File:** `src/UserBundle/Twig/Components/ApiTokenHistory.php`, lines 30-55 The writable `$token` LiveProp performs `$this->apiTokenRepository->find($this->token)` without user verification. Exposes IP addresses, request methods, paths, and user agents from other users' API token usage. ### 3. Cross-User Notification Transport Settings Disclosure (HIGH) **File:** `src/NotificationBundle/Twig/Components/NotificationIntegrations.php`, lines 48-55 The `integration()` method performs `$this->repository->find($this->setting)` using a writable LiveProp without user check. The `enabledIntegrations()` method correctly filters: `$this->repository->findBy(['user' => $this->getUser()])`. The `TransportSetting` entity stores notification credentials in a JSON `settings` column, potentially exposing API keys for Slack, Discord, Telegram, or SMS services. ### 4. Cross-User Notification Transport Setting Takeover (HIGH) **File:** `src/NotificationBundle/Twig/Components/NotificationTransportConfiguration.php`, lines 39-40, 84-101 The writable `$setting` LiveProp accepts any `TransportSetting` entity. The `save()` action overwrites the user field with the current user via `$setting->setUser($user)`, effectively stealing the transport configuration and its stored credentials. ## Root Cause The application relies on Doctrine's `CompanyFilter` for tenant isolation but has no user-level access controls within a company. LiveComponent actions that resolve entities from client-provided IDs don't verify ownership. ## Suggested Fix Add user ownership verification in each LiveAction/LiveProp before performing operations: ```php if ($token->getUser() !== $this->security->getUser()) { throw $this->createAccessDeniedException(); } ```

GHSA-7vfx-4246-jcfh Affected SolidInvoice Versions

1 component(s)
Fixed Versions:
2.3.16
Product / Package Ecosystem Affected Versions Fixed Version
solidinvoice/solidinvoice
Packagist
< 2.3.16
2.3.16

References

Frequently Asked Questions

What is GHSA-7vfx-4246-jcfh?
GHSA-7vfx-4246-jcfh is a security vulnerability in SolidInvoice involving IDOR in LiveComponent allows same-company cross-user access to API tokens and notification transport settings under CWE-639: Authorization Bypass Through User-Controlled Key.
Which SolidInvoice versions are affected?
Affected versions include releases prior to 2.3.16 across affected packages: solidinvoice/solidinvoice.
What version fixes GHSA-7vfx-4246-jcfh?
Upgrading to 2.3.16 (or the latest patched release for your respective branch) resolves the vulnerability.
Is solidinvoice/solidinvoice affected?
Yes, solidinvoice/solidinvoice is affected in releases prior to 2.3.16. Upgrade your dependency to 2.3.16 or later.
What CWE is associated with GHSA-7vfx-4246-jcfh?
GHSA-7vfx-4246-jcfh is classified under CWE-639: Authorization Bypass Through User-Controlled Key (The system's authorization functionality does not prevent one user from gaining access to another user's data or record by modifying the key value identifying the data.).
How can I check Packagist dependencies for GHSA-7vfx-4246-jcfh?
Run the dependency tree command: 'inspect dependencies for solidinvoice/solidinvoice'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-7vfx-4246-jcfh",
  "modified" : "2026-06-26T22:20:50Z",
  "published" : "2026-06-26T22:20:50Z",
  "aliases" : [ ],
  "summary" : "SolidInvoice: IDOR in LiveComponent allows same-company cross-user access to API tokens and notification transport settings",
  "details" : "## Summary\n\nFour authorization bypass vulnerabilities in Symfony LiveComponent actions allow any authenticated user within a company to access, modify, or delete other users' API tokens and notification transport settings. The root cause is that LiveComponent actions accept entity IDs without verifying ownership, while the listing methods correctly filter by user.\n\n## Findings\n\n### 1. Cross-User API Token Revocation (MEDIUM)\n\n**File:** `src/UserBundle/Twig/Components/ApiTokens.php`, lines 50-55\n\nThe `revoke()` LiveAction accepts any `ApiToken` via `#[LiveArg]` without checking ownership. The `apiTokens()` method correctly filters by user (`getApiTokensForUser($this->security->getUser())`).\n\n```php\n#[LiveAction]\npublic function revoke(#[LiveArg] ApiToken $token): void\n{\n    $this->apiTokenRepository->revoke($token); // No ownership check\n}\n```\n\n### 2. Cross-User API Token History Disclosure (MEDIUM)\n\n**File:** `src/UserBundle/Twig/Components/ApiTokenHistory.php`, lines 30-55\n\nThe writable `$token` LiveProp performs `$this->apiTokenRepository->find($this->token)` without user verification. Exposes IP addresses, request methods, paths, and user agents from other users' API token usage.\n\n### 3. Cross-User Notification Transport Settings Disclosure (HIGH)\n\n**File:** `src/NotificationBundle/Twig/Components/NotificationIntegrations.php`, lines 48-55\n\nThe `integration()` method performs `$this->repository->find($this->setting)` using a writable LiveProp without user check. The `enabledIntegrations()` method correctly filters: `$this->repository->findBy(['user' => $this->getUser()])`.\n\nThe `TransportSetting` entity stores notification credentials in a JSON `settings` column, potentially exposing API keys for Slack, Discord, Telegram, or SMS services.\n\n### 4. Cross-User Notification Transport Setting Takeover (HIGH)\n\n**File:** `src/NotificationBundle/Twig/Components/NotificationTransportConfiguration.php`, lines 39-40, 84-101\n\nThe writable `$setting` LiveProp accepts any `TransportSetting` entity. The `save()` action overwrites the user field with the current user via `$setting->setUser($user)`, effectively stealing the transport configuration and its stored credentials.\n\n## Root Cause\n\nThe application relies on Doctrine's `CompanyFilter` for tenant isolation but has no user-level access controls within a company. LiveComponent actions that resolve entities from client-provided IDs don't verify ownership.\n\n## Suggested Fix\n\nAdd user ownership verification in each LiveAction/LiveProp before performing operations:\n```php\nif ($token->getUser() !== $this->security->getUser()) {\n    throw $this->createAccessDeniedException();\n}\n```",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:P"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "solidinvoice/solidinvoice"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "2.3.16"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 2.3.15"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/SolidInvoice/SolidInvoice/security/advisories/GHSA-7vfx-4246-jcfh"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/SolidInvoice/SolidInvoice"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-639", "CWE-862" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-06-26T22:20:50Z",
    "nvd_published_at" : null
  }
}