소프트웨어 개발보안 가이드 분석(2021) : 오류 메시지 정보노출

응용프로그램이 실행환경, 사용자 등 관련 데이터 또는 시스템의 내부데이터 등 민감한 정보를 포함하는 오류 메시지를 생성하여

외부에 제공하는 경우, 공격자의 악성 행위를 도울 수 있다.

예외 발생 시 예외 이름이나 스택 트레이스를 출력하는 경우, 프로그램 내부구조를 쉽게 파악할 수 있기 때문이다.

소프트웨어 개발보안가이드(2021), 한국인터넷진흥원

 

기본적으로 제공되는 오류 페이지에는 서버 혹은 시스템에 대한 여러 정보를 포함합니다. 보통의 개발자들은 개발하는 과정에서 나타나는 이러한 오류 정보를 통해 오류를 해결합니다. 하지만 개발이 모두 완료된 후 나타나는 오류를 적절하게 처리하지 않는다면 이는 공격자들이 공격을 위한 정보로 활용될 수 있습니다.

이번 포스팅에서는 오류 메시지 정보노출에 대해 알아보고 취약한 코드 예제와 이를 방지하기 위한 안전한 코드 작성 방법을 살펴보려고 합니다.

 

오류 메시지 정보노출이란?

오류메시지를 통한 정보노출
소프트웨어 개발 보안 가이드(행정자치부 / 한국인터넷진흥원)
  • 소프트웨어 개발에서 오류 메시지 정보노출은 사용자에게 발생한 문제에 대한 정보를 제공하기 위한 목적으로 설계되었습니다. 하지만 이러한 정보가 악의적인 공격자에게 시스템의 내부 동작 방식, 데이터베이스 구조, 기술 스택 등의 중요 정보를 노출시킬 수 있는 보안 취약점을 의미합니다.
  • 그렇기 때문에 공격자들은 추가적인 정보를 획득하기 위해 소프트웨어에 오류가 날 수 있도록 여러 작업들을 수행합니다. 위 그림의 예시처럼 "오류를 유발하는 입력값 전달"을 통해 오류를 발생시켜 오류 메시지에 시스템 정보가 노출되는 것을 보면 공격자에게 정보를 제공하는 상황이 됩니다.
  •  

공격 메커니즘

오류 메시지 정보노출 취약점으로 인한 공격 메커니즘은 다음과 같습니다.

  1. 정보 수집 : 공격자는 시스템에서 발생하는 오류 메시지를 통해 중요한 정보를 수집합니다. 이 정보에는 시스템의 내부 동작 방식, 데이터베이스 구조, 기술 스택 등이 포함될 수 있습니다.
  2. 취약점 분석 : 공격자는 수집한 정보를 분석하여 시스템의 취약점을 찾습니다. 예를 들어, 데이터베이스 연결 오류 메시지를 통해 데이터베이스 종류와 버전을 파악하고, 해당 버전에 존재하는 보안 취약점을 이용할 수 있습니다.
  3. 공격 실행 : 공격자는 찾은 취약점을 이용하여 시스템에 공격을 실행합니다. 이를 통해 시스템을 해킹하거나 중요한 정보를 유출하는 등의 악의적인 행위의 결과를 일으킵니다.

 

취약한 웹 애플리케이션의 예

try {
    // 데이터베이스 연결 시도
} catch (SQLException e) {
    e.printStackTrace();
}
  • 위의 코드는 데이터베이스 연결을 시도에 오류를 처리하는 코드입니다.
  • 자바에서는 오류가 발생했을 때 자동으로 생성되는 오류 메시지에 민감한 정보(데이터베이스 종류, 연결 문자열, 사용자 정보 등)를 포함할 수 있습니다.
  • 결과적으로 catch문을 적절히 처리하여 민감한 정보가 노출되지 않도록 처리해야 합니다.

 

시큐어코딩 적용 방법

  • 로그 기록
try {
    // 데이터베이스 연결 시도
} catch (SQLException e) {
    logger.error("데이터베이스 연결 중 오류가 발생했습니다. 관리자에게 문의하세요."); // 민감한 정보 미포함
}
  • 위의 코드는 데이터베이스 연결을 시도에 오류를 처리하는 코드입니다.
  • 다만, 여기서는 로그 레벨이 "error"인 로그를 기록하도록 합니다.
  • 결과적으로 데이터베이스 연결 중에 오류가 발생했다면, 위의 문자열이 로그 파일에 기록될 것입니다. 따라서 개발자나 시스템 관리자는 이 로그를 확인하여 데이터베이스 연결 오류에 대한 문제를 파악하고, 이에 대한 조치를 취할 수 있습니다.
  • 하지만 이는 사용자에게 오류를 알리는 행위가 아닌 관리자나 개발자에게만 보여지는 형태로 동작합니다. 사용자에게 오류 메시지를 표시하는 경우 민감한 정보가 포함되지 않고 최소 정보만 나타내는 별도로 제작된 오류 메시지를 사용자에게 보여야 합니다.

  • 별도의 제작된 오류 페이지 출력
      public ModelAndView handleException() {
   1      ModelAndView modelAndView = new ModelAndView("error");
          try {   
              // 데이터베이스 연결 시도
   2      } catch (SQLException ex) {
              modelAndView.addObject("errorMessage", "데이터베이스 연결 중 오류가 발생했습니다. 관리자에게 문의하세요.");

   3      } catch (Exception ex) {
              modelAndView.addObject("errorMessage", "오류가 발생했습니다. 관리자에게 문의하세요.");
          }

   4      return modelAndView;
      }
  • 1 : 별도로 제작한 오류 페이지인 'error'라는 이름의 view를 사용하여 modelAndView 객체를 생성합니다.
  • 2 : error페이지에 errorMessage를 포함시켜 데이터베이스 연결 오류를 예외처리합니다.
  • 3 : error페이지에 errorMessage를 포함시켜 그외 다른 예외를 처리합니다.
  • 4 : 최종적으로 구성된 modelAndView 객체를 반환합니다.
  • 위의 코드는 별도로 제작된 오류 페이지(error)를 통해 사용자에게 전달됩니다. 이렇게 별도의 페이지를 만들어 민감한 정보를 노출하지 않고 사용자에게 어떤 오류가 발생했는지 알리는 방법이 보안을 강화시킬 수 있습니다.

오류 메시지 정보노출 취약점을 방지하기 위한 보안 대책은 다음과 같은 방법들이 있습니다.

  1. 최소 오류 정보 제공 : 사용자에게 오류 메시지를 표시할 때, 가능한 민감한 정보를 최소화합니다. 또한 오류의 원인과 해결 방법을 간단한 설명을 제공합니다.
  2. 오류 처리 및 로깅 : 오류가 발생했을 때 적절한 오류 처리 메커니즘을 구현하여, 사용자에게 민감한 정보가 노출되지 않도록 합니다. 또한, 로깅 시스템을 통해 오류를 기록할 때에는 민감한 정보를 로그로 남기지 않도록 유의해야 합니다.
  3. 테스트와 검증 : 시스템을 설계하고 개발할 때부터 오류 메시지 노출에 대한 취약점을 고려하여 테스트와 검증을 진행합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 종료되지 않는 반복문 또는 재귀함수
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 오류상황 대응 부재