CVE-2025-1047
Executive Summary
CVE-2025-1047 is a critical remote code execution vulnerability in Luxion KeyShot, a professional 3D rendering and animation application. The flaw resides in the parsing of PVS (KeyShot scene) files, where an uninitialized pointer is accessed before proper initialization. An attacker can exploit this by convincing a user to open a malicious PVS file or visit a malicious page that triggers the parsing routine. Successful exploitation allows arbitrary code execution in the context of the current user process, with a CVSS score of 7.8 (High). No public proof-of-concept, exploit code, or patch is currently available. The vulnerability was reported via the Zero Day Initiative (ZDI-CAN-23694).
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 NPM, PyPI, Go, or Ruby packages. It affects a standalone desktop application (Luxion KeyShot) distributed via official vendor channels. Users should verify the integrity of downloaded KeyShot installers and PVS files from untrusted sources.
CVSS Breakdown & Threat Level
- CVSS Score: 7.8 (High)
- Vector: CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
- Attack Vector: Local (requires user to open a malicious file)
- Attack Complexity: Low
- Privileges Required: None
- User Interaction: Required (victim must open the file)
- Scope: Unchanged
- Confidentiality Impact: High
- Integrity Impact: High
- Availability Impact: High
Threat Level: High. Although user interaction is required, the lack of a patch and the potential for code execution in a widely used 3D design tool makes this a significant threat for targeted attacks.
Deep Dive & Mechanics
The vulnerability is a classic Access of Uninitialized Pointer (CWE-824). When KeyShot parses a specially crafted PVS file, it allocates a pointer variable but fails to initialize it before use. The parser then dereferences this pointer, leading to a read or write operation at an attacker-controlled memory location.
Technical Flow:
- The PVS file format contains various chunks and data structures.
- During parsing, a pointer is declared but not set to NULL or a valid address.
- The attacker crafts a PVS file where the uninitialized pointer is later used in a memory operation (e.g.,
memcpy,free, or function call). - By controlling the contents of the uninitialized memory (e.g., via heap spraying or prior allocations), the attacker can redirect execution to arbitrary code.
Root Cause: Lack of proper initialization of a pointer variable in the PVS parsing code. This is a common programming error in C/C++ applications where stack or heap variables are not zeroed before use.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical example of the vulnerable pattern and a secure fix.
Vulnerable Code (C++):
void ParsePVSFile(const char* filename) {
FILE* file = fopen(filename, "rb");
if (!file) return;
char* buffer;
// BUG: buffer is not initialized
// buffer = NULL; // missing initialization
size_t size = ReadFileSize(file);
buffer = (char*)malloc(size);
fread(buffer, 1, size, file);
// Later use of buffer without checking if allocation succeeded
ProcessData(buffer);
free(buffer);
fclose(file);
}
Patched Code (Hypothetical):
void ParsePVSFile(const char* filename) {
FILE* file = fopen(filename, "rb");
if (!file) return;
char* buffer = NULL; // Proper initialization
size_t size = ReadFileSize(file);
buffer = (char*)malloc(size);
if (!buffer) {
fclose(file);
return; // Handle allocation failure
}
fread(buffer, 1, size, file);
ProcessData(buffer);
free(buffer);
fclose(file);
}
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- Luxion KeyShot installed (any version with the vulnerability).
- A malicious PVS file crafted to trigger the uninitialized pointer.
Exploitation Steps:
- Craft the PVS file: Use a hex editor or custom tool to modify a legitimate PVS file. Overwrite specific chunks to cause the parser to use an uninitialized pointer. The attacker must control the memory layout (e.g., via heap spray) to place shellcode at the dereferenced address.
- Deliver the file: Send the malicious PVS file via email, download link, or USB drive.
- Trigger: The victim opens the file in KeyShot. The parser executes the vulnerable code path, leading to code execution.
Example Payload (Shellcode):
; x86-64 Windows calc.exe shellcode (example)
xor rcx, rcx
push rcx
mov rcx, 0x6578652e636c6163 ; "calc.exe"
push rcx
mov rcx, rsp
mov rdx, 0x0000000000000000
mov r8, 0x0000000000000000
mov rax, 0x0000000000000000
call rax
Note: No public exploit code is available. This is a theoretical approach.
Blue Team (Defense)
Detection & Prevention:
- User Awareness: Train users not to open PVS files from untrusted sources.
- Application Sandboxing: Run KeyShot in a sandboxed environment (e.g., Windows Sandbox, Firejail) to limit impact.
- Memory Protection: Enable ASLR, DEP, and CFG (Control Flow Guard) on Windows.
- File Scanning: Use antivirus/EDR solutions to scan PVS files for malicious patterns.
- Network Controls: Block downloads of PVS files from unknown domains.
Indicators of Compromise (IOCs)
- File Hashes (SHA256): (None available; placeholder)
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Network Indicators: Connections to IPs/domains hosting malicious PVS files.
- Process Behavior: KeyShot.exe spawning child processes (e.g., cmd.exe, powershell.exe) unexpectedly.
- Registry Changes: Unusual modifications to
HKEY_CURRENT_USER\Software\Luxion\KeyShot. - File System: Creation of new executable files in
%TEMP%or%APPDATA%after opening a PVS file.
Detection Engineering
YARA Rule
rule CVE_2025_1047_KeyShot_PVS_UninitPtr {
meta:
description = "Detects malicious PVS files targeting CVE-2025-1047"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-1047"
strings:
$pvs_magic = { 50 56 53 00 } // "PVS\0" magic bytes
$suspicious_chunk = { 41 42 43 44 } // Example chunk ID
$null_ptr_pattern = { 00 00 00 00 00 00 00 00 } // Uninitialized pointer area
condition:
$pvs_magic at 0 and $suspicious_chunk and #null_ptr_pattern > 2
}
Sigma Rule
title: CVE-2025-1047 KeyShot PVS File Exploitation Attempt
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects suspicious process behavior when KeyShot opens a PVS file
author: Valters IT
date: 2025-04-10
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '\KeyShot.exe'
CommandLine|contains: '.pvs'
filter:
ParentImage|endswith: '\explorer.exe'
condition: selection and not filter
falsepositives:
- Legitimate use of KeyShot with PVS files
level: high
Suricata Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-1047 KeyShot PVS File Download"; flow:to_server,established; content:"PVS"; nocase; fileext:"pvs"; classtype:attempted-user; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable PVS file association: Prevent automatic opening of PVS files in KeyShot.
- Use application whitelisting: Only allow trusted PVS files.
- Monitor for updates: Check Luxion's website for patches (currently none).
Long-Term Fix:
- Apply vendor patch when released.
- Implement code review for pointer initialization in parsing routines.
- Use static analysis tools (e.g., Coverity, Clang Static Analyzer) to detect uninitialized variables.
Workaround:
- Convert PVS files to a safer format (e.g., OBJ, FBX) before opening in KeyShot.
Valters IT
Securing Digital Frontiers
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.