CVE-2026-63633
Executive Summary
CVE-2026-63633 is a heap buffer overflow vulnerability in FreeRDP, a popular open-source implementation of the Remote Desktop Protocol. The vulnerability exists in the Opus audio decoder path, where a malicious RDP server can trigger a large decoded frame write beyond the bounds of an allocated 4096-byte destination buffer. An attacker who controls an RDP server can exploit this flaw against a client connecting to it, leading to client heap corruption, denial-of-service (crash), and potentially arbitrary code execution on the victim's machine. The flaw affects all FreeRDP clients built with WITH_OPUS enabled and WITH_DSP_FFMPEG disabled, prior to version 3.28.0. The vulnerability is remotely triggerable without authentication, requiring only user interaction in the form of initiating an RDP connection to a malicious server.
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 audio decompression pipeline of FreeRDP's client-side audio subsystem. The specific code path involves freerdp_dsp_decode_opus located in libfreerdp/codec/dsp.c. In this function, the code calls Stream_EnsureRemainingCapacity on context->common.buffer — a check intended to ensure the output buffer is large enough for the decoded audio data. However, this check is performed on the wrong buffer. The opus_decode library function directly writes its decoded PCM audio output into a caller-supplied destination stream, not into context->common.buffer.
This mismatch becomes critical because the actual destination buffer used in the audio redirection channel (channels/rdpsnd/client/rdpsnd_main.c) is allocated from a StreamPool_Take operation that reserves a fixed 4096-byte buffer. A malicious RDP server can negotiate WAVE_FORMAT_OPUS encoding and then deliver an Opus frame that decodes to a much larger PCM sample (Opus supports decoding a single frame into up to 120ms of audio, which — at typical sample rates of 48 kHz with 16-bit stereo — can exceed 20,000 bytes). Since the capacity check is performed against the wrong buffer, the actual destination does not get resized, resulting in a heap buffer overflow when opus_decode writes beyond the 4096-byte boundary.
Attack Surface: The vulnerable function is reachable via the RDP Audio Output (rdpsnd) channel. Any FreeRDP client that connects to an RDP server and negotiates audio redirection is exposed. The attack surface is the client-side component, making this a "malicious server attacks the client" scenario — a common and dangerous pattern in network protocols where the client-side component is expected to be the trust boundary.
Preconditions:
- FreeRDP compiled with
WITH_OPUSenabled (this is the default in most distributions) - FreeRDP compiled with
WITH_DSP_FFMPEGdisabled (default in many configurations) - The connecting client negotiates audio redirection with
WAVE_FORMAT_OPUScodec - The attacker controls an RDP server
Root Cause Classification (CWE-122): This is a classic heap buffer overflow where memory is written beyond the bounds of a heap-allocated buffer. The overflow is triggered by an attacker-controlled size value (the Opus frame decode size), making the vulnerable structure reminiscent of CWE-787 (out-of-bounds write) but specifically classified under CWE-122 due to the heap memory context.
Exploitation Scenarios
Step 1 — Reconnaissance/Target Identification: An attacker operates a malicious RDP server on the internet or an internal network. Target identification typically happens through network scanning (e.g., detecting FreeRDP client software via user-agent strings in other services, endpoint detection, or simply asserting that any RDP client is vulnerable since this affects all prior versions). In enterprise environments, the attacker may target internal users who are known or likely to use Linux/Unix-based RDP clients (given FreeRDP's platform focus). The attack does not require prior knowledge of the client version — the server can attempt negotiation of WAVE_FORMAT_OPUS and the flaw triggers regardless of exact minor version as long as it is < 3.28.0.
Step 2 — Flaw Trigger Mechanism: The attacker configures their RDP server to advertise WAVE_FORMAT_OPUS as a supported audio codec during the RDP connection negotiation phase. When the victim client connects and audio redirection is established, the server sends an audio packet containing a crafted Opus frame. The frame is specifically constructed to decode to a PCM output larger than 4096 bytes (e.g., using a high bitrate, large frame size, or specific channel configuration that yields an output exceeding the fixed buffer size). The client's freerdp_dsp_decode_opus function processes this frame and calls opus_decode, which writes the decoded output directly into the 4096-byte StreamPool_Take buffer without proper bounds validation (due to the incorrect capacity check target).
Step 3 — Payload/Execution Method: The overflow writes data past the heap buffer boundary. In a controlled exploitation scenario, an attacker would groom the heap to place critical data structures (such as function pointers, object metadata, or adjacent buffers) immediately after the vulnerable 4096-byte buffer. By carefully crafting the decoded PCM audio data (which is largely attacker-controlled through the Opus bitstream), the attacker can overwrite adjacent heap metadata or function pointers. A common technique for such client-side overflows involves overwriting a function pointer or an object's virtual method table entry to redirect control flow to a gadget that executes shellcode or a ROP chain. The attacker may also leverage the overflow to corrupt the heap's integrity in a way that enables a subsequent write-what-where primitive via heap metadata manipulation.
Step 4 — Post-Exploitation Impact: Post-exploitation depends on the privileges of the user running the FreeRDP client. If the client runs in the context of a standard user, the attacker gains code execution with those privileges and can install persistence mechanisms, steal credentials, escalate privileges via other local vulnerabilities, or pivot laterally. If the client runs as root/Administrator (common in thin-client deployments, VDI setups, or unattended automation), the attacker gains immediate full system control. In the absence of a full exploit, the overflow at minimum causes a crash (denial of service) of the client application.
Note: No public PoC or exploit code has been observed in the wild as of this writing. The attack chain described above is inferred from the vulnerability class and the technical details present in the NVD description. Attackers with reverse-engineering capability can develop a working exploit using standard heap-overflow exploitation techniques.
Impact Assessment
Business Impact: This vulnerability represents a significant risk to enterprises that rely on FreeRDP for remote access. The most severe impact scenario involves a compromised or malicious RDP server delivering a payload to a connecting client. This is particularly relevant in:
- VDI environments where thin clients or automation clients connect to centralized infrastructure
- Corporate networks where users connect to untrusted RDP endpoints (e.g., connecting outside the corporate network to public-facing servers)
- IT administration where administrators use FreeRDP clients from high-privilege accounts to connect to other machines
Blast Radius: The entire FreeRDP client ecosystem is affected, spanning Linux, macOS, and BSD platforms (with Windows builds also affected when compiled with Opus support). Given FreeRDP's widespread adoption in open-source desktop environments, embedded systems, and cloud VDI solutions, the potential exposure is substantial. Any system running FreeRDP < 3.28.0 with Opus support is vulnerable.
CVSS Considerations: Although no official CVSS score has been assigned, characteristics of this vulnerability align with a high-severity rating: network attack vector (the attacker can be anywhere reachable from the client), low attack complexity (no special conditions beyond client connection), no privileges required, low user interaction (the user must simply initiate an RDP connection), and high confidentiality/integrity/availability impact given the potential for code execution.
Confidence: CVSS Score: N/A per the provided data. Do not override with other sources. The lack of an official score from the CNA does not diminish the severity; mitigations should be prioritized given the code-execution potential.
Detection Guidance
Sigma Rule
title: FreeRDP Client Heap Buffer Overflow Attempt (CVE-2026-63633)
id: 8b8a2e3f-6c2d-4a9b-bc2e-8d4a2f5c6a9e
status: experimental
description: Detects FreeRDP client crash events or unusual memory behavior indicative of heap overflow exploitation attempts.
author: Valtersit Threat Intel Team
logsource:
category: application
product: freerdp
definition: 'Look for crash events in FreeRDP client processes'
detection:
selection_crash:
EventLog: Application
Provider_Name: 'Application Error'
Application_Name: 'xfreerdp*'
Faulting_Module: 'libfreerdp*'
selection_repeated_crash:
Application_Name: 'xfreerdp*'
| count() > 3 by Computer
timeframe: 15m
condition: selection_crash or selection_repeated_crash
level: high
falsepositives:
- Legitimate FreeRDP crashes from unrelated bugs
- Memory pressure in constrained environments
tags:
- attack.t1203
- cve.2026-63633
- cwe.122
YARA Rule
rule CVE_2026_63633_FreeRDP_Opus_Overflow
{
meta:
author = "Valtersit Threat Intel Team"
description = "Detects suspicious FreeRDP Opus audio packets or patterns associated with heap overflow exploitation"
date = "2026-04-01"
cve = "CVE-2026-63633"
severity = "high"
strings:
$opus_format = { 4F 50 55 53 } // "OPUS" in RDP audio negotiation
$wave_format_opus = { 00 02 00 00 } // WAVE_FORMAT_OPUS tag (0x0002)
$opus_decode_ref = { 6F 70 75 73 5F 64 65 63 6F 64 65 } // "opus_decode"
$stream_pool_pattern = { 10 00 00 00 } // 4096-byte allocation size
condition:
uint16(0) == 0x4D42 or // MZ header check (PE file)
filesize < 10MB and
(1 of them) and
(
$opus_format or
($wave_format_opus and #opus_decode_ref > 0)
)
}
Suricata IDS Rule
alert tcp any any -> any 3389 (msg:"ET EXPLOIT FreeRDP Opus Audio Heap Overflow Attempt (CVE-2026-63633)"; flow:to_client; content:"|00 02|"; offset:0; depth:2; content:"|4F 50 55 53|"; within:50; content:"|00 00|"; within:100; threshold:type both, track by_src, count 5, seconds 60; classtype:attempted-user; sid:63633; rev:1; metadata:created_at 2026-04-01, updated_at 2026-04-01, cve 2026-63633, mitre_attack T1203;)
Note: Due to the encrypted nature of RDP after the connection is established (TLS or the native RDP Security), the Suricata rule above is a best-effort detection baseline for pre-encryption handshake traffic. For post-handshake detection, network-level detection requires TLS interception. This limitation is noted for SOC teams.
Elastic Detection
query: |
event.category: process AND
process.name: (xfreerdp or freerdp or wlfreerdp) AND
event.action: crash AND
(process.args: "*rdpsnd*" or process.args: "*audio*") AND
NOT process.exit_code: 0
# EQL equivalent
search_examples:
- |
process where event.action == "crash" and
process.name in ("xfreerdp", "wlfreerdp", "sfreerdp") and
wildcard(process.args, "*rdpsnd*", "*audio*")
- |
file where event.action in ("write", "modification") and
process.name == "xfreerdp" and
file.size > 4096 and
file.extension == "pcm"
Splunk SPL Query
index=windows OR index=linux
(source="WinEventLog:Application" AND EventCode=1000 AND Application_Name="xfreerdp*")
OR (source="/var/log/messages" AND "segfault" AND "xfreerdp")
OR (source="/var/log/syslog" AND "xfreerdp" AND ("heap" OR "corruption" OR "abort"))
| statistics count by host, Application_Name, Faulting_Module
| where count > 3
| sort - count
| table _time, host, Application_Name, Faulting_Module, count
Wazuh OSSEC Rule
<group name="freerdp,cve_2026_63633,exploitation,">
<rule id="538710" level="12" frequency="3" timeframe="300">
<if_matched_group>freerdp_alert</if_matched_group>
<description>CVE-2026-63633: Repeated FreeRDP client crashes - possible heap overflow exploitation</description>
<group>cve-2026-63633,exploitation,heap_overflow,</group>
<options>no_full_log</options>
</rule>
<rule id="538711" level="10">
<if_sid>63633</if_sid>
<match>segfault|SIGSEGV|heap corruption|memory corruption|AddressSanitizer</match>
<description>CVE-2026-63633: FreeRDP crash signature matching heap overflow pattern</description>
<group>cve-2026-63633,exploitation,heap_overflow,</group>
</rule>
<rule id="538712" level="8">
<if_sid>63633</if_sid>
<match>opus_decode|rdpsnd|WAVE_FORMAT_OPUS</match>
<description>CVE-2026-63633: FreeRDP Opus audio processing crash - potential exploitation attempt</description>
<group>cve-2026-63633,exploitation,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch Status: UNPATCHED in all versions prior to 3.28.0 — Patch Confidence 0/4. While the NVD description states the issue is fixed in version 3.28.0, no official vendor advisory or patch source has been verified by our tracking systems. Exercise caution and validate that the upgrade is from a trusted source.
Immediate Mitigations (without patch):
- Disable Opus audio negotiation — Configure FreeRDP clients to not negotiate
WAVE_FORMAT_OPUS. This can be done by setting the client configuration to force a different audio codec (e.g., PCM orWAVE_FORMAT_44K16BITMONO). In most builds, this is controlled via command-line flags (e.g.,-soundwith specific codec options) or in thefreerdpconfiguration file. - Disable audio redirection entirely — If audio is not business-critical, launch FreeRDP clients with audio redirection disabled. Most CLI clients support flags to disable audio (e.g.,
-no-soundor equivalent), which removes the vulnerable code path from reach. - Network segmentation / egress filtering — Restrict outbound RDP (TCP 3389) connections from client workstations to only approved internal servers. This prevents users from connecting to arbitrary malicious servers on the internet.
- Use a trusted RDP gateway — Route RDP connections through a mediated gateway that can filter or terminate connections to untrusted endpoints.
- Run FreeRDP client in a sandbox — If the use case permits, run the client in a virtual machine, container with memory limits, or with a low-privilege OS account to reduce the blast radius of a successful exploit.
Patch/Upgrade Steps:
- Upgrade to FreeRDP version 3.28.0 or later once the official release is confirmed and trusted.
- For package-managed distributions (Debian/Ubuntu, RHEL/Fedora, Arch), monitor for the updated package version and apply it through the standard package manager.
- For source builds, pull the referenced commit that addresses the
freerdp_dsp_decode_opusbuffer handling issue from the official FreeRDP git repository (github.com/FreeRDP/FreeRDP). - Verify the patch by checking the version output (
xfreerdp --version) and confirming it reports ≥ 3.28.0.
Long-term Hardening:
- Follow a vendor advisory — Subscribe to the FreeRDP security mailing list or GitHub release notifications to be alerted to future security updates.
- Memory-safe build options — Rebuild FreeRDP with compiler hardening flags:
-fstack-protector-strong -D_FORTIFY_SOURCE=2 -pie -fPIE. Consider using AddressSanitizer (-fsanitize=address) in development/hardening builds to catch memory errors during QA. - Implement client-side attack surface reduction — Evaluate whether audio redirection is necessary for all user populations. Create multiple configuration profiles: one with full features for trusted, high-value users who connect to known-good endpoints, and one with minimal features (no audio, no drive redirection, no clipboard) for lower-trust connection scenarios.
- Periodic code audit — Include FreeRDP in the third-party software audit list. The
libfreerdp/codec/dsp.cfile has been a source of multiple codec-related vulnerabilities; prioritize auditing codec implementations for buffer handling correctness. - Network monitoring hygiene — Maintain visibility into RDP connections initiated from endpoints; flag anomalous connection patterns (e.g., a user connecting to many distinct servers in a short period, or connections to IPs with pre-existing threat intelligence scores).
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-63633 — Official NIST record (the primary source used for this analysis).
- FreeRDP GitHub Repository: https://github.com/FreeRDP/FreeRDP — The official source repository. Version 3.28.0 contains the fix; the patch can be found in the commit history of
libfreerdp/codec/dsp.c. - FreeRDP Release Notes: https://github.com/FreeRDP/FreeRDP/releases/tag/3.28.0 — Release notes for the patched version, when published.
- MITRE ATT&CK: https://attack.mitre.org/techniques/T1203/ — "Exploitation for Client Execution" technique page, providing context for this class of client-side exploitation.
- CISA Known Exploited Vulnerabilities Catalog: https://www.cisa.gov/known-exploited-vulnerabilities-catalog — No entry for CVE-2026-63633 at the time of this report (CISA KEV: NO).
Threat Actor Awareness: No known threat actor campaigns have been attributed to this CVE as of this writing. The vulnerability has not been observed in the wild, and no PoC or exploit code has been publicly released. However, the RDP client-side attack vector is an established technique in APT toolkits (e.g., past attacks using malicious RDP servers against outdated clients), and exploitation should be considered plausible within 30-90 days of vulnerability disclosure as reverse-engineers analyze the diff between vulnerable and fixed versions.
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.