
CVE-2026-56111에 대한 개념 증명 익스플로잇으로, Marlin 펌웨어의 M421 G-코드 핸들러에서의 out-of-bounds 쓰기이며, 조작된 G-코드 명령어를 통해 제한된 메모리 손상을 입증합니다.
CVE-2026-56111의 개념 증명으로, MESH_BED_LEVELING으로 빌드된 Marlin Firmware의 M421 G-code 핸들러에서 발생하는 경계 외 쓰기입니다.
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에서 약 2KB입니다. 값(Z 부동소수점)과 오프셋(인덱스)을 제어할 수 있습니다. 절대 주소는 제어할 수 없습니다.
이 도구는 G-code 라인만 전송합니다. 경계 외 쓰기는 펌웨어 내부에서 발생합니다. 관찰 가능한 영향은 서비스 거부, 펌웨어 충돌 또는 모션 손상입니다. 정확한 메모리 쓰기는 이 도구가 아닌 보안 권고에 나와 있습니다.
gcc -O2 -o exp exploit.c
채널을 선택하십시오:
--serial <dev>: USB 사용 시, 예: /dev/ttyUSB0 또는 /dev/ttyACM0 (필요 시 --baud N 추가; 많은 보드에서 250000 사용)--tcp <host:port>: 텔넷/네트워크 G-code를 노출하는 프린터용, 예: 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 핸들러가 이미 수행하는 방식과 동일하게 인덱스를 경계 검사합니다.
연구 및 승인된 테스트 전용입니다. 소유하거나 테스트에 대한 명시적 허가를 받은 장치에서만 사용하십시오. 이러한 명령을 전송하면 프린터가 충돌하거나 인쇄가 중단될 수 있습니다.