CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-61630

CVE-2026-61630: Time-Based One-Time Password (TOTP) Reuse/Replay in nginx-ignition

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 22, 2026·5 min read·4 visits

Executive Summary (TL;DR)

A replay vulnerability in nginx-ignition allows attackers with primary credentials to reuse a valid, active 2FA TOTP code within its 30-second window to gain full administrative access.

nginx-ignition is a web-based user interface for managing the Nginx web server. In versions 2.33.0 through 2.35.0, the application is vulnerable to an improper authentication flaw (CWE-287) in its Multi-Factor Authentication (MFA) implementation. The stateless validation of Time-Based One-Time Passwords (TOTP) allows an attacker to reuse a captured, active verification code multiple times within the standard 30-second validity window, successfully bypassing secondary authentication checks if primary credentials are known.

Vulnerability Overview

The nginx-ignition application provides an administrative panel to configure reverse proxies, SSL certificates, and access rules for the Nginx web server. Securing this interface is critical because access to this panel translates to broad administrative authority over the underlying system. To secure administrative access, nginx-ignition supports Multi-Factor Authentication (MFA) using Time-Based One-Time Passwords (TOTP).

In versions 2.33.0 through 2.35.0, the verification logic does not enforce single-use restrictions on TOTP codes. If an attacker intercepts or obtains a valid TOTP token along with the victim's primary credentials, they can authenticate successfully using the exact same code, provided the transmission occurs within the 30-second validity window of the token.

This vulnerability is classified under CWE-287 (Improper Authentication). The lack of stateful tracking of verified tokens exposes the administrative console to unauthorized access via credential replay, weakening the security guarantees of the multi-factor authentication mechanism.

Root Cause Analysis

The root cause of this vulnerability lies in the stateless nature of the application's TOTP verification logic. Standard TOTP implementations (as defined in RFC 6238) generate passwords based on a shared secret and the current Unix time step, typically lasting 30 seconds. To prevent replay attacks, the verifying server must maintain a state of previously accepted tokens and reject any token that has already been validated during its current time step.

Prior to version 2.35.1, nginx-ignition validated TOTP codes purely through mathematical verification using the Go library github.com/pquerna/otp. The library checks if the input matches the mathematical state expected for the secret key during the active temporal window.

Because the application failed to record whether a code had already been used, any mathematically correct token remained valid for multiple authentication attempts until the 30-second interval elapsed. If an administrative user successfully authenticated, an attacker who intercepted the transmitted token could immediately replay it to establish their own authenticated session.

Code Analysis

The remediation introduced stateful tracking to record and verify previously used codes. In the user data model located at core/user/model.go, the application now maintains an array of recently processed TOTP tokens:

 type TOTP struct {
-	Secret    *string
-	Validated bool
+	Secret        *string
+	LastUsedCodes []string
+	Validated     bool
 }

In core/user/service.go, the login flow was updated to block subsequent authentications with the same token. The application executes TryUpdateLastUsedTOTPCode via the database repository after mathematical validation passes. If the code has been used before, authentication is rejected:

		if !totp.Validate(code, *totpData.Secret) {
			return AuthenticationFailed, nil, nil
		}
+
+		updated, err := s.repository.TryUpdateLastUsedTOTPCode(ctx, usr.ID, code)
+		if err != nil || !updated {
+			return AuthenticationFailed, nil, err
+		}
+
+		usr.TOTP.LastUsedCodes = append([]string{code}, usr.TOTP.LastUsedCodes...)
+		if len(usr.TOTP.LastUsedCodes) > 3 {
+			usr.TOTP.LastUsedCodes = usr.TOTP.LastUsedCodes[:3]
+		}

To ensure thread safety and avoid race conditions, the validation relies on database-level checks. In database/user/repository.go, an atomic query ensures that duplicate codes are ignored by using explicit database updates:

+func (r *repository) TryUpdateLastUsedTOTPCode(ctx context.Context, id uuid.UUID, code string) (bool, error) {
+	result, err := r.database.Update().
+		Model((*userModel)(nil)).
+		Set("totp_last_used_codes = SUBSTR(? || COALESCE(',' || totp_last_used_codes, ''), 1, 20)", code).
+		Where("id = ? AND (totp_last_used_codes IS NULL OR (',' || totp_last_used_codes || ',') NOT LIKE ?)", id, "%,"+code+",%").
+		Exec(ctx)
...

If the SQL query modifies zero rows due to the conditional checks in the Where statement, the repository returns false, causing the authentication workflow to abort.

Exploitation Methodology

To exploit this vulnerability, an attacker must first possess the victim's primary login credentials (username and password). Once credentials are acquired, the attack requires interception of the user's login sequence, which can occur on unencrypted networks or via administrative logging.

An attacker position on a local area network or a shared proxy allows sniffing of the unencrypted JSON payload directed to /api/users/login. The payload exposes the standard username, password, and active 6-digit TOTP string.

By programmatically executing an HTTP POST request containing the captured credentials and the identical TOTP string within the active 30-second time-step, the server's stateless logic authorizes the second request. The endpoint responds with a unique, valid administrative JSON Web Token (JWT) for the attacker's session, granting immediate access to the administrative dashboard.

Impact Assessment

Successful exploitation of this flaw completely neutralizes the security benefits of Multi-Factor Authentication. The vulnerability yields administrative privileges to the nginx-ignition dashboard, allowing adversaries to modify active Nginx server blocks, alter SSL parameters, write unauthorized redirection rules, and modify administrative user settings.

Although the CVSS v3.1 score is calculated as 4.2 (Medium), the real-world operational threat is elevated. The CVSS metric designates a high complexity (AC:H) because the exploit requires sniffing the network traffic or acquiring the token stream dynamically during user sign-on, alongside needing primary credentials (PR:H).

If an organization hosts nginx-ignition on unencrypted HTTP channels within corporate local networks, the risk increases exponentially. The vulnerability allows rapid escalation of access from basic credential theft to complete network configuration control.

Remediation & Fix Completeness

The recommended remediation is upgrading the nginx-ignition deployment directly to version v2.35.1 or higher. The patch fully mitigates the reuse vector by transitioning token verification from a purely mathematical calculation to a stateful database constraint.

The implemented fix is complete for standard operational deployments. By tracking the three most recently validated codes, the database check safely covers the default 30-second time window as well as common clock drift adjustments. Because the database operation is atomic, race conditions are blocked, preventing multiple login endpoints from parallel processing the same token.

Fix Analysis (2)

Technical Appendix

CVSS Score
4.2/ 10
CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:U/C:H/I:N/A:N

Affected Systems

nginx-ignition installations running versions v2.33.0 through v2.35.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
nginx-ignition
lucasdillmann
>= v2.33.0, <= v2.35.0v2.35.1
AttributeDetail
CWE IDCWE-287 (Improper Authentication)
Attack VectorNetwork
CVSS v3.1 Score4.2 (Medium)
Exploit StatusProof-of-Concept / Methodology Validated
CISA KEV StatusNot Listed
Attack ComplexityHigh
Privileges RequiredHigh

MITRE ATT&CK Mapping

T1078Valid Accounts
Initial Access
T1190Exploit Public-Facing Application
Initial Access
CWE-287
Improper Authentication

The application performs authentication check on users, but does not sufficiently protect against authentication bypass methods such as replay attacks in multi-factor authentication systems.

References & Sources

  • [1]GHSA-hf33-q6cf-c66f: TOTP 2FA Replay vulnerability in nginx-ignition
  • [2]Fix Commit: MFA Logic & Database Migrations
  • [3]Fix Commit: Test Refactoring
  • [4]Pull Request #104 - MFA Replay Security Fix
  • [5]CVE.org Official Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•11 minutes ago•GHSA-JHJP-4C2Q-XMX4
8.1

GHSA-JHJP-4C2Q-XMX4: Falco k8saudit Plugin Ruleset Bypass via initContainers and ephemeralContainers

A security feature bypass vulnerability in the Falco k8saudit plugin (and its cloud-specific variants) allowed privileged workloads to run undetected. This bypass occurred because the plugin's default extraction logic and rules only evaluated standard containers, completely omitting initContainers and ephemeralContainers.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 2 hours ago•CVE-2026-61629
7.5

CVE-2026-61629: CPU Amplification Denial of Service via ParseAcceptLanguage Underscore Bypass

A vulnerability exists in the i18n middleware of nginx-ignition, enabling CPU amplification attacks. By transmitting a crafted Accept-Language header containing malformed tags separated by underscores, an unauthenticated remote attacker can bypass the length-guard threshold of the underlying Go parsing library. Normalization of underscores to hyphens occurs after the initial validation checks, forcing the parser into expensive quadratic-time loops that consume 100% of available CPU resources. This leads to a complete denial of service for the administrative API and potentially degrades the availability of the hosting system. This vulnerability has been resolved in version 2.40.1.

Alon Barad
Alon Barad
4 views•7 min read
•about 3 hours ago•CVE-2026-61628
8.1

CVE-2026-61628: Unauthenticated Admin Account Creation via Onboarding Race Condition in Nginx Ignition

Nginx Ignition prior to version 2.41.1 contains a Time-of-Check to Time-of-Use (TOCTOU) race condition in its unauthenticated onboarding API endpoint. This flaw allows remote, unauthenticated attackers to register an administrative account by sending concurrent HTTP requests during the initial system configuration phase, bypassing the check meant to restrict onboarding to a single initial administrator.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 9 hours ago•CVE-2026-61687
7.1

CVE-2026-61687: OAuth State Validation Bypass and Login CSRF in Hatchet

A logic error in Hatchet's OAuth state validation mechanism allows unauthenticated remote attackers to bypass state parameter verification. By submitting an empty state parameter, attackers can exploit an equality collision with cleared session keys, facilitating Login Cross-Site Request Forgery (Login CSRF) or Session Fixation.

Amit Schendel
Amit Schendel
9 views•10 min read
•2 days ago•CVE-2026-58197
8.8

CVE-2026-58197: Host Escape and Lateral Movement via Insecure Container Network Defaults in ToolHive

A high-severity access control vulnerability in ToolHive CLI before v0.30.1 and ToolHive Studio before v0.38.0 allows local containerized MCP servers to bypass network isolation. This enables malicious workloads to establish TCP/IP connections to administrative and control plane endpoints exposed on the host loopback interface.

Amit Schendel
Amit Schendel
12 views•8 min read
•2 days ago•CVE-2026-63405
5.9

CVE-2026-63405: Insufficient Verification of Data Authenticity in AnyCable Pusher REST API

AnyCable is a real-time communication server. Prior to version 1.6.15, its Pusher-compatible REST API suffered from an authentication bypass vulnerability because it failed to verify that the request body matched the signature-validated body_md5 parameter. This allows attackers to perform replay attacks with modified body contents.

Amit Schendel
Amit Schendel
11 views•5 min read