문제 요약

cbvprintf_package()에서 %.*s 포맷 사용 시 precision specifier를 무시하고 strlen()을 호출. null-terminated가 아닌 문자열에서 힙 버퍼 오버플로(out-of-bounds read) 발생.

원인 분석

lib/os/cbprintf_packaged.c의 포맷 문자열 파싱에서 '.''*'를 별도로 처리하지만, '*'로 소비한 precision 정수 값을 저장하지 않음. 이후 's' 처리 시 precision 정보 없이 strlen(s)를 호출하여 할당된 버퍼를 넘어서 읽음.

영향받는 코드:

  • Sizing pass (L676): len += strlen(s) + 1 + 1;
  • Copy pass (L792): size = strlen(s) + 1;

재현

macOS + Apple Clang + AddressSanitizer로 핵심 동작을 독립 재현:

char *str = malloc(10);
memcpy(str, "Actual log", 10); /* null 종료 없음 */
strlen(str);                   /* cbvprintf_package L676과 동일한 호출 */
=R0=Ex6A68D04#21o008f0=i0=sn0Ei0Rzs0Ret0OrfR1la:1eniAasdtdlr0oexcs6as0tS2ea0dn0i00t0i0bz0ye0trfe:ashtaehfartpee-arbdu1fT0f0-ebry-toeverrefglioowno[n0xa6d0d2r0e0s0s0000x06f002,000x0600020000f0a0000fa)

10바이트 버퍼에서 11바이트를 읽으려 하여 OOB 발생. 이슈에서 보고된 에러 패턴과 동일.

수정 방향

항목BeforeAfter
precision 추적없음 ('.', '*' 값 버림)has_precision / str_precision 변수로 추적
문자열 길이 계산strlen(s)strnlen(s, precision) (precision 존재 시)

활동 로그

  • 2026-02-27: 이슈 분석. 독립 ASAN 테스트로 OOB 재현 확인. 이슈에 root cause analysis 코멘트 작성.