CVE-2025-13670
Executive Summary
CVE-2025-13670 is a DLL planting vulnerability affecting the High Level Synthesis (HLS) Compiler's i++ command on Windows platforms within Xilinx (AMD) Vitis design environments. This vulnerability allows an unauthenticated local attacker to achieve arbitrary code execution in the context of the user invoking the compiler by placing a malicious DLL in a location where the application performs an unsafe dynamic-link library search. The impact is primarily localized to developer workstations, but given the trusted nature of compiler outputs and the potential for supply-chain contamination of IP cores and synthesized bitstreams, the downstream integration risk is significant for organizations deploying AMD/Xilinx FPGA-based systems.
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 i++ command is the command-line front-end for the Vitis High-Level Synthesis Compiler, which converts C/C++ and SystemC designs into register-transfer level (RTL) descriptions. On Windows, the compiler loads a series of dynamic-link libraries (DLLs) for core functionality—including parsing, optimization, and synthesis passes.
The vulnerability stems from an uncontrolled search path element. When the i++ command initializes, it resolves dependencies using the Windows DLL search order, which by default includes the directory from which the application was launched, followed by system directories, the current working directory, and directories specified by the PATH environment variable. If the compiler does not use absolute paths for its dependent libraries, or if it loads plugins from a relative location, an attacker who can plant a file named [insert_dll_name].dll in the current working directory or a user-writable PATH entry will have that DLL loaded instead of the legitimate one.
From a code-level perspective, the issue arises in the dynamic loading functions (e.g., LoadLibrary or LoadLibraryEx without the LOAD_LIBRARY_SEARCH_* flags). Should this be a dlopen-equivalent issue on Windows, it would be identical to classic binary planting. The attack surface is any directory in which a user executes the i++ command. Since HLS workflows often involve batch scripts, Makefiles, and shell scripts that invoke i++ from project directories, an attacker with write access to a shared project repository (e.g., corporate Git server, network share) can stage the malicious DLL.
Post-exploitation, the planted DLL executing within the i++ process inherits the trust context of the invoking user. Because FPGA development often requires administrator privileges for driver installation and board programming, the blast radius frequently escalates to elevated compromise.
Exploitation Scenarios
The following step-by-step attack chain details a realistic exploitation scenario targeting a developer work environment:
Reconnaissance & Target Identification: The attacker identifies a target engineering workstation or a CI/CD build agent used for FPGA development. This is accomplished via internal reconnaissance (e.g., network scanning for Vitis/Xilinx installations, checking file shares for
.xpror.cppfiles referencing Vitis tools) or via social engineering.Weaponization & Delivery: The attacker crafts a malicious DLL. This DLL is compiled to match a predictable library name that
i++will search for (e.g.,hls_std_dll.dll). The DLL exports the function expected by the compiler to avoid immediate errors, but contains a malicious payload in itsDllMainentry point. The attacker gains write access to a directory where the victim will execute thei++command — most commonly the workspace directory cloned from a version-control repository, or a shared network project folder.Trigger & Execution: The victim, either manually or via a build automation script, executes
i++ -compile design.cppfrom within that working directory. The Windows loader searches the application directory first (if not using SafeDllSearchMode), then the current working directory. The malicious DLL is located and loaded before the legitimate one, triggering theDllMainexecution. The payload executes with the privileges of the invoker, establishing persistence (e.g., adding a scheduled task, writing to theRunregistry key).Post-Exploitation & Supply-Chain Impact: The attacker maintains access and exfiltrates design source code (intellectual property embedded in HLS C/C++ code). More critically, the attacker can modify the compiler's output — for example, by injecting hardware Trojans into the generated RTL netlist. The synthesized bitstream is subsequently integrated into a fielded FPGA product. This achieves a "trusted" hardware supply-chain compromise, where the malicious logic is embedded at the silicon configuration level, bypassing software-based security controls in the final product.
Impact Assessment
- Confidentiality Impact: High — The compilation environment contains sensitive intellectual property (HLS source code, algorithm implementations, hardware architectures). A DLL plant allows the attacker to hook file I/O and exfiltrate this data.
- Integrity Impact: High — The attacker can manipulate the compiler, altering the RTL output. This corrupts the integrity of the fabricated hardware, potentially introducing backdoors or deviating from safety-critical specifications.
- Availability Impact: Medium — A poorly written malicious DLL can crash the compiler, leading to failed builds and Denial of Service for the development pipeline.
Affected Systems: All Windows-based workstations and build servers running the Xilinx/AMD Vitis HLS toolchain with the i++ command. Given the lack of a specific version range, all known releases are presumed vulnerable until patched.
Blast Radius: Beyond the direct developer workstation, the blast radius extends to the entire FPGA product lifecycle — from IP core delivery to fabricated hardware. A compromised compiler is a systemic supply-chain risk, far exceeding the local exploit scope. The CVSS score is "N/A" in the data provided, but based on the local attack vector, high privileges, and changes to confidentiality/integrity, a typical scoring would be in the High range (7.0-8.9).
Detection Guidance
Sigma Rule
title: Suspicious DLL Loading by Xilinx Vitis i++ Compiler
id: 3e526a9e-4c9e-4b5f-8c1a-8f7c2a5d1b31
status: experimental
description: Detects non-standard DLL loads associated with the i++ compiler, indicative of DLL planting.
logsource:
category: image_load
product: windows
detection:
selection:
Image|endswith:
- '\i++.exe'
- '\vitis_hls.exe'
ImageLoaded|contains:
- '\Users\'
- '\Temp\'
- '\Public\'
filter:
ImageLoaded|startswith:
- 'C:\Xilinx\'
- 'C:\AMD\'
condition: selection and not filter
level: high
YARA Rule
rule CVE_2025_13670_Xilinx_HLS_Planting
{
meta:
author = "Valtersit Threat Intel"
description = "Detects suspicious DLL exports mimicking Xilinx Vitis HLS libraries"
reference = "CVE-2025-13670"
date = "2025-04-10"
strings:
$s1 = "Vitis HLS" nocase
$s2 = "DllMain" nocase
$s3 = "hls_log" nocase
$s4 = "LoadLibrary" nocase
$pe = { 4D 5A } // MZ header
condition:
$pe at 0 and ( (#s1 >= 2) or (#s2 >= 1 and #s4 >= 1) or (#s3 >= 1) )
}
Suricata IDS Rule
alert tcp any any -> $HOME_NET any (msg:"CVE-2025-13670 Xilinx i++ DLL Plant - Suspicious SMB Traffic"; flow:to_server; content:"|00|i++.exe"; depth:100; content:".dll"; sid:2025136701; rev:1;)
Note: This rule detects file-sharing traffic carrying DLL files named to match compiler dependencies. The rule is intentionally broad; tune based on known internal naming conventions.
Elastic Detection
any where process.name == "i++.exe" and
dll.path : ("C:\\Users\\*", "C:\\Windows\\Temp\\*", "C:\\Public\\*")
Splunk SPL Query
index=sysmon sourcetype=XmlWinEventLog:Microsoft-Windows-Sysmon/Operational EventCode=7
| search Image="*i++.exe" OR Image="*vitis_hls.exe"
| rex field=ImageLoaded "(?<path>(.*\\)[^\\]*$)"
| eval suspicious_path = lower(path)
| where like(suspicious_path, "%users%") OR like(suspicious_path, "%temp%") OR like(suspicious_path, "%public%")
| table _time, host, Image, ImageLoaded, User
Wazuh OSSEC Rule
<group name="syslog,">
<rule id="100255" level="12">
<if_sid>57003</if_sid>
<field name="win.event.eventID">^7$</field>
<field name="win.event.image">.*i\+\+\.exe|.*vitis_hls\.exe</field>
<match>ImageLoaded|Users\\\\Temp|Public</match>
<description>Potential CVE-2025-13670 DLL planting via i++ compiler</description>
<group>attack.t1574,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 2/4 — A single source claims a patch exists, but this is not independently confirmed. Do not assume the latest version is safe without manual verification.
1) Immediate Mitigations (No Patch Dependency):
- Audit developer workstations for infected directory structures. Remove any unknown DLLs from Vitis installation directories and project folders.
- Restrict write access to shared project directories and source-control checkouts. Implement a zero-trust model where compilation runs from clean, ephemeral containers or VMs.
- Enforce the principle of least privilege for developer accounts — prevent compilation from being run with administrator privileges.
- Instruct developers not to open untrusted files (including
.xprprojects or.ziparchives that may extract into a working directory with a poisoned DLL).
2) Patch/Upgrade Steps:
- Contact AMD/Xilinx support directly to query the availability of a security patch for the Vitis HLS compiler. (Vendor Advisory:
https://support.xilinx.com/). - If a patched version is confirmed, update the Vitis installation in its entirety. Verify the checksum of the downloaded installer against AMD's published hashes.
- When the patch is deployed, validate the installation by performing a known compilation run from a clean environment to ensure no regressions.
3) Long-Term Hardening:
- Disable Windows
SafeDllSearchModeexceptions by ensuring theHKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\SafeDllSearchModeis set to1. - Implement application whitelisting (e.g., Windows Defender Application Control) that prohibits DLLs from being loaded from user-writable paths by the
i++process. - Use a hardened build pipeline: execute HLS compilations within Docker containers or sandboxed VMs that lack persistent write access to the host filesystem.
- Regularly scan for DLL planting artifacts using the provided YARA/Sigma signatures and incorporate these into SIEM alerting workflows.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2025-13670
- AMD/Xilinx Security Advisory: https://support.xilinx.com/s/article/000039042 (Vitis HLS Security Bulletin — patch status unconfirmed)
- MITRE ATT&CK — Hijack Execution Flow (T1574): https://attack.mitre.org/techniques/T1574/
- CWE-427 Local DLL Planting Reference: https://cwe.mitre.org/data/definitions/427.html
- Known Campaigns: No active exploitation in the wild has been publicly reported as of this report's writing. The threat is considered theoretical but high-risk due to the supply-chain implications for FPGA-based hardware design.