IgnatiusHeo

구현단계 보안약점 제거 기준-오류 메시지 정보노출 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-오류 메시지 정보노출

Ignatius Heo 2023. 7. 6. 14:09

작성일: 230706

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(419~424p)

구분 - 에러처리
설계단계 - 예외처리
https://cryptocurrencyclub.tistory.com/108
개요 응용프로그램이 실행환경, 사용자 등 관련 데이터에 대한 민감한 정보를 포함하는 오류 메시지를 생성하여 외부에 제공하는 경우, 공격자의 악성 행위를 도울 수 있다.

예외발생시 예외이름이나 스택 트레이스를 출력하는 경우, 프로그램 내부구조를 쉽게 파악할 수 있기 때문이다.
진단 세부사항
(설계단계)
 ① 명시적인 예외의 경우 예외처리 블럭을 이용하여 예외 발생 시 수행해야 하는 기능이 구현되어야 한다. 예외 발생을 예방하기 위해 입력값을 검증하고 예외 발생시 예외처리 블록을 이용하여 수행되어야 할 기능이 구현되도록 설계되어 있는지 확인한다.
  ㅇ  Exception 유형별 처리 방법을 정의하고 프로그램 구현시 안전한 처리 방법을 개발가이드에 정의하고 있는지 확인
      - 오류 메시지로 시스템정보가 노출되지 않도록 프로그램이 작성 되어야함
      - 예외 상황에 대해 반드시 처리되도록 프로그램이 작성되어야 함
      - 각 예외 상황에 대해 분리하여 처리하도록 프로그램이 작성되어야 함
  ㅇ  Exception 발생에 대한 로깅 정책이 설계에 반영되었는지 확인
      - Exception 발생 상황에 대해 시간, 이유 등과 같은 내용이 포함되도록 설계되어 있는지 확인
      - 로그에 포함되는 중요정보는 암호화되도록 설계되어 있는지 확인
 
 ② 런타임 예외의 경우 입력값의 범위를 체크하여 애플리케이션이 정상적으로 동작할 수 있는 값만 사용되도록 보장해야 한다. 예외 발생을 예방하기 위해 입력값을 검증하고 예외 발생 시 예외처리 블록을 이용하여 수행 되어야 할 기능이 구현되도록 설계되어 있는지 확인한다.
  ㅇ  예외가 발생 가능한 기능 구현 시 입력데이터에 대한 유효한 입력값의 범위를 검증하여 예외가 발생하지 않도록 개발가이드로 코딩 규칙을 정의하고 있는지 확인
 
 ③ 에러가 발생한 경우 상세한 에러 정보가 사용자에게 노출되지 않게 해야 한다. 에러 발생 시 오류 메시지 정보 또는 중요정보가 노출되지 않도록 설계되어 있는지 확인한다.
  ㅇ  예외 발생 시 스택정보나 중요정보가 외부로 노출되지 않도록 개발가이드에 코딩 규칙이 정의되어 있는지 확인
  ㅇ Exception 발생 시 지정된 에러페이지를 이용하여 사용자에게 예외사항 정보를 제공하도록 서버설정 계획이 설계되어 있는지 확인
      - Exception 발생에 대한 로그가 생성될 수 있도록 서버설정 계획이 설계되어 있는지 확인
보안대책
(구현단계)
오류 메시지는 정해진 사용자에게 유용한 최소한의 정보만 포함하도록 한다.

소스코드에서 예외상황은 내부적으로 처리하고 사용자에게 민감한 정보를 포함하는 오류를 출력하지 않도록 미리 정의된 메시지를 제공하도록 설정한다.
진단방법
(구현단계)
해당 취약점에서 시스템 환경, 유저정보, 민감한 정보 등에 대한 기준을 정적도구가 판단하기 어려움에 따라 진단원이 출력함수 등으로 외부에 출력되는 값 중 민감한 정보 등을 판단할 필요가 있다.

① 오류메시지를 출력하는 경우

해당오류에 시스템 환경, 유저정보, 데이터 등 민감한 정보가 포함되어 있는지 확인한다.

 

다. 코드예제

 

ㅇ 분석

1: try {
2: rd = new BufferedReader(new FileReader(new File(filename)));
3: } catch(IOException e) {
// 에러 메시지로 스택 정보가 노출됨
4: e.printStackTrace();
5: }

1: } catch(IOException e) {
// 오류발생시 화면에 출력된 시스템 정보로 다른 공격의 빌미를 제공한다.
2: System.err.print(e.getMessage());
3: }

ㅇ 내용

1. 직접적인 에러메시지를 출력하지 말고 관련된 정보를 보여줌으로써 정보 노출 최소화

 

ㅇ 수정

1: try {
2: rd = new BufferedReader(new FileReader(new File(filename)));
3: } catch(IOException e) {
// 에러 코드와 정보를 별도로 정의하고 최소 정보만 로깅
4: logger.error("ERROR-01: 파일 열기 에러");
5: }

ㅇ 내용

1. 따로 에러에 대한 식별번호나 코드를 만들어서 분류하는 걸로 보임


ㅇ 분석

1: try
2: {
3: //do something
4: }
5: catch (CustomException e)
6: {
7: Console.WriteLine(e);
8: }

ㅇ 내용

1. 익셉션에 대한 콘솔 내용이 그대로 노출됨

 

ㅇ 수정

1: try
2: {
3: //do something
4: }
5: catch (CustomException e)
6: {
7: _log.Debug(“ERROR-01 : error information”);
8: }

ㅇ 내용

1. 에러코드로 변경

 

 

끝.