
CVE-2026-86547에 대한 독립 실행형 개념 증명으로, mrubyc op_enter()의 4.0.0까지의 NULL 포인터 역참조 취약점입니다.
OP_ENTER NULL 포인터 역참조CVE-2026-86547에 대한 독립 실행형 개념 증명으로, 릴리스 4.0.0까지의 mrubyc op_enter() 핸들러에서 발생하는 NULL 포인터 역참조입니다.
mrubyc는 임베디드 시스템을 위한 경량 Ruby 구현입니다. 이의 바이트코드 VM은 현재 호출 프레임 포인터를 mrbc_vm.callinfo_tail에 유지합니다. 최상위 레벨에서 mrbc_vm_begin()은 아직 메서드 호출 프레임이 존재하지 않기 때문에 이 포인터를 NULL로 초기화합니다.
release4.0.0의 취약한 op_enter() 구현에서 핸들러는 vm->callinfo_tail이 NULL인지 먼저 확인하지 않고 callinfo->reg_offset을 읽습니다:
mrbc_callinfo *callinfo = vm->callinfo_tail;
int reg_offset = callinfo->reg_offset;
조작된 .mrb 바이트코드 프로그램은 최상위 레벨에 OP_ENTER를 배치할 수 있으며, 이로 인해 인터프리터가 NULL callinfo_tail을 가진 상태에서 이 코드에 도달하여 NULL 포인터 역참조를 통해 충돌합니다.
CVE: CVE-2026-86547
유형: CWE-476 — NULL 포인터 역참조
영향: 가용성 / 서비스 거부
영향받는 버전: mrubyc 4.0.0까지
심각도: 중간, CVSS 6.9 (권고 기준)
이 PoC는 관련된 mrbc_callinfo 및 mrbc_vm 레이아웃을 모방하고 전체 mrubyc 런타임과 독립적으로 취약한 메모리 접근을 재현합니다.
두 가지 경로를 보여줍니다:
callinfo_tail이 NULL이고 callinfo->reg_offset이 가드 없이 역참조되어 세그멘테이션 폴트가 발생합니다.OP_ENTER를 안전하게 거부하며, 이어서 유효한 호출 프레임이 여전히 작동함을 보여주는 제어 테스트가 수행됩니다.이 하네스는 취약한 포인터에 volatile을 사용하고 설명에 __builtin_trap()을 사용하여 재현기를 새니타이저 기반 관찰에 적합하게 만듭니다. 실제 취약한 접근은 callinfo->reg_offset 읽기입니다.
gcc -O0 -g -o poc poc.c
./poc
취약한 경로에서 예상되는 결과는 다음 이후의 세그멘테이션 폴트입니다:
[VULNERABLE PATH] op_enter without NULL guard
vm->callinfo_tail = NULL (top-level frame)
About to dereference NULL...
gcc -O0 -g -fsanitize=address -fno-omit-frame-pointer -o poc-asan poc.c
./poc-asan
새니타이저는 NULL mrbc_callinfo 베이스로부터 reg_offset 필드에 해당하는 주소에서 SEGV를 보고해야 합니다. 여기서 사용된 구조체 레이아웃에서 offsetof(mrbc_callinfo, reg_offset)는 0x14입니다.
./poc fixed
예상 출력은 다음을 포함합니다:
[FIXED PATH] op_enter with NULL guard
[GUARD] top-level OP_ENTER — rejected safely
[control, valid frame] reg_offset = 5
Fixed path: no crash.
원래 취약한 핸들러는 mrubyc release4.0.0의 src/vm.c에 있으며, 약 1537번째 줄에 있습니다. 관련 작업은 NULL 검사 없이 vm->callinfo_tail을 callinfo에 할당한 후 callinfo->reg_offset을 직접 역참조하는 것입니다.
연구에서 참조된 수정 후 소스는 커밋 4261cf5e5ae5579e3110dab98a04b91c7d919429입니다.
독립 실행형 하네스는 근본적인 메모리 오류를 보여줍니다. mrubyc 자체에서 트리거는 메서드 정의 외부의 최상위 레벨에 OP_ENTER 명령어를 포함하는 조작된 .mrb 바이트코드 파일을 필요로 합니다. 애플리케이션이 신뢰할 수 없는 .mrb 파일을 로드하고 실행하는 경우, 공격자가 제어하는 바이트코드 파일이 인터프리터 프로세스를 충돌시킬 수 있습니다.
이는 서비스 거부 조건입니다. 이 연구는 NULL 역참조를 넘어서는 코드 실행, 정보 노출 또는 메모리 손상을 주장하지 않습니다.
src/vm.csrc/vm.cop_enter() 감사를 촉발한 관련 OP_SUPER NULL 검사 문제발견 이야기는 다음에 문서화되어 있습니다: I Read Someone Else's Bug Report, Then Found The Same Missing Check In The Next Function Over.
핵심 연구 관찰은 op_super()가 동일한 vm->callinfo_tail 불변성 주변에 NULL 가드가 누락되어 있었다는 것입니다. 인접한 op_enter() 핸들러를 확인한 결과 동일한 가정이 해당 가드 없이 존재한다는 것이 드러났습니다.