기본 콘텐츠로 건너뛰기

라벨이 readline인 게시물 표시

"NUL Byte" Breaks C: Fixing PyOS_StdioReadline OOB Reads in CPython

"입력 한 글자"가 C를 깨는 순간: PyOS_StdioReadline NUL 바이트 OOB-read 패치를 실무에 연결하기 meta_description: CPython PR 하나가 보여준 건 거창한 기능이 아니라 입력 종단 규약이었다. PyOS_StdioReadline 경로에서 NUL 바이트로 발생할 수 있었던 out-of-bounds read 패치를 계기로, C 경계면 입력 처리와 회귀 테스트를 실무 관점으로 정리한다. meta_keywords: CPython, Python, PyOS_StdioReadline, readline, stdin, NUL byte, null character, OOB read, out of bounds, memory safety, C boundary, REPL, parser, fuzzing, regression test, input handling, buffer, terminator meta_robots: index,follow REPL은 안전하다고 착각하기 쉬운 영역이다. 화면엔 프롬프트가 뜨고, 우리는 키보드로 한 줄을 치고, 인터프리터가 그걸 처리한다. 그래서 마음속에는 이런 전제가 깔린다. “입력은 그냥 문자열이다.” 그런데 C 레벨에서 입력은 “문자열”이기 전에 “버퍼”이고, 버퍼는 “길이”와 “종단(끝)”을 어떻게 해석하느냐로 안전성이 갈린다. 이번에 머지된 CPython PR(gh-140594, PR #140910)은 그걸 아주 짧게 보여준다. PyOS_StdioReadline 경로에서 NUL 바이트(\0)가 들어올 때 out-of-bounds read로 이어질 수 있는 틈을 메웠다(참고자료). 여기서는 영향 범위를 단정하지 않는다. 대신 PR이 고친 “입력 경계면”을 기준으로, 왜 NUL 한 글자가 메모리 안전 문제로 이어질 수 있는지, 그리고 비슷한 경계면을 가진 우리 코드에 어떤 테스트를 추가하면 좋은지에 집중한다. NUL 바이트는 ‘문자’가 아니라 ‘종...