시큐어 코딩 가이드 · · 2 min read

5. 코드 오류

5.1. Null Pointer 역참조

정의

널 포인터 역참조는 ‘일반적으로 그 객체가 NULL이 될 수 없다’라고 하는 가정을 위반했을 때 발생한다.

공격자가 의도적으로 널 포인터 역참조를 발생시키는 경우, 그 결과 발생하는 예외 상황을 이용하여 추후의 공격을 계획하는 데 사용될 수 있다.

안전한 코딩 기법

  • NULL이 될 수 있는 레퍼런스는 참조하기 전에 NULL 값인지를 검사하여 안전한 경우에만 사용한다.

5.2. 부적절한 자원 해제

정의

프로그램의 자원(fd, heap memory, socket, etc)을 할당받아 사용한 후, 더 이상 사용하지 않는 경우에는 적절히 반환하여야 하는데, 프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우이다.

안전한 코딩 기법

  • 자원을 획득하여 사용한 다음에는 반드시 자원을 해제하여 반환한다.
  • try 구문으로 예외 발생 시 자원 반환

5.3. 해제된 자원 사용

정의

해제한 메모리를 참조하게 되면 예상치 못한 값 또는 코드를 실행하게 되어 의도하지 않은 결과가 발생한다.

안전한 코딩 기법

  • 동적으로 할당된 메모리를 해제한 후 그 메모리를 참조하고 있던 포인터를 참조 추적이나 형 변환, 수식에서의 피연산자 등을 사용하여 해제된 메모리에 접근하도록 해서는 안된다.
  • 메모리 해제 후, 포인터에 NULL 값을 저장하거나 다른 적절한 값을 저장하면 의도하지 않은 코드의 실행을 막을 수 있다.

5.4. 초기화되지 않은 변수 사용

정의

초기화 되지 않은 변수를 사용하게 될 경우 임의값을 사용하게 되어 의도하지 않은 결과를 출력하거나 예상치 못한 동작을 수행할 수 있다.

안전한 코딩 기법

  • 초기화되지 않은 스택 메모리 영역의 변수는 임의값이라 생각해서 대수롭지 않게 생각할 수 있으나 사실은 이전 함수에서 사용되었던 내용을 포함하고 있기 때문에, 공격자는 이러한 약점을 사용하여 메모리에 저장되어 있는 값을 읽거나 특정 코드를 실행할 수 있다.
  • 모든 변수를 사용 전에 반드시 올바른 초기값을 할당함으로서 이러한 문제를 예방한다.