설명
noAssert 인수는 Node.js 10에서 Buffer 숫자 읽기·쓰기 API에서 제거되었습니다. 최신 Node.js에서는 추가 인수로 true를 전달해도 경계 검사가 비활성화되지 않으므로 이 호출 형태만으로 버퍼 오버플로우가 발생하지 않습니다. 현재 API 시그니처에 없는 인수를 전달하는 코드 품질 문제(CWE-685)입니다. 함수 자체는 현재도 유효합니다.
잠재적 영향
- 제거된 인수가 경계 검사를 제어한다고 오해해 코드 검토와 유지보수가 어려워질 수 있습니다.
- Node.js 10 미만의 레거시 런타임과 최신 런타임에서 호출 의도가 다르게 해석될 수 있습니다.
해결 방법
- 제거된
noAssert인수를 생략하고 현재 Buffer API 시그니처를 사용하세요. - 오프셋과 길이는 호출 전에 명시적으로 검증하세요.
- Node.js 10 미만을 지원해야 한다면 런타임별 동작 차이를 별도로 문서화하세요.
예시
변경 전
javascript
const buf = Buffer.alloc(8);
// 최신 Node.js에서는 제거되어 의미가 없는 세 번째 인수
buf.writeInt32LE(1234, 0, true);
변경 후
javascript
const buf = Buffer.alloc(8);
const offset = 0;
if (offset < 0 || offset + 4 > buf.length) {
throw new RangeError('invalid buffer offset');
}
buf.writeInt32LE(1234, offset);
설명:
- 변경 전: 제거된
noAssert인수를 계속 전달해 경계 검사 동작과 런타임 호환성을 오해하게 만듭니다. - 변경 후: 현재 API 시그니처를 사용하고 오프셋 범위를 명시적으로 확인합니다. 최신 Buffer API도 범위를 벗어난 접근에는 예외를 발생시킵니다.