
CVE-2026-56111 の概念実証エクスプロイト。Marlin ファームウェアの M421 G コードハンドラにおける領域外書き込みであり、巧妙に細工された G コードコマンドを介して制約されたメモリ破壊を実証します。
CVE-2026-56111 の概念実証です。これは MESH_BED_LEVELING を使用してビルドされた Marlin Firmware の M421 Gコードハンドラにおける境界外書き込みです。
1f255d1 で修正MBL M421 ハンドラは、I/J インデックスが負でないことだけをチェックします。上限は一切チェックしません。その後、set_z() は境界チェックなしで z_values[ix][iy] = z を書き込みます。グリッドを超えたインデックスは、制御された 32 ビット浮動小数点数を z_values 配列の先を超えて隣接するファームウェア状態に書き込みます。
この書き込みは 制限されており、任意ではありません。ターゲットは z_values + (ix*GRID_Y + iy)*4 バイトで、インデックスは int8_t(最大 127)に制限されているため、到達可能な範囲は z_values の約 2 KB 先までです。値(Z 浮動小数点数)とオフセット(インデックス)を制御できますが、絶対アドレスは制御できません。
このツールは Gコード行を送信するだけです。境界外書き込みはファームウェア内部で発生します。観測可能な影響は、サービス拒否、ファームウェアのクラッシュ、または動作の破損です。正確なメモリ書き込み内容はアドバイザリに記載されており、このツールでは示されません。
gcc -O2 -o exp exploit.c
いずれかのチャネルを選択:
--serial <dev> USB用。例: /dev/ttyUSB0 または /dev/ttyACM0(必要に応じて --baud N を追加; 多くのボードは 250000 を使用)--tcp <host:port> telnet/ネットワーク gcode を公開するプリンター用。例: 192.168.1.50:23選択したインデックスと値で M421 を送信:
./exp --serial /dev/ttyUSB0 write -i 3 -j 0 -z 99.0
./exp --tcp 192.168.1.50:23 write -i 5 -j 0 -z 99.0
デフォルトの 3x3 グリッド(有効なインデックス 0..2)の場合:
-i 3 -j 0 はオフセット 36 バイトに書き込みます。これは z_offset(ベッド Z オフセット)です。-i 5 -j 0 はオフセット 60 バイトに書き込みます。これはパーサーオブジェクトです。範囲外のインデックスと NaN の Z 値を送信します。NaN は動作計算に伝播し、ファームウェアを確実にクラッシュまたはハングさせます。
./exp --serial /dev/ttyUSB0 dos
./exp --tcp 192.168.1.50:23 dos
コミット 1f255d1 を含む Marlin ビルドに更新してください。このコミットは、ABL および UBL ハンドラが既に行っている方法と同じようにインデックスを制限します。
研究および許可されたテストのみを目的としています。所有しているデバイス、またはテストする明示的な許可があるデバイスでのみ使用してください。これらのコマンドを送信すると、プリンターがクラッシュしたり、印刷が中断される可能性があります。