Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as cashier with nexopos.use.registers
-
ExploitIdentify another cashier's open register ID
-
ExecutionPOST close/cash-in/cash-out to /api/cash-registers/{action}/{register}
-
ImpactForce-close session or alter its balance
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Object-level authorization, IDOR prevention
|
| Exploitation Conditions | Exploitation requires an authenticated NexoPOS account holding the default nexopos.use.registers permission (granted to the built-in store cashier role), and a target register session that was opened by a different cashier and is currently open. The attacker then submits a closing, cash-in, or cash-out action to POST /api/cash-registers/{action}/{register} for a register whose used_by value is not their own user ID. Limiting factors: a valid low-privileged cashier credential is required (not remote-unauthenticated), impact is confined to other users' open register sessions within the same installation, and installations with only a single cashier or without the default register permission granted are not meaningfully exposed. Updating to the patched code (PR #2673), which enforces register ownership, is the vendor-provided fix. |
| Impact | This is a medium-severity authorization flaw (CVSS 4.0 base 5.3, CWE-639) whose real-world risk is moderate and bounded. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:L) is internally consistent with the description: exploitation is over the network, low complexity, requires an authenticated low-privileged account (PR:L), needs no user interaction, and yields only limited integrity and availability impact with no confidentiality loss. No EPSS score is provided in the input, there is no CISA KEV listing, and no public exploit is identified - so the exploitation-probability and active-exploitation signals are either absent or negative. The vulnerable code path and fix are fully documented (vendor issue #2668, patch PR #2673, and the exact CashRegistersService.php lines), which makes the flaw easy to understand and reproduce but does not amount to weaponized exploit code. The vuln.today decision label is 'this_month', not act_now or emergency, aligning with a genuine-but-not-urgent authorization bug rather than a widespread or actively exploited threat. Net: this is a real, patch-worthy insider/multi-tenant integrity issue for NexoPOS operators, not a high-CVSS-but-illusory finding - but its blast radius is limited to users who already hold a valid cashier account, which is why severity stays medium. |
| Exploit ScenarioDerived | A store with multiple cashiers gives each the default nexopos.use.registers permission. A malicious or compromised cashier, authenticated to the POS API, sends a crafted POST to /api/cash-registers/{action}/{register} targeting a register session opened by a different cashier, force-closing that session or injecting cash-in/cash-out entries to distort its balance. No public exploit code is identified, but the advisory and patch document the exact endpoint, making reproduction straightforward for any authenticated cashier. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 28, 2026
NexoPOS through 6.3.0 allows an authenticated cashier holding the default nexopos.use.registers permission to act on register sessions opened by a different cashier, because CashRegistersService never compares the register's used_by value with the requesting user. By posting closing, cash-in, or cash-out actions to /api/cash-registers/{action}/{register}, such a user can force-close another cashier's open session or alter its recorded balance, affecting integrity and availability of register data. The flaw requires a valid low-privileged cashier account and a target session owned by someone else; no public exploit code was identified at time of analysis, and the vendor fix (PR #2673) enforces register ownership.
RemediationAI
Vendor-released patch: upstream pull request #2673 (https://github.com/Blair2004/NexoPOS/pull/2673), which adds ensureRegisterOwner() to CashRegistersService and rejects any close, cash-in or cash-out request whose register used_by does not match the authenticated user; the provided data does not name a tagged release version containing it, so confirm with the project (https://github.com/Blair2004/NexoPOS) that the deployed build includes the commit before considering the installation fixed. Where updating must be deferred, the only effective control in the evidence is to remove the default nexopos.use.registers permission from cashier roles that do not need register operations, accepting that those users then cannot open or close registers at all, or to enforce one cashier per register session and review RegisterHistory records for actions whose author_id differs from the owning session, which detects abuse but does not prevent it. Updating is the complete fix; no other workaround is documented.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
NexoPOS is a Laravel-based point-of-sale application whose cash register lifecycle (open, close, cash-in, cash-out, history) is implemented in app/Services/CashRegistersService.php and exposed through Sanctum-authenticated API routes. The weakness is CWE-639, authorization bypass through a user-controlled key: each Register row carries a used_by column identifying the cashier who owns the session, but the service methods never compare that key against Auth::id(). Authorization therefore stops at the coarse role permission nexopos.use.registers (granted to the built-in store cashier role by default), and any cashier with that permission can supply another cashier's register identifier in the URL and have the action applied. The upstream pull request adds a private ensureRegisterOwner() helper that throws NotAllowedException when the authenticated ID is null, the register owner is null, or the two differ as strings, and invokes it from openRegister, closeRegister, deleteRegisterHistoryUsingOrder and cashOut; the accompanying feature test RegisterSessionAuthorizationTest verifies that non-owners receive 403 for close, cash-in and cash-out, that direct service calls cannot bypass the check, and that ownerless registers cannot be mutated. The trigger path for the individual HTTP actions is described in the vendor issue and PR rather than in the CVE record itself.
Know when Nexopos gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N
Authenticated cashier (PR:L) over the network with no UI can alter other users' register balances (I:L) and force-close sessions (A:L); no data disclosure (C:N) and scope unchanged.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
NexoPOS through 6.3.0 contains a missing authorization vulnerability that allows authenticated cashiers to manipulate other cashiers' register sessions because CashRegistersService never compares used_by with the user. Attackers holding the default nexopos.use.registers permission can submit closing, cash-in, or cash-out actions to POST /api/cash-registers/{action}/{register} to force-close sessions or alter balances.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
EUVD-2026-111541
GHSA-8px7-qjpp-cj5c
NVD
CVE.org
EPSS
Exploit-DB