본문 바로가기
소프트웨어(SW) 보안약점 진단원/구현단계 보안약점 제거 기준

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

by 브루노W 2025. 6. 4.
유형 에러처리
보안약점 오류 메시지 정보노출
개요
응용프로그램이 실행환경, 사용자 등 관련 데이터에 대한 민감한 정보를 포함하는 오류 메시지를 생성하여 외부에 제공하는 경우, 공격자의 악성 행위를 도울 수 있다.
예외발생 시 예외이름이나 스택 트레이스를 출력하는 경우, 프로그램 내부구조를 쉽게 파악할 수 있기 때문이다.
보안대책
오류 메시지는 정해진 사용자에게 유용한 최소한의 정보만 포함하도록 한다.
 
소스코드에서 예외상황은 내부적으로 처리하고 사용자에게 민감한 정보를 포함하는 오류를 출력하지 않도록 미리 정의된 메시지를 제공하도록 설정한다.
진단방법
해당 취약점에서 시스템 환경, 유저정보, 민감한 정보 등에 대한 기준을 정적도구가 판단하기 어려움에 따라 진단원이 출력함수 등으로 외부에 출력되는 값 중 민감한 정보 등을 판단할 필요가 있다.
 
오류메시지를 출력하는 경우 해당 오류에 시스템 환경, 유저정보, 데이터 등 민감한 정보가 포함되어 있는지 확인한다.
연관된 설계단계 기준 -

 

코드예제

 

● 안전하지 않은 코드 예 (Java)

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

 

● 안전하지 않은 코드 예 (Java)

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

 

● 안전한 코드 예 (Java)

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

 

 

● 안전하지 않은 코드 예 (C#)

try {
	//do something
} catch (CustomException e) {
	Console.WriteLine(e);
}

 

● 안전한 코드 예 (C#)

● 안전한 코드 예 (C#)
try {
	//do something
} catch (CustomException e) {
	_log.Debug("ERROR-01 : error information");
}

 

 

진단방법
 
해당 취약점에서 시스템 환경, 유저정보, 민감한 정보 등에 대한 기준을 정적도구가 판단하기 어려움에 따라 진단원이 출력함수 등으로 외부에 출력되는 값 중 민감한 정보 등을 판단할 필요가 있다.
 
오류메시지를 출력하는 경우(①) 해당오류에 시스템 환경, 유저정보, 데이터 등 민감한 정보가 포함되어 있는지 확인한다.

 

 

● 일반적인 진단의 예

public static void main(String[] args) {
    String urlString = args[0];
    try {
        URL url = new URL(urlString);
        URLConnection cmx =
        url.openConnection();
        cmx.connect();
    } catch (Exception e) {
    	e.printStackTrace(); ····················①
    }
}

 


● 정탐코드

<%@ page language="java" contentType="text/html; charset=UTF-8" buffer="none"%>
<%@page import="egovframework.com.utl.fda.ucc.service.EgovUnitCalcUtil" %>
<%
    String sCmd = request.getParameter("cmd") == null ? "" : (String) request.getParameter("cmd");
    double nResult=0.0;
    try {
        if(!sCmd.equals("")) {
            EgovUnitCalcUtil egovUnitCalcUtil= new EgovUnitCalcUtil();
            ….
        }
        ……
    } catch(Exception e) {
    	e.printStackTrace();
    }
%>

오류 메시지로 환경, 사용자, 관련 데이터 등의 내부 정보가 유출될 경우 취약하다.

 

 

● 오탐코드

BufferedReader br = null;
try {
    br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));
    String line = null;
    while ((line = br.readLine()) != null) {
        // …
    }
} catch (IOException e) {
    logger.error(e, e);
} finally {
    if (br != null) {
    	try {
    		br.close();
    	} catch (IOException e) {
    		logger.error(e, e);
    	}
    }
}

오류 메시지로 환경, 사용자, 관련 데이터 등의 내부 정보가 유출될 경우 취약하다.