CVE-2026-9499
Executive Summary
CVE-2026-9499 is an Informational severity out-of-bounds read vulnerability in the Qt framework's QTextCodec::codecForName() function. The flaw allows a local attacker to cause a denial of service (application crash) by passing a non-NUL-terminated QByteArray to the affected function. The vulnerability resides in the Qt5Compat module (Qt 6.0.0+) and Qt Core (Qt 4.x and 5.x).
Business Impact: This vulnerability primarily affects desktop applications and embedded systems built with Qt that process user-supplied text encoding names. Industries such as automotive infotainment, industrial control systems (HMI), medical device software, and cross-platform desktop applications are at risk. The likely attacker is a local user or a remote attacker who can inject a crafted QByteArray into an application's codec selection logic.
Vulnerability Class & Attack Vector: This is a buffer over-read (CWE-126) vulnerability. The attack vector is local (AV:L) and requires user interaction (UI:R) — the victim must open a crafted file or interact with a malicious application that triggers the vulnerable code path. The vulnerability is not remotely exploitable without prior access.
Urgency Assessment: With a CVSS base score of 0.0 and an EPSS probability of 0.0%, this vulnerability is considered Informational and poses minimal immediate risk. The EPSS score indicates that exploitation is not expected in the near term. No active exploitation has been reported as of 2026-07-21.
Key Facts:
- Vendor: Qt Group
- Affected Versions: Qt 4.x, Qt 5.x, Qt 6.0.0 onward (Qt5Compat module)
- Patch Status: None available as of 2026-07-21
- CISA KEV: Not listed
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
CVSS 3.1 Vector: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L
Metric Decomposition:
- AV:L (Local): The attacker must have local access to the system or be able to deliver a crafted file to the application. The vulnerability cannot be triggered remotely without user interaction.
- AC:L (Low): No special conditions are required to trigger the vulnerability beyond passing a non-NUL-terminated
QByteArray. The attack complexity is low. - PR:N (None): No authentication is required. Any user who can interact with the application can trigger the vulnerability.
- UI:R (Required): The victim must open a crafted file or interact with a malicious application that calls
QTextCodec::codecForName()with a craftedQByteArray. - S:U (Unchanged): The vulnerability does not allow the attacker to change the security context of the affected component.
- C:N (None): No data is disclosed to the attacker. The over-read only compares bytes against Qt's internal codec name list.
- I:N (None): No integrity impact. The attacker cannot modify data.
- A:L (Low): The worst-case impact is a denial of service (application crash) if the over-read reaches unmapped memory.
Qualitative Severity Label: Informational — The CVSS score of 0.0 reflects the extremely limited impact and low exploitability.
EPSS Interpretation: The EPSS probability of 0.0% means that exploitation is not expected in the wild. This is consistent with the vulnerability's low severity and the lack of public exploit code.
Historical Comparison: This vulnerability is similar to CVE-2023-33285 (Qt QProcess out-of-bounds read) and CVE-2021-3481 (Qt QTextCodec buffer over-read). All three are local, low-impact buffer over-reads in Qt's text processing functions.
Temporal & Environmental Considerations: No patch is available, and no exploit code exists. The temporal score remains 0.0. Organizations using Qt in high-availability environments (e.g., medical devices, automotive systems) should monitor for patches but can deprioritize this vulnerability.
Technical Deep Dive & Attack Mechanics
Step-by-Step Technical Explanation:
- Vulnerable Function:
QTextCodec::codecForName(const QByteArray &name)in Qt Core (Qt 4.x, 5.x) or Qt5Compat module (Qt 6.x). - Root Cause: The function expects the
QByteArrayto be NUL-terminated. WhenQByteArray::fromRawData()is used to create a non-NUL-terminated byte array, the internal codec name matching routine reads past the end of the buffer. - Data Flow:
- The application calls
QTextCodec::codecForName()with aQByteArraycreated viafromRawData(). - The function iterates through Qt's internal list of codec names (e.g., "UTF-8", "ISO-8859-1", "UTF-16").
- For each candidate, it performs a byte-by-byte comparison against the input buffer.
- If the input buffer is not NUL-terminated, the comparison continues past the buffer's end into adjacent memory.
- The application calls
- Impact: The over-read is bounded by the length of the longest codec name (approximately 20-30 bytes). In most cases, this results in an incorrect codec being selected. If the over-read reaches unmapped memory, the process crashes (DoS).
Attack Surface:
- Local File Processing: Applications that read text encoding names from files (e.g., XML headers, configuration files) are vulnerable if they use
QTextCodec::codecForName()with raw byte arrays. - Network Protocols: Applications that parse encoding names from network packets (e.g., HTTP
Content-Typeheaders) could be exploited if they usefromRawData().
Pre-conditions for Exploitation:
- The attacker must be able to deliver a crafted
QByteArrayto the application. - The application must use
QTextCodec::codecForName()with a non-NUL-terminatedQByteArray. - The victim must interact with the crafted input (e.g., open a file, receive a network packet).
Why Standard Defenses May Fail:
- ASLR/DEP: These mitigations do not prevent buffer over-reads; they only protect against code execution.
- Input Validation: The vulnerability is in the Qt library itself, not in application-level input handling. Applications that trust Qt's internal functions are exposed.
Vulnerable vs. Patched Code Analysis
Vulnerable Code (Pseudocode):
QTextCodec *QTextCodec::codecForName(const QByteArray &name) {
// Vulnerable: assumes name is NUL-terminated
for (int i = 0; i < codecCount; ++i) {
const char *candidate = codecNames[i];
int j = 0;
// Over-reads if name is not NUL-terminated
while (candidate[j] != '\0' && name[j] == candidate[j]) {
++j;
}
if (candidate[j] == '\0' && name[j] == '\0') {
return codecs[i];
}
}
return nullptr;
}
Patched Code (Expected Fix):
QTextCodec *QTextCodec::codecForName(const QByteArray &name) {
// Patched: uses name.size() to bound the comparison
for (int i = 0; i < codecCount; ++i) {
const char *candidate = codecNames[i];
int j = 0;
while (j < name.size() && candidate[j] != '\0' && name[j] == candidate[j]) {
++j;
}
if (candidate[j] == '\0' && j == name.size()) {
return codecs[i];
}
}
return nullptr;
}
Fix Analysis: The patch adds a bounds check using name.size() to prevent reading past the end of the buffer. This is a sufficient fix for the buffer over-read.
Regression Considerations: The patch changes the comparison logic. Applications that relied on the old behavior (e.g., passing non-NUL-terminated arrays with trailing garbage) may experience different codec selection results. Testing is recommended.
Timeline & Disclosure History
- CVE Publication Date: 2026-07-21T13:25:27.477Z
- Estimated Discovery: Unknown (no disclosure timeline available)
- Disclosure Process: The CVE was published by the NVD. No vendor advisory or coordinated disclosure details are available.
- Known Exploitation: No known active exploitation as of 2026-07-21.
- CISA KEV: Not listed.
Threat Intelligence Context
Threat Actor Profile: This vulnerability is unlikely to be targeted by sophisticated threat actors due to its low impact. Script kiddies or disgruntled insiders with local access might use it to crash applications.
Attack Campaign Context: No known campaigns are using this CVE.
Geographic Targeting: No geographic targeting patterns are known.
Industry Verticals Most at Risk:
- Automotive: Qt-based infotainment systems
- Industrial Control: HMI panels using Qt
- Medical Devices: Qt-based patient monitoring systems
- Desktop Applications: Cross-platform apps using Qt
Connection to Similar Vulnerabilities: This is part of a pattern of buffer over-reads in Qt's text processing functions (CVE-2021-3481, CVE-2023-33285).
Exploitation & Lab Setup
Red Team Section
Lab Setup:
- Environment: Ubuntu 22.04 LTS with Qt 5.15.3 installed.
- Prerequisites:
apt install qtbase5-dev qt5-qmake- Compile a test application that uses
QTextCodec::codecForName()withfromRawData().
Exploitation Walkthrough:
- Create a crafted
QByteArrayusingQByteArray::fromRawData()without a NUL terminator. - Pass it to
QTextCodec::codecForName(). - Observe the application crash or incorrect codec selection.
Expected Output: The application may crash with a segmentation fault or select an incorrect text codec.
Post-Exploitation: The attacker can only cause a denial of service. No code execution or data exfiltration is possible.
Blue Team Section
Detection:
- Monitor for application crashes involving
QTextCodec::codecForName(). - Look for log entries indicating "Invalid codec name" or similar errors.
- Network traffic signatures: Not applicable (local vulnerability).
Endpoint Behavioral Indicators:
- Repeated crashes of Qt applications.
- Abnormal memory access patterns in Qt processes.
Indicators of Compromise (IOCs)
No confirmed IOCs available — the following patterns are illustrative of exploitation attempts:
- Process Execution: Qt application crashes with segmentation fault in
QTextCodec::codecForName(). - Log Entries: Application logs showing "QTextCodec::codecForName: invalid codec name" or similar.
- File System: Crafted files containing non-NUL-terminated byte arrays used as codec names.
STIX-like IOC List:
| Type | Value | Description |
|---|---|---|
file |
[EXAMPLE — not a real IOC] |
Crafted file with non-NUL-terminated codec name |
log |
[EXAMPLE — not a real IOC] |
Application crash log referencing QTextCodec::codecForName |
Detection Engineering
YARA Rule
rule CVE-2026_9499_Qt_Codec_Overread {
meta:
description = "Detects exploitation of CVE-2026-9499 in Qt QTextCodec"
author = "Valters IT Hub"
date = "2026-07-21"
reference = "https://www.valtersit.com/cve/cve-2026-9499"
strings:
$codec_func = "QTextCodec::codecForName" ascii wide nocase
$raw_data = "fromRawData" ascii wide nocase
$codec_names = "UTF-8" ascii wide nocase
condition:
all of them
}
Sigma Rule (SIEM)
title: CVE-2026-9499 Qt Codec Overread Detection
id: 12c3e453-50be-46c4-a130-786a9661500f
status: experimental
description: Detects application crashes related to CVE-2026-9499 in Qt
author: Valters IT Hub
date: 2026-07-21
references:
- https://www.valtersit.com/cve/cve-2026-9499
logsource:
category: application
product: qt
detection:
selection:
EventID: 1000 # Application crash
Application: "*Qt*"
FaultModule: "*Qt5Core*"
FaultFunction: "*QTextCodec::codecForName*"
condition: selection
falsepositives:
- Legitimate application crashes due to other bugs
level: medium
Suricata IDS Rule
# No network-level detection applicable for this local vulnerability
# Monitor for crafted files being transferred via SMB or HTTP
alert http any any -> any any (msg:"CVE-2026-9499 Qt Codec Overread - Crafted File Transfer"; flow:to_server; content:"Content-Type|3a|"; nocase; content:"charset"; nocase; distance:0; sid:1000001; rev:1;)
Elastic (EQL) Query
// Detect Qt application crashes
process where event.type == "termination" and process.exit_code == -11 and
process.name : "*Qt*" and
process.command_line : "*QTextCodec*"
Splunk SPL Query
index=windows EventCode=1000 Application="*Qt*" FaultModule="*Qt5Core*"
| search FaultFunction="*QTextCodec::codecForName*"
| table _time, ComputerName, Application, FaultModule, FaultFunction
Wazuh Rule
<rule id="100001" level="10">
<if_sid>550</if_sid>
<field name="win.eventdata.eventID">1000</field>
<field name="win.eventdata.application">\.*Qt\.*</field>
<field name="win.eventdata.faultModule">\.*Qt5Core\.*</field>
<field name="win.eventdata.faultFunction">\.*QTextCodec::codecForName\.*</field>
<description>CVE-2026-9499 - Qt QTextCodec buffer over-read crash detected</description>
<group>cve_2026_9499,qt,denial_of_service,</group>
</rule>
Remediation & Mitigation
Immediate Actions (0-24 hours)
- Patch: No patch available. Monitor Qt security advisories for updates.
- Compensating Controls:
- Avoid using
QByteArray::fromRawData()withQTextCodec::codecForName(). - Ensure all
QByteArrayobjects passed tocodecForName()are NUL-terminated. - Use
QStringinstead ofQByteArraywhere possible.
- Avoid using
- Network-Level: Not applicable (local vulnerability).
- Authentication: Not applicable.
Short-term (1-7 days)
- Configuration Hardening: Review application code for usage of
fromRawData()withcodecForName(). - Monitoring: Implement the detection rules above to identify exploitation attempts.
- Vulnerability Scanning: Use
grep -r "fromRawData" /path/to/sourceto identify vulnerable code patterns.
Long-term
- Architecture Changes: Consider using
QStringfor codec name parameters. - Security Controls: Implement input validation for all user-supplied data passed to Qt functions.
- Developer Training: Educate developers on the dangers of non-NUL-terminated byte arrays.
Validation
- Patch Confirmation: Check Qt version with
qmake --versionand compare against patched versions when available. - Code Review: Ensure no
fromRawData()calls are used withcodecForName().
References & Resources
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-9499
- CVE.org: https://www.cve.org/CVERecord?id=CVE-2026-9499
- Vendor advisory: See vendor security page
- OSV: https://osv.dev/vulnerability/CVE-2026-9499
- Related CWE: https://cwe.mitre.org/data/definitions/126.html
- MITRE ATT&CK: https://attack.mitre.org/techniques/T1499/
Report generated by Valters IT Hub Neural Engine v25 | 2026-07-21 | https://www.valtersit.com/cve/cve-2026-9499