GHSA-7vfx-4246-jcfh: SolidInvoice IDOR Vulnerability
HIGHGHSA-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
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.
Upgrade solidinvoice/solidinvoice to 2.3.16
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
GHSA-7vfx-4246-jcfh Affected SolidInvoice Versions
1 component(s)| 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?
Which SolidInvoice versions are affected?
What version fixes GHSA-7vfx-4246-jcfh?
Is solidinvoice/solidinvoice affected?
What CWE is associated with GHSA-7vfx-4246-jcfh?
How can I check Packagist dependencies for GHSA-7vfx-4246-jcfh?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"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
}
}