원인이 되는 코드가 Node.js 인터널 라이브러리의 JS 였기 때문에
효율적인 동적 분석 환경을 세팅할만한 아이디어가 바로 떠오르지 않았고
우선 정적 분석이라도 해보자 하는 심정으로 코드를 수시간 들여다 본 끝에
lib/streamwritable.js 의 다음 코드가 원인이라는 것을 알아낼 수 있었습니다.
http 모듈에서 encoding 에는 latin1 이 들어가는데 이는 nodejs 의 내부에서 사용되는 UTF16 + UCS-2 인코딩을 latin1 으로 변환하기 위한 과정입니다.
이때 N (\xff\x2e) 에 대해 Buffer.from("N",'latin1') 의 결과는 <Buffer 2e> 로 인코딩 변환 과정에서 첫 번째 바이트가 무시 되고 2e 만이 전송이 되는 것 입니다.
쉽게 말해 Buffer.from 에서 잘못된 방법으로 인코딩 변환을 하는 것이 원인 입니다.
한편, 10.0.0 버전 이후의 http 모듈에서는
if (INVALID_PATH_REGEX.test(path))
throw new ERR_UNESCAPED_CHARACTERS('Request path');
와 같이 정규식 기반으로만 필터링을 하고 있으며 취약점의 근본적인 원인은 여전히 최신버전에 존재하기 때문에
추가적인 연구가 필요한 주제로 생각됩니다.