セキュリティ研究者のYannick Dixken氏は、攻撃者がプリンターのメインコントローラー上でフルリモートコード実行(RCE)を達成できるPrusa 3Dプリンターのファームウェアにおける一連の欠陥を発見しました。最も深刻な欠陥として特定されたPFB-008は、Prusa Connectサービスにおけるスタックオーバーフローに起因するもので、特別に細工されたネットワークコマンドによって引き起こされる可能性があります。

コンピュータ上で実行されているリモートコード実行の成功を示すスクリーンショット。
リモートコード実行を正常に達成した研究者の概念実証コード。dixken.de

このスクリーンショットは、リモートコード実行を達成した研究者の概念実証を示しています。

手法と発見

Dixken氏は、自動ファジングと手動リバースエンジニアリングを組み合わせて、MK4Sプリンターのファームウェアを1週間にわたり分析しました。このプロセスでは、クラッシュを特定するためにAddressSanitizerを使用してファームウェアのパーサーコードをコンパイルし、物理的なハードウェアを攻撃する前にCortex-Mエミュレータを使用して制御フローを証明しました。

研究者は、G-codeのパースパスおよびPrusa ConnectのHTTPリクエストに対して、数百万回の変異イテレーションを実行しました。この体系的なアプローチにより、ファームウェアのネットワーク、USB、およびメモリ管理システム全体にわたる14件の発見と、約23件の個別の欠陥が発見されました。

「長いSEND_FILE_INFOパスがConnectタスクのスタックをオーバーフローさせ、制御された、または傍受されたConnectエンドポイントから攻撃者のコードを実行する」

— Never gonna print you up!

Prusa Connectのスタックオーバーフロー

最も重要な発見であるPFB-008は、Prusa Connectを介して送信される`SEND_FILE_INFO`コマンドに関連しています。コントローラーのハンドラは、コマンドのパスを共有の512バイトバッファにコピーします。コードはこのコピーをバッファサイズで制限していますが、パス文字列が104バイトを超えないことを前提としています。

リリースビルドでは、この104バイトの制限を強制する`assert()`がコンパイルから除外されています。この制限を超えるパスは、ファイル名のスロットをバッファの末尾から押し出し、コマンドプランナーによって使用されるポインタへと到達します。ファームウェアにはスタックカナリアや`_FORTIFY_SOURCE`による保護がないため、攻撃者はポインタを上書きし、プリンターの実行フローを自身のコードへとリダイレクトさせることが可能になります。

エラーダイアログの上にRick Astleyのビデオフレームが表示されているPrusa 3Dプリンターのディスプレイ。
エクスプロイトが正常に実行された後のMK4Sプリンターのディスプレイ。Rick Astleyのビデオフレームが表示されています。dixken.de

この画像は、プリンターのハードウェアディスプレイ上で実行されたエクスプロイトの視覚的な結果を示しています。

その他の脆弱性と影響

RCE以外にも、Dixken氏はUSBベースのスタックオーバーフロー(PFB-007)や、暗号化されたG-codeヘッダーにおけるヒープバッファオーバーラン(PFB-013)を含む複数の問題を特定しました。後者の脆弱性は、プリンターがUSBメモリからプリントプレビューをスキャンする際に、攻撃者がオーバーフローの長さと内容の両方を選択できることを可能にします。

その他の発見には、認証されていないホストがEthernet受信プールを占有し、PrusaLinkやmDNSなどのすべてのネットワークサービスを停止させるネットワークベースのサービス拒否(PFB-012)が含まれます。これらの脆弱性は、リモート管理のためにPrusa Connectを利用するユーザーや、ファイル転送のためにUSBメモリを使用するユーザーに影響を与えます。

修正と現状

Prusaは研究者と協力し、公式のセキュリティアドバイザリーとともにこれらの発見を公開しました。特定されたすべての欠陥はBuddyファームウェアのバージョン7.0.0で修正されています。研究者はこれらの発見に対してCVEの割り当てを要求しており、現在は保留中です。