버퍼 경계 초과 접근 (Buffer Overflow)

Improper Restriction of Operations within the Bounds of a Memory Buffer

설명

버퍼 관련 API 사용 시 noAssert 옵션을 true로 설정하면, 버퍼의 경계를 검사하지 않습니다. 이로 인해 읽기 또는 쓰기가 버퍼 범위를 벗어날 수 있고, 심각한 보안 문제(메모리 훼손, 예기치 않은 동작, 데이터 유출 등)를 초래할 수 있습니다.

잠재적 영향

  • 버퍼 초과 접근(버퍼 오버플로우): 버퍼의 경계를 벗어난 메모리 접근으로 메모리 훼손 또는 악의적 코드 실행 가능

  • 데이터 변조 또는 유출: 보호되어야 할 메모리 영역이 노출되거나 변조될 수 있음

해결 방법

  • Buffer API 사용 시 noAssert 옵션을 항상 false 또는 생략하여 기본 경계 검사가 수행되도록 합니다.

  • 사용자 입력값(오프셋, 길이 등)에 대한 별도의 검증도 추가합니다.

  • 신뢰하지 않는 데이터로부터 오프셋이나 길이를 절대 직접 사용하지 않습니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

// 취약한 코드 예시
let buf = Buffer.alloc(8);
// noAssert를 true로 설정하여 경계 체크를 하지 않음
buf.writeInt32LE(1234, 10, true); // 10이 버퍼 길이를 넘어섬
buf.readUInt8(20, true); // 존재하지 않는 메모리 접근

안전한 코드

설명:

  • 취약한 코드: noAssert 옵션을 true로 설정하면 버퍼의 경계를 검사하지 않으므로, 오프셋 값이 잘못되어 버퍼를 벗어나는 메모리에도 접근할 수 있습니다. 이로 인해 예상치 못한 동작이나 심각한 보안 취약점이 발생할 수 있습니다.

  • 안전한 코드: noAssert 옵션을 생략하거나 false로 설정하면 Buffer API가 자동으로 경계 검사를 수행하여, 오프셋이 버퍼 범위를 넘어설 경우 예외가 발생합니다. 이에 따라 보안 취약점 발생 가능성을 줄일 수 있습니다.

참조

Last updated