Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessSteal victim credentials via phishing
-
DeliveryCapture a valid live TOTP passcode
-
ExploitReplay same code to 2FA authorize endpoint
-
ExecutionReuse within ~90s acceptance window
-
ImpactComplete login and hijack bookkeeping account
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Replay attack prevention
|
| Exploitation Conditions | Exploitation requires the attacker to already hold the victim's valid primary credentials AND to capture a live, unexpired TOTP passcode, then replay it against the 2FA authorization endpoint (TwoFactorAuthorizeHandler or the OAuth2 callback handler) within the roughly 90-second acceptance window before the code lapses. It applies only to accounts with TOTP two-factor authentication enabled on ezBookkeeping versions before 2.0.0. Limiting factors: this is not remote-unauthenticated in practice - it needs credential theft plus real-time passcode interception (phishing proxy, MITM, or observation), which is why the vendor assigned AC:H, AT:P, and UI:P; there is no exploit that works against a default install without these captured secrets. |
| Impact | This is a genuine but conditional weakness, not a top-tier priority. The vendor CVSS 4.0 vector (7.6) encodes the practical friction well: AC:H, AT:P (present attack requirement), and UI:P all signal that exploitation is not turnkey. Per CWE-294 (Authentication Bypass by Capture-replay), the attacker must ALREADY possess the victim's valid credentials AND capture a live TOTP passcode, then replay it within the ~90-second acceptance window before it expires naturally. This is fundamentally a defense-in-depth degradation of the second factor rather than a standalone auth break - the 2FA still requires a code that must be observed in real time. No EPSS score is provided, there is no CISA KEV listing, and no public exploit code was identified (only the fix commit and advisory). SSVC-style read: exploitation status is 'none observed', technical impact is total (account takeover of financial/bookkeeping data → VC:H/VI:H), but 'automatable' is effectively No given the credential + live-passcode capture prerequisite. The one signal worth flagging: the input tag 'Information Disclosure' conflicts with the actual weakness (capture-replay/authentication), so tag-driven triage would mis-route this. Net: real, patch it, but lower urgency than a PR:N/AC:L network flaw of the same score. |
| Exploit ScenarioDerived | An attacker who has already phished or otherwise stolen a user's ezBookkeeping username and password intercepts a valid TOTP passcode (e.g., via a phishing proxy or shoulder-surfing) and, because the server never marks used codes as consumed, replays that same passcode across multiple authorization attempts within the ~90-second window to complete login and take over the account. No public exploit code was identified; the attack requires live capture of both the credentials and an unexpired passcode, matching the vendor's AC:H/AT:P/UI:P rating. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 20, 2026
Replayed TOTP passcodes stay valid in mayswind ezBookkeeping before 2.0.0, so an attacker who already holds a victim's valid primary credentials and has captured a live TOTP code can resubmit that same code against the two-factor authorization or OAuth2 callback endpoint instead of being rejected after its first use. The window of abuse is bounded by the server's TOTP acceptance period (roughly 90 seconds, reflecting adjacent 30-second time steps), and only accounts with TOTP-based two-factor authentication enabled on pre-2.0.0 releases are exposed; interception must happen in real time via a phishing proxy, MITM position, or direct observation. The assessed vector is CVSS:3.1/AV:N/AC:H/PR:N/UI:R (7.6), and although PR:N indicates no privileges are required on the vulnerable component, practical exploitation presupposes stolen credentials plus a captured code, so this is a conditional weakness rather than a default-install compromise - no public exploit identified at time of analysis, and the vendor fixed it in 2.0.0.
RemediationAI
The primary fix is to upgrade ezBookkeeping to 2.0.0 or later, which introduces the used-passcode tracking described in the vendor advisory (https://github.com/mayswind/ezbookkeeping/security/advisories/GHSA-p6qr-48g6-97q3) and the release notes at https://github.com/mayswind/ezbookkeeping/releases/tag/v2.0.0 - the code change is visible in commit 3dd6286d7a3ab0f980a6d36339b9c9c4df9467e4, so administrators who build from source can verify the patch is present in pkg/api/authorizations.go. If upgrading cannot happen immediately, treat the following as partial compensating controls rather than a substitute: replace or supplement TOTP with a phishing-resistant second factor (WebAuthn/FIDO2 or hardware token) where the deployment supports it, since a code-replay attack has no analogue against a challenge-response factor, at the cost of requiring user re-enrollment; reduce the server's TOTP acceptance skew to a single 30-second step if the configuration exposes that setting, which shrinks the replay window but increases login failures for users with clock drift; apply strict rate limiting and lockout on the 2FA and OAuth2 callback endpoints to blunt repeated replay attempts, accepting that it can be abused for denial of service against a legitimate user; and monitor authentication logs for the same user completing 2FA twice within the acceptance window, which the patched code logs via log.Warnf on reuse but unpatched builds will not surface on their own. Because abuse requires stolen primary credentials, any instance believed targeted should also force password resets, invalidate active sessions and refresh tokens, and review mail or reverse-proxy infrastructure for a phishing/relay component that could be capturing passcodes in transit. Note that the upstream marker record is written with a 30-second TTL, so even after patching, deployments with unusual TOTP window configuration should confirm that a replayed code is actually rejected in their environment.
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
ezBookkeeping is a Go-based, self-hosted personal finance application; its two-factor flow is implemented in pkg/api/authorizations.go around the TwoFactorAuthorizeHandler and the OAuth2CallbackAuthorizeHandler. The weakness is CWE-294 (Authentication Bypass by Capture-replay): the application validates a submitted TOTP passcode against the user's shared secret but never records that a given passcode has already been consumed, so per RFC 6238 (TOTP, built on RFC 4226 HOTP) a code remains acceptable for the whole acceptance window - typically the current 30-second step plus the neighboring step, which the advisory sizes at approximately 90 seconds. Any party who observes the code in that interval (an adversary-in-the-middle or reverse-proxy phishing kit, a compromised TLS-terminating hop, or physical observation) can replay it to complete a second authorization. The upstream fix commit 3dd6286d7a3ab0f980a6d36339b9c9c4df9467e4 adds two helpers, is2FAPasscodeUsed and update2FAPasscodeUsed, plus a new DUPLICATE_CHECKER_TYPE_2FA_PASSCODE (value 10) in pkg/duplicatechecker/duplicate_checker_type.go, and a keyed hash function MD5EncodeToStringWithUidAndSalt in pkg/utils/strings.go that binds the passcode digest to the user ID and the server SecretKey so the replay-tracking key cannot be forged across users. Both the standard 2FA handler and the OAuth2 callback path consult and then populate this used-passcode marker. One implementation detail worth noting from the diff: the marker is written with a 30-second expiration (SetSubmissionRemarkWithCustomExpiration, 30*time.Second), which is shorter than the roughly 90-second acceptance window described in the advisory, so the practical replay coverage of the fix depends on the timing of the replay attempt relative to first use and on the duplicate-checker backend's expiry semantics.
Know when Go 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:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N
AC:H and UI:R because the attacker must capture a live passcode and rely on the victim leaking credentials/code within a narrow window; PR:N since no legitimate app privilege is used; C:H/I:H account takeover, A:N.
Primary rating from Vendor (vulncheck).
CVSS VectorVendor: vulncheck
Lifecycle Timeline
2DescriptionCVE.org
mayswind ezBookkeeping before 2.0.0 fails to invalidate TOTP passcodes after use, allowing attackers to replay captured codes within the acceptance window. Attackers with stolen credentials can authenticate and reuse a captured passcode against multiple authorization attempts for approximately 90 seconds without detection.
Technical POC Analysis
Evidence basis: advisory GHSA-p6qr-48g6-97q3 only.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
mayswind ezBookkeeping releases prior to 2.0.0 allow a captured one-time passcode to be replayed, meaning the second factor protecting TOTP-enabled accounts can be defeated by anyone who already holds a user's password and can observe a live login in real time. Only accounts with TOTP-based two-factor authentication enabled on those older releases are exposed, and exploitation requires both stolen primary credentials and real-time interception, so this is a conditional weakness rather than a default-install compromise. Leadership should care because the control relied upon to protect financial records from credential theft is unreliable on affected deployments, and no vendor-released patch has been identified at time of analysis.
No vendor-released patch identified at time of analysis; the vulnerability is a conditional weakness and no public exploit identified at time of analysis, though the CVSS vector indicates no privileges required on the vulnerable component (PR:N). Interim mitigations: enforce server-side single-use/replay rejection of TOTP codes at the two-factor authorization and OAuth2 callback endpoints via application configuration or a fronting reverse proxy; shorten the TOTP acceptance window; restrict affected pre-2.0.0 instances to VPN or trusted networks; replace TOTP with phishing-resistant MFA (FIDO2/WebAuthn) or SSO for exposed accounts; rotate passwords and re-enroll TOTP secrets for accounts with suspected exposure; monitor and alert on duplicate passcode submissions and anomalous callback requests; validate and upgrade to ezBookkeeping 2.0.0 or later, the version boundary stated in the advisory, once a vendor-released fix is confirmed.
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour
The net/http package in Go through 1.6 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and there
Critical certificate validation bypass in Go crypto/tls during session resumption. If ClientCAs or RootCAs fields are mu
net/url in Go before 1.11.13 and 1.12.x before 1.12.8 mishandles malformed hosts in URLs, leading to an authorization by
Casdoor through 4.4.0 exposes its instance-wide built-in JWT signing private key unmasked through the /api/get-certs and
Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re
Session cross-wiring in SUSE NeuVector before 5.6.1 allows an unauthenticated remote attacker to obtain another user's a
Unauthenticated path traversal in Uber Kraken through 0.1.29 allows remote attackers to read files outside the configure
The "go get" implementation in Go 1.9.4, when the -insecure command-line option is used, does not validate the import pa
Denial of service in Temporal Server allows an authenticated caller holding at least namespace read permission to crash
Account takeover in Klever-Go's KleverUpdateAccountPermission built-in (all versions prior to 1.7.20) allows an attacker
Maliciously crafted on-chain account names processed by Klever-Go prior to 1.7.20 are spliced into Elasticsearch _bulk r
EUVD-2026-83734
GHSA-j95g-6g2h-3f33
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB