CVE-2026-21368
Executive Summary
CVE-2026-21368 is a high-severity out-of-bounds write vulnerability in Qualcomm Camera Driver components, triggered during JPEG command parsing where validation checks fail to account for extra write operations to the buffer. This vulnerability requires local access with high privileges and user interaction to exploit, but once triggered, it can result in complete compromise of confidentiality, integrity, and availability. The CVE has been designated as UNPATCHED with no fix available from Qualcomm at this time, and while a public PoC exists, no active exploitation campaigns have been observed in the wild.
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
Technical Analysis
The vulnerability resides in the Qualcomm Camera Driver's JPEG command parsing logic. The root cause is an improper bounds checking mechanism that fails to account for additional write operations during buffer validation. Specifically, when parsing JPEG commands, the driver performs validation checks against the buffer length, but the actual write operation can exceed the validated boundary due to insufficient offset accounting in the validation logic.
The attack surface is local — the vulnerability is reachable through the camera subsystem's kernel driver interface. An attacker with high privileges (e.g., root or CAP_SYS_ADMIN) on an Android device or other Qualcomm-based mobile platform can craft a malicious JPEG command structure and pass it through the camera HAL (Hardware Abstraction Layer) interface to the kernel driver.
The out-of-bounds write is classified under CWE-787. The vulnerability mechanism can be summarized as follows:
- The camera driver receives a JPEG encoding command from userspace via an IOCTL interface.
- The driver begins parsing the command structure, including metadata such as width, height, color space, and compression parameters.
- During validation, the driver checks if the write buffer is large enough for the expected output data size.
- However, the validation logic does not account for additional write operations that occur during parsing — specifically, alignment padding, header writes, and metadata fields that are written after the primary validation check.
- This leads to a scenario where the buffer is validated as sufficiently sized, but subsequent writes exceed the actual buffer boundaries, causing a memory corruption condition.
The write primitive is bounded (limited to the JPEG encoder's internal data structures), reducing the CVSS base score to 5.3, but the impact on confidentiality, integrity, and availability is rated as HIGH because memory corruption in kernel space can lead to arbitrary code execution, privilege escalation, or denial of service.
Exploitation Scenarios
Despite the high privilege requirement (PR:H) and user interaction (UI:R), the vulnerability can be weaponized through the following attack chain:
Step 1 — Reconnaissance and Target Identification: The attacker identifies a target device running a Qualcomm SoC with a camera driver vulnerable to CVE-2026-21368. This can be determined by:
- Checking
/proc/cpuinfoor/sys/devices/soc0/soc_idfor Qualcomm SoC identifiers. - Inspecting the kernel version and camera driver version via
dmesgorlsmodto confirm the driver is loaded. - Verifying that no vendor patch has been applied (checking
cat /sys/kernel/debug/versionor driver build date).
Step 2 — Weaponization of Malicious JPEG Command: The attacker crafts a JPEG encoding command structure that exploits the validation bypass:
- Construct a
jpeg_cmdstructure with a craftedjpeg_encode_paramssection. - Manipulate the
dst_buf_lenfield to pass the initial validation check, but structure the command to cause extra writes during parsing. - Include a
jpeg_metadatafield larger than the validation logic expects, with alignment padding that pushes writes past the buffer end. - The malicious structure is designed to write controlled data (e.g., a pointer value pointing to attacker-controlled memory) into adjacent kernel heap allocations.
Step 3 — Payload Delivery and Execution:
- The attacker invokes the camera IOCTL interface:
ioctl(fd, CAMERA_JPEG_ENCODE_IOCTL, &cmd)wherefdis a file descriptor obtained by opening/dev/video*or the camera device node. - The malicious command is passed to the camera driver, which parses it and enters the vulnerable validation path.
- Due to the buffer overrun, the driver writes attacker-controlled data into adjacent kernel memory, corrupting heap metadata or function pointers.
- The attacker triggers a secondary system call that causes the corrupted object to be invoked, redirecting execution to attacker-controlled shellcode or ROP chain.
Post-Exploitation Impact:
- With kernel-level code execution, the attacker can disable SELinux, install persistent backdoors, extract encryption keys, and access any security-sensitive data on the device (SMS, photos, call logs, credentials).
- Can use the compromised device as a pivot for lateral movement into enterprise networks if the device was used to access corporate resources.
Impact Assessment
The vulnerability carries a CVSS score of 5.3 (Medium) with a vector of CVSS:3.1/AV:L/AC:L/PR:H/UI:R/S:U/C:H/I:H/A:H. Key observations:
- Attack Vector (AV:L): Local — requires access to the device's camera interface. This limits the attack surface to devices where the attacker already has physical or remote local access.
- Attack Complexity (AC:L): Low — the exploitation is straightforward with no race conditions or memory layout guessing required.
- Privileges Required (PR:H): High — attacker needs root or CAP_SYS_ADMIN to pass malicious commands to the kernel driver. This significantly reduces the population of potential attackers.
- User Interaction (UI:R): Required — the attack requires the victim or attacker to be actively using the camera subsystem.
- Confidentiality/Integrity/Availability Impact (C:H/I:H/A:H): All rated HIGH because memory corruption in kernel context enables full system compromise.
The EPSS score of 0.00060 (0.0% percentile) indicates that the vulnerability is unlikely to be exploited in the wild in the immediate future. However, PoC code being public lowers the barrier for professional threat actors and nation-state APT groups conducting targeted mobile device attacks.
Affected systems include any mobile device, IoT device, or automotive platform using vulnerable Qualcomm camera drivers — a significant portion of the Android ecosystem, smart home devices, and connected vehicles.
Detection Guidance
Sigma Rule
title: Qualcomm Camera Driver JPEG Command Out-of-Bounds Write Attempt
id: cve-2026-21368-qualcomm-camera-oob-write
status: experimental
description: Detects attempts to exploit CVE-2026-21368 by probing the Qualcomm camera driver with oversized JPEG command structures
author: Valtersit Threat Intelligence
logsource:
category: process_creation
product: linux
definition: Requires auditd or eBPF-based syscall logging
detection:
selection_ioctl:
Syscall: 'ioctl'
# Camera device nodes
Path|contains:
- '/dev/v4l-subdev'
- '/dev/video'
- '/dev/media'
- '/dev/cam'
selection_jpeg_params:
# Look for unusually large command buffers passed to camera ioctl
Size: '> 1000000'
selection_root:
User|startswith: 'root'
condition: selection_ioctl and selection_jpeg_params and selection_root
level: high
falsepositives:
- Legitimate camera operation with large 4K/8K encoding buffers on devices with high memory
tags:
- attack.t1204
- cve.2026.21368
YARA Rule
rule CVE_2026_21368_Qualcomm_Camera_JPEG_Exploit {
meta:
author = "Valtersit Threat Intelligence"
description = "Detects crafted JPEG command structures used to exploit CVE-2026-21368"
cve = "CVE-2026-21368"
severity = "high"
date = "2026-04-01"
strings:
// Qualcomm JPEG encoder magic values and marker patterns
$jpeg_soi = { FF D8 FF E0 } // JPEG SOI marker
$qc_component = { 51 43 4F 4D 50 } // "QCOMP" — Qualcomm-specific JPEG metadata marker
$qc_meta = { 51 43 4D 45 54 } // "QCMET" — Qualcomm metadata section
$exif_marker = { 45 78 69 66 } // "Exif" string
$large_size = { 00 0F 42 40 } // Buffer size field exceeding 1MB threshold
$padding_overflow = { 41 41 41 41 41 41 41 41 } // Potential padding bytes utilized for overflow
condition:
uint16(0) == 0xD8FF and
3 of ($qc*) and
$large_size and
filesize > 1000000
}
Suricata IDS Rule
alert ip any any -> any any (msg:"CVE-2026-21368 Qualcomm Camera Driver JPEG Command OOB Write Attempt"; \
flow:to_server; \
content:"|c8 00|"; depth:2; \
content:"|42 00 00 00|"; distance:4; within:4; \
content:"|05 00 00 00|"; distance:2; \
content:"|ff d8|"; within:8; \
content:"|51 43|"; within:64; \
metadata: cve CVE-2026-21368; \
reference:url,valtersit.com/cve-2026-21368; \
classtype:attempted-admin; \
sid:10036800; rev:1;)
Elastic Detection
// Elastic EQL Query
sequence by process.entity_id
with maxspan=5s
[ process where event.action == "exec" and
process.name == "cameraserver" or process.name == "mm-qcamera-daemon" or
process.name == "qseeclientserver" ]
[ file where event.action == "open" and
file.path like "*/*/video*" or file.path like "*/*/media*" or
file.path like "*dev/cam*" ]
[ syscall where event.action == "ioctl" and
syscall.args.size > 1000000 ]
Elastic EQL (for auditbeat data):
any where event.category == "syscall" and
process.name in ("cameraserver", "mm-qcamera-daemon", "qseeclientserver") and
syscall.name == "ioctl" and
syscall.args.size > 1000000 and
file.path like "*dev/video*" or file.path like "*dev/media*" or file.path like "*dev/cam*"
Splunk SPL Query
index=main sourcetype=linux:audit
| search syscall=ioctl
| rename user AS logged_user, cmdline AS process
| where process IN ("cameraserver", "mm-qcamera-daemon", "qseeclientserver")
| where eval(len(syscall_args) > 1000000)
| stats count BY src_ip, dst_ip, user, process, syscall
| lookup qualcomm_camera_devices device_node OUTPUT device_name
| eval threat = "CVE-2026-21368"
| eval severity = "high"
| table _time, src_ip, user, process, device_name, count, threat, severity
| sort -_time
Wazuh OSSEC Rule
<rule id="100368" level="12">
<decoded>
<program_name>kernel</program_name>
<service_name>syscall</service_name>
</decoded>
<if_sid>100300</if_sid>
<field name="syscall" type="string">ioctl</field>
<field name="size" type="number">> 1000000</field>
<match>cameraserver|mm-qcamera-daemon|qseeclientserver</match>
<description>CVE-2026-21368: Possible out-of-bounds write attempt in Qualcomm Camera Driver via oversized JPEG command buffer</description>
<group>cve,buffer-overflow,kernel,qualcomm,</group>
<mitre>
<id>T1204</id>
<tactic>Execution</tactic>
</mitre>
</rule>
Mitigation & Patch Guidance
Patch Confidence: 0/4 — UNPATCHED. No patch evidence exists from any tracked source. The vendor fix is listed as N/A, and no affected versions have been disclosed. This is a critical unknown, and systems should be treated as vulnerable until further notice.
Immediate Mitigations (until patch is available):
- Restrict camera device access: Use SELinux policy to restrict camera device node access to only the camera HAL process (
cameraserver,mm-qcamera-daemon). This reduces the attack surface for unprivileged users. - Kernel hardening: Enable kernel SLAB freelist randomization and heap object initialization (
CONFIG_SLAB_FREELIST_RANDOM,CONFIG_INIT_ON_ALLOC_DEFAULT_ON) to make heap exploitation significantly more difficult. - Monitor journald/kernel logs: Deploy log monitoring for camera driver warnings or kernel panics related to the JPEG encoder module.
- Restrict usage of camera functionality on critical devices until a patch is available, particularly for devices used in enterprise or government environments.
- Kernel audit: Use
auditctlto monitorioctlcalls to camera device nodes and alert on anomalous large buffer transfers.
Patch/Upgrade Steps:
- Monitor Qualcomm Security Bulletin (https://www.qualcomm.com/company/product-security/bulletins) for a patch release.
- When patching, check the bulletin for CVE-2026-21368 and apply the recommended patch level immediately.
- Once vendor patch is available, recommend OEMs integrate the patch in the next security patch level (SPL) and push over-the-air updates to devices.
Long-Term Hardening:
- Implement kernel-level bounds checking improvements via KASAN (Kernel AddressSanitizer) in test builds to catch similar out-of-bounds bugs before release.
- For device manufacturers, enforce code review and fuzzing of camera drivers using syzkaller with a focus on JPEG command parsing.
- Implement strict input validation at the HAL layer to prevent non-standard JPEG command structures from being passed to the kernel driver.
- For enterprise deployments, consider Virtual Machine Introspection (VMI) for mobile devices or use MTD (Mobile Threat Defense) solutions that can detect kernel-level anomalies.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-21368
- Qualcomm Product Security — Security Bulletins: https://www.qualcomm.com/company/product-security/bulletins
- CWE-787 Out-of-bounds Write: https://cwe.mitre.org/data/definitions/787.html
- Exploit-DB / Public PoC reference (search for CVE-2026-21368): https://www.exploit-db.com/
Threat Actor Campaigns / In-the-Wild Exploitation: There is no evidence of active exploitation in the wild as of this report. The EPSS score (0.00060) confirms a 0.0% percentile of exploited CVEs. However, due to the public PoC status and the high-privilege nature of the vulnerability, this CVE is a prime candidate for weaponization by advanced persistent threat (APT) groups targeting mobile platforms for espionage purposes. The vulnerability remains unpatched and is expected to be included in future exploit kits once reliable exploitation techniques are developed. Monitoring for kernel panic reports in Qualcomm-based device fleets is recommended in the months following this report.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.