에러 발생 시 부적절한 처리로 인해 발생하는 취약점을 **Java**와 **Python** 코드를 통해 학습합니다.
개발 환경의 상세한 오류 메시지(스택 트레이스 등)를 사용자에게 그대로 노출하여 시스템 정보를 유출합니다.
/* 취약한 코드 (Java) */
try {
// DB 연결 실패 또는 SQL 구문 오류 발생 가정
connection.createStatement();
} catch (Exception e) {
// 상세 예외 정보를 응답에 포함
response.getWriter().write(e.toString());
}
// -> DB 스키마, 서버 경로 등 상세 정보 노출 위험
/* 안전한 코드 (Java) */
try {
connection.createStatement();
} catch (SQLException e) {
// 1. 상세 내용은 서버 로그에만 기록 (클라이언트에게 전송 금지)
log.error("Database error occurred: ", e);
// 2. 클라이언트에게는 일반적인 메시지만 전달
response.sendError(500, "서비스 처리 중 오류가 발생했습니다.");
}
# 취약한 코드 (Python - Flask/Django 예시)
from flask import jsonify
@app.route('/data')
def get_data():
try:
result = 10 / 0 # ZeroDivisionError 발생 가정
except Exception as e:
# 상세 에러 메시지 직접 반환
return jsonify({'error': str(e)}), 500
# -> "division by zero"와 같은 내부 예외 메시지 노출
# 안전한 코드 (Python - Flask/Django 예시)
import logging
log = logging.getLogger(__name__)
@app.route('/data')
def get_data():
try:
result = 10 / 0
except Exception as e:
# 1. 상세 내용은 서버 로그에 기록
log.error("데이터 처리 중 오류 발생", exc_info=True)
# 2. 사용자에게는 일반 메시지 반환
return jsonify({'error': 'Internal Server Error'}), 500
광범위한 예외를 잡거나, 로그를 남기지 않거나, 적절한 후속 조치 없이 에러를 무시(Swallowing)하여 오류 상황에 대응하지 못합니다.
/* 취약한 코드 (Java) */
try {
fileManager.deleteFile(userFile);
} catch (Exception e) {
// 모든 예외를 잡고 로그 기록 등 아무런 조치도 취하지 않음
// 오류가 발생했지만 프로그램은 정상적으로 계속 실행되어 디버깅 불가
}
/* 안전한 코드 (Java) */
try {
fileManager.deleteFile(userFile);
} catch (SecurityException e) {
// 1. 필요한 특정 예외만 잡고 상세 로그 기록
log.warn("파일 삭제 권한 없음: ", e);
// 2. 적절한 오류 전파 (재시도, 사용자 알림 등)
throw new CustomFileException("권한 문제로 삭제 실패");
} catch (IOException e) {
log.error("파일 I/O 오류 발생: ", e);
}
# 취약한 코드 (Python)
try:
result = calculate_critical_value(data)
except:
# 예외의 종류와 상관없이 모두 무시하고 통과 (except Exception: 보다 더 나쁨)
pass
return default_value
# -> 계산 오류에도 불구하고 기본값 반환, 오류 감지 불가능
# 안전한 코드 (Python)
import logging
log = logging.getLogger(__name__)
try:
result = calculate_critical_value(data)
except ZeroDivisionError as e:
# 1. 특정 예외만 잡고 로그 기록
log.warning(f"계산 중 0 나누기 오류 발생: {e}")
result = 0 # 2. 안전한 기본값 설정
except Exception as e:
# 3. 예상치 못한 예외는 상세 로그 기록 후 재전파
log.error("알 수 없는 오류 발생", exc_info=True)
raise