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-2025-23368

The Infinite Keyring: Brute-Forcing WildFly Elytron (CVE-2025-23368)

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 14, 2026·6 min read·65 visits

Executive Summary (TL;DR)

WildFly Elytron versions prior to 31.0.3 failed to restrict excessive authentication attempts on the management interface (port 9990). This allowed unauthenticated attackers to perform high-velocity brute-force attacks against administrator accounts. The fix introduces a decorator pattern to wrap security realms with rate-limiting logic.

In the world of enterprise Java, WildFly (formerly JBoss) is a titan. But even titans have Achilles' heels. CVE-2025-23368 reveals a glaring oversight in the Elytron security framework: a complete lack of rate limiting on management interfaces. This deep dive explores how a missing wrapper class turned the WildFly management console into a brute-forcer's paradise, allowing attackers to hammer the authentication subsystem indefinitely until the doors swung open.

The Hook: Knock, Knock, Knock... Ad Infinitum

Authentication is the bouncer of your application. Ideally, if someone tries to guess the secret password and fails ten times in a row, the bouncer should throw them out—or at least make them wait in the parking lot for a few minutes. This is Security 101. It's the difference between a secure system and a slot machine that lets you pull the lever until you win.

WildFly, the upstream project for Red Hat JBoss EAP, uses a security framework called Elytron. Elytron is powerful, modular, and flexible. But as it turns out, in certain configurations—specifically when using the Management Interface—Elytron was a bouncer with amnesia. It didn't care if you failed the password check a thousand times per second. It would just politely say "No" and immediately let you try again. No lockout. No delay. No penalty.

For a hacker, this is the golden ticket. Brute-forcing is usually a noisy, slow game of cat and mouse where you try to stay under the radar of WAFs and account lockouts. But with CVE-2025-23368, the radar didn't exist. You could effectively point a firehose of credentials at port 9990 and wait for the "HTTP 200 OK".

The Flaw: A Realm With No Memory

To understand the bug, you have to understand the architecture. Elytron uses Security Realms to handle identity. You might have a PropertiesRealm (users in a file), LdapRealm, or a JdbcRealm. To speed things up, especially for expensive lookups like LDAP, administrators often wrap these in a CachingRealm.

The CachingRealm is great at remembering successes. If admin logs in successfully, Elytron caches that identity so it doesn't have to query the database again for a while. Optimization is good, right?

Here is the cynical twist: The CachingRealm (and the default configuration for the management interface) was optimized for performance, not resilience. It remembered friends, but it had no mechanism to track enemies. When an authentication attempt failed, the system simply returned a failure response and moved on. There was no counter being incremented, no last_failed_timestamp being checked. The state machine for failure was effectively non-existent.

> [!NOTE] > The Architectural Gap > The vulnerability wasn't a buffer overflow or a logic error in password comparison. It was a missing feature treated as a security flaw. The code simply presumed that the underlying realm or an external firewall would handle the rate limiting. That is a dangerous assumption in 2025.

The Code: The Missing Decorator

Let's look at the "Smoking Gun". The fix didn't involve rewriting the authentication logic; it involved wrapping it. The developers realized they needed to implement the Decorator Pattern to intercept authentication calls and apply physics (i.e., time delays) to them.

In the patch (Commit 11e873031c522a0b36afb59880ce4dd59efd0bc0), a new concept was introduced: the BruteForceRealmWrapper. This wrapper sits between the network interface and the actual Security Realm.

Here is a conceptual simplification of what was added:

// The new wrapper logic (simplified)
public RealmIdentity getRealmIdentity(Principal principal) throws RealmUnavailableException {
    // 1. Check if this user is already locked out
    if (isLockedOut(principal)) {
        throw new RealmUnavailableException("Account locked due to too many failures");
    }
 
    // 2. Attempt the actual authentication via the underlying realm
    RealmIdentity identity = delegate.getRealmIdentity(principal);
 
    // 3. If successful, clear previous failures
    if (identity.verifyCredentials(credential)) {
        clearFailures(principal);
        return identity;
    } else {
        // 4. If failed, increment counter and potentially lock
        incrementFailureCount(principal);
        return null;
    }
}

Before this patch, the code essentially jumped straight to step 2. If the verification failed, it just returned null or threw an exception, and the server was ready for the next request 0.001ms later. The patch forces every request through a transformer that says, "Hold on, have you failed 5 times in the last minute? If so, come back later."

The Exploit: Hammering Port 9990

Exploiting this is trivially easy because the target is the Management Interface, typically listening on TCP port 9990. This port speaks HTTP (for the web console) and a native Remoting protocol. Both are susceptible.

An attacker doesn't need complex memory corruption exploits here. They just need a dictionary and a loop. Since there is no lockout, we can use a multi-threaded script to blast credentials.

Attack Scenario

  1. Recon: Scan for open port 9990. Identify the header Server: WildFly.
  2. Weaponization: Create a list of common credentials (admin:admin, admin:password, jboss:jboss).
  3. Execution: Launch the attack using a tool like Hydra or a custom Python script using requests. Since the server doesn't throttle us, we can easily hit 50-100 requests per second depending on network latency.

Because the vulnerability allows parallel attempts (if the server has the threads for it), a distributed botnet could theoretically try millions of passwords an hour against a high-value target.

The Impact: From Guest to God Mode

Why is this CVSS 8.1 and not lower? Because access to the WildFly Management Interface is effectively Remote Code Execution (RCE) as a Service.

Once an attacker guesses the credential:

  1. Deployment: They can deploy a malicious .war file (Web Application Archive) containing a webshell (like the classic JSP shells).
  2. Configuration: They can modify data sources to point to malicious database servers, stealing application data.
  3. System Access: Since WildFly often runs with high privileges (or effectively as the user owning the data), the attacker now owns the data.

This isn't just about reading logs. It's about full compromises of the application server. The lack of rate limiting transforms a "weak password" problem into a "guaranteed entry" problem given enough time.

The Fix: Implementing the Speed Bumps

Red Hat patched this in WildFly Core 31.0.3 and associated JBoss EAP versions. The fix isn't just a hardcoded limit; it's a configurable subsystem.

If you are running an affected version, patch immediately. Once patched, you should actually configure the new brute-force detection, because defaults are great, but tuned security is better.

New Configuration Options:

  • wildfly.elytron.realm.<name>.brute-force.max-failed-attempts: Set this to something reasonable, like 5 or 10.
  • wildfly.elytron.realm.<name>.brute-force.lockout-interval: How long to ban them? 15 minutes (900000 ms) is standard.

Workaround (If you can't patch): If you are stuck on legacy code, you need to move the protection upstream. Put your Management Interface behind a VPN. Never, ever expose port 9990 to the internet. If you must expose it, put it behind a reverse proxy (like Nginx or HAProxy) configured with strict limit_req zones to drop traffic from aggressive IPs.

Official Patches

Red HatRed Hat Official Advisory
WildFlyCommit fixing the issue in WildFly Core

Fix Analysis (1)

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
EPSS Probability
0.04%

Affected Systems

Red Hat WildFly Core < 31.0.3Red Hat JBoss Enterprise Application Platform (EAP) 7.0Red Hat JBoss Enterprise Application Platform (EAP) 8.0Red Hat Data Grid 8.0Red Hat Build of Keycloak

Affected Versions Detail

Product
Affected Versions
Fixed Version
WildFly Core
Red Hat
< 31.0.331.0.3
JBoss EAP
Red Hat
7.0.0See Advisory
JBoss EAP
Red Hat
8.0.0See Advisory
AttributeDetail
CWECWE-307 (Improper Restriction of Excessive Authentication Attempts)
CVSS v3.18.1 (High)
Attack VectorNetwork (Port 9990)
ImpactHigh (Confidentiality, Integrity, Availability)
Exploit StatusFunctional PoC (Trivial)
Fix ComplexityMedium (Requires Patch & Config)

MITRE ATT&CK Mapping

T1110Brute Force
Credential Access
T1110.001Password Guessing
Credential Access
T1078Valid Accounts
Initial Access
CWE-307
Improper Restriction of Excessive Authentication Attempts

The product does not correctly restrict the number of authentication attempts within a given time frame, making it easier for attackers to brute force credentials.

Known Exploits & Detection

GitHubPatch diff indicates logic for brute force detection, implying trivial exploitability via standard hydra/scripting tools.

Vulnerability Timeline

Vulnerability reported to Red Hat by TIM S.p.A Red Team
2025-01-14
Fix committed to WildFly Core repository
2025-02-07
CVE Published
2025-03-04

References & Sources

  • [1]Red Hat CVE Database
  • [2]CWE-307: Improper Restriction of Excessive Authentication Attempts

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

•23 minutes ago•CVE-2026-53722
5.4

CVE-2026-53722: Reflected DOM-based Cross-Site Scripting (XSS) in Nuxt <NuxtLink>

A reflected DOM-based Cross-Site Scripting (XSS) vulnerability was identified in Nuxt's core <NuxtLink> component. Prior to the patched versions, the component failed to validate or sanitize the target URI schemes before directly rendering them into the 'href' attribute of native HTML anchor elements. An attacker who controls the input bound to the 'to' or 'href' properties can inject executable URI schemes, such as 'javascript:' or 'data:', leading to arbitrary script execution in the context of the user's browser session.

Amit Schendel
Amit Schendel
1 views•6 min read
•about 13 hours ago•GHSA-PW6J-QG29-8W7F
5.9

GHSA-pw6j-qg29-8w7f: State Persistence and Sensitive Credential Leakage in Tornado CurlAsyncHTTPClient

A state persistence vulnerability exists in Tornado's CurlAsyncHTTPClient component where pooled pycurl.Curl handles are reused across asynchronous requests without a complete state reset. Consequently, sensitive per-request configurations, such as client TLS certificates or proxy basic authentication credentials, persist on the shared handle. This behavior leads to subsequent requests leaking these credentials to unauthorized remote servers.

Amit Schendel
Amit Schendel
7 views•7 min read
•about 14 hours ago•CVE-2026-48748
7.5

CVE-2026-48748: Netty HTTP/3 QPACK Blocked Streams Memory Exhaustion

CVE-2026-48748 is a denial-of-service vulnerability in Netty's HTTP/3 codec (netty-codec-http3) occurring when QPACK dynamic tables are enabled but the blocked streams limit is not explicitly configured. A bug in limit checking and a memory leak in stream tracking allow unauthenticated remote attackers to exhaust the JVM heap memory and crash the server.

Amit Schendel
Amit Schendel
8 views•6 min read
•about 14 hours ago•CVE-2026-50009
4.8

CVE-2026-50009: Stateless Reset Token Exposure in Netty QUIC

CVE-2026-50009 is a cryptographic design vulnerability in the Netty network application framework. Prior to version 4.2.15.Final, the framework's QUIC protocol implementation fails to cryptographically segregate the generated Connection IDs and the associated Stateless Reset Tokens. An on-path network attacker who sniffs traffic during a Connection ID rotation can extract secret token material from cleartext headers, enabling them to inject spoofed reset packets and terminate active connections.

Alon Barad
Alon Barad
7 views•6 min read
•about 15 hours ago•CVE-2026-50010
7.5

CVE-2026-50010: Hostname Verification Bypass in Netty TLS Client

A critical hostname verification bypass vulnerability exists in the Netty network application framework when configured as a TLS client. When a developer registers a custom plain X509TrustManager, Netty wraps it inside an X509TrustManagerWrapper to adapt it to the X509ExtendedTrustManager API. However, this wrapper discards the SSLEngine context, bypassing critical hostname checks. Because the wrapper is identified as an X509ExtendedTrustManager, standard cryptographic engines and Netty's OpenSSL wrappers do not re-wrap it, failing to execute any hostname validation. Consequently, clients silently accept certificates for any host, enabling unauthenticated Man-in-the-Middle (MitM) attacks.

Amit Schendel
Amit Schendel
10 views•8 min read
•about 15 hours ago•CVE-2026-50011
7.5

CVE-2026-50011: Unbounded Resource Pre-Allocation in Netty Redis Codec

An uncontrolled resource pre-allocation flaw in the Netty Redis codec module allows remote unauthenticated attackers to cause a denial of service (OutOfMemoryError) by sending a crafted Redis Serialization Protocol (RESP) array header.

Amit Schendel
Amit Schendel
5 views•7 min read