Security Digest · Vulnerability record

CVE-2026-47677: FacturaScripts: Account takeover of any 2FA-enabled user

FacturaScripts: Account takeover of any 2FA-enabled user

CVSS 9.3 Critical

Should you act?

Critical and remotely reachable

No known exploitation yet, but it is network-reachable without credentials. This signal is computed from CISA KEV, EPSS and CVSS data; it is not an editorial verdict.

  • No confirmed exploitation. It is not in CISA’s KEV catalog. That can change quickly after a public write-up; re-check if you are affected.
  • Remotely reachable with no login and no user interaction. If the vulnerable service is exposed to the internet, prioritize it.
  • Only applies if your dependency tree includes facturascripts/facturascripts (Composer (PHP)) <= 2026.2, fixed in 2026.3. Check your lockfile, including transitive dependencies.

What it is

From the GitHub advisory

Authentication bypass in FacturaScripts: /login?action=two-factor-validation accepts brute-forceable TOTP without password or CSRF protection

Summary

Core/Controller/Login.php::twoFactorValidationAction() accepts an unauthenticated POST containing only fsNick and fsTwoFactorCode. If the TOTP value matches, the server issues a full fsNick + fsLogkey session cookie pair. The handler:

1. Does not verify the password — the user is not required to have just completed loginAction. 2. Does not call validateFormToken() — no CSRF token is required (every other action handler in the same file does call it). 3. Does not call userHasManyIncidents() before processing — loginAction and changePasswordAction both check this guard before doing work; the 2FA handler only writes to the incident list after a failure, and the incident list is consulted by loginAction / changePasswordAction but not by the 2FA handler itself. The endpoint therefore has no rate-limiting at all.

Combined with TwoFactorManager::VERIFICATIONWINDOW = 8 (google2fa default is 1), 17 distinct six-digit codes are valid simultaneously and each remains valid for ~4 minutes. The expected number of guesses to land a valid code is

Weakness type: CWE-287.

Product: facturascripts/facturascripts (Composer (PHP)) · Published: 2026-07-13

Affected and fixed versions

EcosystemPackageVulnerableFirst fixed
Composer (PHP)facturascripts/facturascripts<= 2026.22026.3

Severity scores

Scored byCVSSScoreVector
GitHub4.09.3 CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N
  • Attack vector: network (remotely reachable)
  • Attack complexity: low
  • Attack requirements: none
  • Privileges required: none (no login)
  • User interaction: none

CVSS measures how bad a flaw is if exploited, not how likely exploitation is. Read it next to the exploitation data below.

Exploitation and urgency

  • CISA KEV: not listed (no confirmed in-the-wild exploitation known to CISA).

Timeline

Sources and references

Original sources first. Version and fix details should always be confirmed against the vendor or project advisory.

Vulnerability records

  1. GitHub Advisory GHSA-c67f-gmxw-mj93 github.com
  2. CVE.org record CVE-2026-47677 cve.org
  3. NVD entry CVE-2026-47677 nvd.nist.gov

Other references from the CVE record and advisory

  1. github.com github.com
  2. github.com github.com

Critical Composer (PHP) advisories · Today’s Security Digest