Skip to main content

ezBookkeeping EUVDEUVD-2026-83734

| CVE-2026-94112 HIGH
Authentication Bypass by Capture-replay (CWE-294)
2026-09-20 disclosure@vulncheck.com GHSA-j95g-6g2h-3f33
7.6
CVSS 4.0 · Vendor: vulncheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Steal victim credentials via phishing
  2. Delivery
    Capture a valid live TOTP passcode
  3. Exploit
    Replay same code to 2FA authorize endpoint
  4. Execution
    Reuse within ~90s acceptance window
  5. Impact
    Complete 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

ezBookkeeping 0 <2.0.0

Affected Packages

euvd ezbookkeeping fix: 2.0.0

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

Vendor (vulncheck) PRIMARY 7.6 HIGH
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
vuln.today AI 6.8 MEDIUM

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.

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

Primary rating from Vendor (vulncheck).

CVSS VectorVendor: vulncheck

Attack Vector
Network
Attack Complexity
High
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 20, 2026 - 13:15 EUVD
CVE Published
Sep 20, 2026 - 12:17 cve.org
HIGH 7.6

DescriptionCVE.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

Why It Matters

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.

Business Impact: Medium
Compensating Controls

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

EPSS Score
0.2%
Top 86% exploitable
Prevalence
Low
niche open-source self-hosted personal-finance/bookkeeping app
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Medium
Technical Impact
Partial

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Go

View all
CVE-2023-44487 HIGH POC
7.5 Oct 10

Denial of service against HTTP/2 server implementations allows remote unauthenticated attackers to exhaust server resour

CVE-2016-5386 HIGH
8.1 Jul 19

The net/http package in Go through 1.6 does not attempt to address RFC 3875 section 4.1.18 namespace conflicts and there

CVE-2025-68121 CRITICAL POC
10.0 Feb 05

Critical certificate validation bypass in Go crypto/tls during session resumption. If ClientCAs or RootCAs fields are mu

CVE-2019-14809 CRITICAL POC
9.8 Aug 13

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

CVE-2026-90942 CRITICAL POC
9.3 Sep 14

Casdoor through 4.4.0 exposes its instance-wide built-in JWT signing private key unmasked through the /api/get-certs and

CVE-2026-101090 CRITICAL POC
9.3 Sep 27

Host header injection in Nezha 2.2.3's OAuth2 redirect endpoint (/api/v1/oauth2/{provider}) allows an unauthenticated re

CVE-2026-78428 HIGH POC
8.8 Sep 17

Session cross-wiring in SUSE NeuVector before 5.6.1 allows an unauthenticated remote attacker to obtain another user's a

CVE-2026-92791 HIGH POC
8.7 Sep 16

Unauthenticated path traversal in Uber Kraken through 0.1.29 allows remote attackers to read files outside the configure

CVE-2018-7187 HIGH POC
8.8 Feb 16

The "go get" implementation in Go 1.9.4, when the -insecure command-line option is used, does not validate the import pa

CVE-2026-16651 HIGH POC
8.7 Sep 21

Denial of service in Temporal Server allows an authenticated caller holding at least namespace read permission to crash

CVE-2026-82405 HIGH POC
8.7 Sep 23

Account takeover in Klever-Go's KleverUpdateAccountPermission built-in (all versions prior to 1.7.20) allows an attacker

CVE-2026-82409 HIGH POC
8.4 Sep 23

Maliciously crafted on-chain account names processed by Klever-Go prior to 1.7.20 are spliced into Elasticsearch _bulk r

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