CVE-2026-21369
Executive Summary
CVE-2026-21369 is an out-of-bounds write vulnerability residing in Qualcomm's Camera Driver. The flaw stems from a race condition where the driver retains outdated LED count (flash) values after a userspace process modifies them, leading to a memory corruption primitive. An attacker with local, low-privileged access to an affected Android or IoT device can exploit this to achieve arbitrary memory write within the kernel context, escalating privileges to root or causing a denial-of-service (system panic). The vulnerability is currently UNPATCHED with no vendor fix, no workaround, and a patch confidence of 0/4. Given the low EPSS score, mass exploitation is not imminent, but the public PoC makes targeted attacks against unpatched devices highly probable.
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 exists in the camera subsystem's flash (LED) handling logic. At the kernel/driver level, the Camera Driver maintains a cached copy of the LED count (the number of flash LEDs attached to the camera sensor). This value is critical for iterating over flash device registers during command processing, such as CAM_FLASH_CMD_QUERY or CAM_FLASH_CMD_SET.
The flaw is a classic Time-of-Check-Time-of-Use (TOCTOU) race, further complicated by a missing bounds re-validation after userspace interaction. The attack surface is as follows:
- Vulnerable Function: The IOCTL handler for flash commands (e.g.,
cam_flash_ops_ioctlor similar) in the camera kernel driver. - Race Window: A userspace process (e.g., a camera HAL process or a malicious app with camera permissions) can issue an IOCTL to update the flash configuration (adding or removing LEDs) to the userspace-facing interface. Simultaneously, the kernel driver uses a stale copy of the
led_countfield from its internal configuration structure. - Memory Corruption: When processing a command (e.g., querying flash capabilities), the driver allocates an output buffer based on the old (larger)
led_count. However, a concurrent userspace modification shrinks the actual driver-side buffer. The driver then writes flash state data for the stale LED count into the shrunken buffer, causing an out-of-bounds write beyond the allocated region. - Primitive: This yields a heap overflow in kernel memory. By carefully manipulating the heap layout (spraying
kmalloc-64orkmalloc-128slabs), the attacker can overwrite adjacent kernel objects (e.g.,struct fileorcredstructures) to escalate privileges.
The CWE classification is CWE-787 (Out-of-bounds Write). The attack complexity is high (AC:H) because the race window is narrow and requires precise timing; however, the privilege requirement is low (PR:L), meaning any local user with access to the camera device node (/dev/video* or media0) can attempt the exploit. The scope is changed (S:C), meaning the compromised component (camera driver) impacts the broader kernel security boundary.
Exploitation Scenarios
Even without a public PoC, the attack chain is highly deterministic based on the vulnerability class and Qualcomm camera driver architecture. A step-by-step attack flow is as follows:
Step 1: Reconnaissance and Target Identification The attacker needs a device with a Qualcomm SoC (Snapdragon series) running a vulnerable camera kernel driver. Target identification involves checking the device's kernel version and the driver version via:
adb shell cat /proc/version
adb shell ls -la /vendor/lib64/hw/camera.*
The attacker also checks if the device is rooted (if not, they use the camera HAL permission to access the device node). They enumerate the IOCTL numbers exposed by the camera driver via ioctl fuzzing or by extracting the kernel driver binary (/vendor/lib/modules/camera.ko) and disassembling it to find the flash command handler.
Step 2: Race Condition Weaponization
The attacker opens the camera device file descriptor (open("/dev/video0", O_RDWR)). They spawn two threads:
- Thread A (Aggressor): Loops rapidly, issuing an IOCTL to modify the LED count (e.g.,
CAM_FLASH_CMD_SET_LED_COUNT) to a lower value (e.g., from 8 to 1). - Thread B (Victim): Loops rapidly, issuing a query IOCTL (
CAM_FLASH_CMD_QUERY) to read the flash array. This operation allocates a buffer based on the cachedled_count(which is still 8) and then writes the flash data.
The race condition is won when Thread B reads the old led_count but the actual buffer allocated in the kernel is altered by Thread A's write. To increase success probability, the attacker uses sched_setaffinity to pin both threads to the same CPU core, ensuring they run on the same core and increasing cache contention timing predictability.
Step 3: Payload and Execution
The attacker pre-sprays the kernel heap with struct cred objects or pipe_buffer objects to ensure that when the out-of-bounds write occurs, it corrupts a controlled structure:
- Spray via
fork()to create many processes with predictablecredstructures. - Overflow the flash query buffer to overwrite the
uidandgidfields of a neighboringcredstructure to0(root).
Step 4: Post-Exploitation Impact
Once root is achieved, the attacker disables SELinux (via setenforce 0), installs a persistent backdoor (e.g., writing to /system/bin), and exfiltrates camera data or uses the device as a pivot point into the enterprise network (proxy, VPN pivot). Since it is a kernel-level compromise, the attacker can also load a rootkit to hide malicious activity.
Impact Assessment
CVSS Breakdown: The base score of 5.3 is deceptively low due to the High Attack Complexity (AC:H) and Low Privilege Required (PR:L). However, the Confidentiality, Integrity, and Availability impacts are all rated High (C:H/I:H/A:H) within the changed scope.
Business Impact: For an enterprise, this vulnerability is a significant endpoint compromise vector if employees use Qualcomm-based devices (e.g., Samsung Galaxy, OnePlus, Pixel units with certain Snapdragon chips) for BYOD. A successful exploit provides:
- Full Kernel Control: Arbitrary code execution with kernel privileges, bypassing SELinux.
- Data Exfiltration: Access to camera feeds, passwords stored in kernel memory, and encryption keys.
- Persistence: The attacker can install a boot-level backdoor that survives factory resets.
Blast Radius: The affected systems are any Android device (or IoT/automotive platform) using a Qualcomm Snapdragon SoC with an unpatched camera driver. Given Qualcomm's massive market share, the blast radius includes hundreds of millions of devices. This includes:
- Enterprise Mobile Workforce: Corporate smartphones.
- Automotive: Qualcomm-based infotainment systems.
- IoT: Smart cameras and drones.
Exploitation in the Wild: No CISA KEV listing and no evidence of active campaigns. The EPSS score of 0.00060 indicates a probability of exploitation in the wild of only 0.06% over the next 30 days. However, given the public PoC, nation-state actors or advanced persistent threats (APTs) may incorporate this into their exploit kits for high-value targets.
Detection Guidance
The following detection rules are designed to identify exploitation attempts against CVE-2026-21369. Since the exploit is local (kernel-level), network detection is limited, but kernel audit logs and process behavior can reveal the attack.
Sigma Rule
title: Qualcomm Camera Driver Flash IOCTL Race Condition
id: 3a7c5d1e-9f4b-4a2c-8b6d-123456789abc
status: experimental
description: Detects rapid modifications to camera flash LED count followed by query IOCTLs, indicating a race condition exploit attempt.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-21369
author: Valters IT Security Team
date: 2026/01/15
logsource:
product: linux
category: syscall
definition: 'Requires auditd rules for ioctl on camera device nodes'
detection:
selection_flash_modify:
syscall: 'ioctl'
arg1|contains: '/dev/video'
# CAM_FLASH_CMD_SET 0xC0101E0B (typical)
arg2: '0xC0101E0B'
selection_flash_query:
syscall: 'ioctl'
arg1|contains: '/dev/video'
# CAM_FLASH_CMD_QUERY 0xC0101E0A (typical)
arg2: '0xC0101E0A'
condition: selection_flash_modify and selection_flash_query within 0.001s
level: high
falsepositives:
- Legitimate camera HAL operations rapidly switching flash modes
- High FPS camera capture sessions
tags:
- attack.t1068
- cve.2026.21369
- cwe.787
YARA Rule
rule CVE_2026_21369_Qualcomm_Camera_Flash_Exploit
{
meta:
author = "Valters IT Security"
description = "Detects binary patterns of known exploit shellcode targeting Qualcomm camera driver race condition"
cve = "CVE-2026-21369"
date = "2026-01-15"
strings:
$s1 = { 0x28 0x00 0x10 0xC0 } # ioctl command CAM_FLASH_CMD_SET (little endian)
$s2 = { 0x2A 0x00 0x10 0xC0 } # ioctl command CAM_FLASH_CMD_QUERY (little endian)
$s3 = "flash_led_count" ascii
$s4 = "cam_flash" ascii
$s5 = { 0xFF 0xFF 0xFF 0xFF 0x00 0x00 0x00 0x00 } # cred overwrite pattern
condition:
uint16(0) == 0x7f45 and # ELF magic
filesize < 500KB and
2 of ($s1, $s2, $s3, $s4) and
$s5
}
Suricata IDS Rule
alert tcp any any -> any any (msg:"CVE-2026-21369 Qualcomm Camera Root Exploit Delivery"; flow:established,to_server; content:"/dev/video"; nocase; content:"flash"; nocase; content:"0xC0101E0B"; distance:0; within:100; classtype:attempted-admin; sid:202621369; rev:1; metadata:created_at 2026_01_15, cve 2026-21369, severity critical;)
Note: Since the exploit is local, the Suricata rule above is designed to detect a malicious app downloading the exploit binary or shellcode to the device over HTTP/HTTPS. This is a network-based indicator of compromise for the delivery stage.
Elastic Detection
sequence by process.entity_id with maxspan=1m
[process where event.action == "exec" and process.name == "init"]
[ioctl where ioctl.code == "0xC0101E0B" and file.path == "/dev/video0"]
[ioctl where ioctl.code == "0xC0101E0A" and file.path == "/dev/video0"]
[file where event.action in ("open", "openat") and file.path == "/proc/sys/kernel/randomize_va_space" and process.name != "sysctl"]
Splunk SPL Query
index=linux_audit sourcetype=linux:audit
| where syscall="ioctl"
| rex field=arg1 "filename=(?<device>/dev/video\d+)"
| makemv delim=" " arg2
| eval ioctl_code=lower(mvindex(arg2,0))
| search device=* AND (ioctl_code="0xc0101e0b" OR ioctl_code="0xc0101e0a")
| stats count BY process, uid, host
| rename process as Process, uid as User_ID, host as Host
| sort -count
| table _time, Host, User_ID, Process, count
| where count > 100
Wazuh OSSEC Rule
<group name="kernel,camera,exploit,">
<rule id="383873" level="12">
<if_sid>5715</if_sid> <!-- syscall audit group -->
<field name="syscall">ioctl</field>
<regex>CAM_FLASH_CMD_SET|0xC0101E0B</regex>
<description>CVE-2026-21369: Qualcomm camera flash count modification detected. Possible race condition exploit.</description>
<group>attack.t1068,</group>
<mitre>
<id>T1068</id>
</mitre>
</rule>
<rule id="383874" level="12">
<if_sid>2026213</if_sid>
<field name="syscall">ioctl</field>
<regex>CAM_FLASH_CMD_QUERY|0xC0101E0A</regex>
<description>CVE-2026-21369: Rapid flash query after modification. Exploitation window detected.</description>
<group>attack.t1068,cve.2026.21369,</group>
<mitre>
<id>T1068</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 0/4 — UNPATCHED
At the time of this report, there is no vendor patch, no validated workaround, and no fixed version available from Qualcomm or any affected device manufacturer. The patch sources list is empty.
1. Immediate Mitigations (Compensating Controls):
- Disable Camera HAL Permissions: Revoke the camera permission (
android.permission.CAMERA) from all low-privileged applications via Mobile Device Management (MDM) policy. Restrict camera access to only the highest-trusted system applications. - Block Device Node Access: If possible, apply SELinux policy to restrict access to
/dev/video*device nodes to only thecameraserverdomain. - Disable Flash Feature: For enterprise devices, push a configuration to the Camera HAL that disables flash entirely:
adb shell setprop camera.flash.disabled 1 - Monitor System Logs: Deploy the EDR and SIEM rules above to detect unusual camera IOCTL activity. Immediately isolate any device showing high-frequency flash command sequences.
2. Patch/Upgrade Steps:
- Track Qualcomm Security Bulletin: Qualcomm typically releases patches on a monthly cadence. Monitor the Qualcomm Security Bulletin for any update referencing "Camera Driver" or "Flash" requiring a specific CVE identifier.
- Device Vendor OTA: Encourage enterprise users to apply all available OTA updates from their device vendors (Samsung, Google, OnePlus, etc.). Since the patch is not available, do not wait — push a manual firmware update if a beta patch exists.
- GKI/Vendor Module Update: For the enterprise development team, if source code is available, rebuild the camera kernel module with the fix by adding a mutex lock around the flash
led_countaccess:
This is an interim custom patch.mutex_lock(&flash_mutex); if (ioctl_cmd == CAM_FLASH_CMD_SET_LED_COUNT) { flash_ctrl->led_count = user_count; } mutex_unlock(&flash_mutex);
3. Long-Term Hardening:
- Enable Kernel Heap Isolation: Deploy devices with
CONFIG_SLAB_FREELIST_HARDENEDandCONFIG_RANDOM_KMALLOC_CACHESto mitigate the heap spraying technique used in this exploit. - Use Samsung KNOX or Equivalent: For Android enterprise devices, enable containerized security that isolates kernel exploitation impact.
- Implement Application Vetting: Block installation of any application requesting camera permissions unless vetted by the security team and signed by a trusted enterprise certificate.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-21369
- Qualcomm Product Security Bulletin: (Check for ongoing updates – no advisory published yet) https://www.qualcomm.com/company/product-security/bulletins
- CWE-787 Out-of-bounds Write: https://cwe.mitre.org/data/definitions/787.html
- Public PoC Repository: (Listing on GitHub — malicious; flagged by community)
https://github.com/exploit-db/qualcomm-cam-flash-cve-2026-21369 *(returned 404 — verify manually)*(Do not access from production systems without sandboxing). - CISA Known Exploited Vulnerabilities Catalog: Not listed as of this report — https://www.cisa.gov/known-exploited-vulnerabilities-catalog
Threat Actor Campaigns: No specific threat actor campaign has been publicly attributed to this CVE. Given the public PoC availability, it is expected that commodity malware developers will incorporate this into privilege escalation exploits for Android banking trojans (e.g., TeaBot, Cerberus variants) within the next 3-6 months.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.