[정보처리기사 필기] 소프트웨어 개발 보안 구축 - 150. 코드 오류

1. 코드 오류의 개요

  • 소프트웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운 형 변환, 자원 반환 등의 오류를 예방하기 위한 보안 점검 항목들
  • 코드 오류로 발생할 수 있는 보안 약점 : 널 포인터 역참조, 부적절한 자원 해제, 해제된 자원 사용, 초기화되지 않은 변수 사용

2. 널 포인터 Null Pointer 역참조

  • 널 포인터가 가리키는 메모리에 어떠한 값을 저장할 때 발생하는 보안 약점
  • 많은 라이브러리 함수들이 오류가 발생할 경우 널 값을 반환, 이 반환 값을 포인터로 참조하는 경우 발생
  • 대부분의 운영체제에서 널 포인터는 메모리의 첫 주소를 가리키며, 해당 주소를 참조할 경우 소프트웨어가 비정상적으로 종료될 수 있음
  • 공격자가 널 포인터 역참조로 발생하는 예외 상황을 악용할 수 있음
  • 널 포인터 역참조를 방지하는 방법 : 널이 될 수 있는 포인터를 이용하기 전에 널 값을 갖고 있는지 검사
  • 스택가드 Stcak Guard
    • 널 포인터 역참조와 같이 주소가 저장되는 스택에서 발생하는 보안 약점을 막는 기술 중 하나
      • 널 포인터 : 포인터에 널이 지정되어 어떠한 곳도 가리키지 못하는 상태의 요소
    • 메모리상에서 프로그램의 복귀 주소와 변수 사이에 특정 값을 저장한 후 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 프로그램 실행을 중단함으로써 잘못된 복귀 주소의 호출을 막는 기술

3. 부적절한 자원 해제

  • 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때 발생하는 보안 약점
  • 힙 메모리, 소켓 등의 유한한 시스템 자원이 계속 점유하고 있으면 자원 부족으로 인해 새로운 입력을 처리하지 못할 수 있음
    • 힙 메모리 Heap Memory : 소프트웨어가 자유롭게 사용할 수 있는 메모리 공간
    • 소켓 Socket : 데이터 교환을 위한 통로
  • 부적절한 자원 해제를 방지하는 방법 : 프로그램 내에 자원 반환 코드가 누락되었는지 확인, 오류로 인해 함수가 중간에 종료되었을 때 예외처리에 관계없이 자원이 반환되도록 코딩

4. 해제한 자원 사용

  • 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점
  • 반환된 메모리를 참조하는 경우 예상하지 못한 값 또는 코드를 수행하게 되어 의도하지 않은 결과가 발생할 수 있음
  • 해제한 자원 사용을 방지하는 방법 : 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화

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

  • 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안 약점
  • 변수가 선언되어 메모리가 할당되면 해당 메모리에 이전에 사용하던 내용이 계속 남아 있어 변수가 외부에 노출되는 경우 중요정보가 악용될 수 있음
  • 초기화되지 않은 변수 사용을 방지하는 방법 : 할당된 메모리를 초기화함으로써 방지할 수 있음