1. 오류 상황 대응 부재의 위험성
CWE-390은 예외가 발생했음에도 불구하고 이를 처리하는 코드 블록이 비어 있거나, 적절한 후속 조치(로깅, 복구, 사용자 알림 등)를 취하지 않을 때 발생합니다. 에러를 단순히 무시(Empty Catch Block)하면 시스템은 내부적으로 심각한 결함이 발생했음에도 정상적으로 동작하는 것처럼 보입니다. 이로 인해 데이터가 유실되거나 시스템이 불안정한 상태로 지속되며, 나중에 더 큰 장애가 발생했을 때 원인 파악을 불가능하게 만듭니다. 보안 측면에서는 공격자의 침투 시도로 인한 에러가 기록되지 않아 침해 사고를 인지하지 못하는 '보안 사각지대'를 형성합니다.
2. 흔히 발생하는 잘못된 패턴: 침묵하는 Catch 블록
가장 대표적인 사례는 try-catch 문을 작성한 뒤 catch 블록 내부에 아무런 코드를 넣지 않거나, 주석 처리만 하고 넘어가는 경우입니다. 개발 단계에서 "나중에 처리하겠지"라고 방치한 코드가 운영 환경까지 남게 되면, 중요한 로직(인증, 데이터 쓰기 등)이 실패해도 호출 측에서는 성공한 것으로 오인하게 됩니다. 이는 앞서 살펴본 CWE-754(부적절한 예외 처리)보다 더 위험한데, 아예 대응 자체가 존재하지 않아 시스템의 가용성과 무결성을 동시에 해치기 때문입니다.
3. 실무적 대응: 최소한의 로깅과 안전한 종료 전략
모든 예외에 대해 완벽한 복구 로직을 짤 수는 없지만, 최소한 로그 기록과 상태 제어는 반드시 이루어져야 합니다. 에러 발생 시 logger.debug() 등을 통해 상황을 상세히 기록하고, 해당 로직을 더 이상 진행하는 것이 위험하다고 판단되면 즉시 중단하거나 호출자에게 에러를 전파해야 합니다. 특히 자원 반납(DB 연결 종료 등)이 필요한 상황이라면 finally 블록이나 try-with-resources를 활용하여 오류 상황에서도 자원이 고갈되지 않도록 관리해야 합니다.
4. CWE-390 대응 및 통합 보안 적용 자바 코드 예시
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class SecureDataProcessor {
private static final Logger logger = LoggerFactory.getLogger(SecureDataProcessor.class);
public void processData(File file) {
// try-with-resources를 사용하여 오류 발생 시에도 자원 자동 반납
try (FileInputStream fis = new FileInputStream(file)) {
// 데이터 처리 로직 수행...
logger.debug("Successfully opened file: {}", file.getName());
} catch (IOException e) {
// [CWE-390 조치] 빈 catch 블록은 절대 금지
// 1. 발생한 예외 상황을 로그에 상세히 기록 (CWE-489 준수)
logger.debug("Critical I/O error during file processing: {}", e.getMessage());
// 2. 오류 상황에 대한 후속 조치 (상태값 변경 또는 상위로 예외 전파)
handleFailureState(e);
} catch (Exception e) {
// [CWE-754] 광범위 예외 처리를 통한 가용성 확보
// [CWE-209] 내부 정보 노출 방지를 위해 정제된 메시지만 로그에 남김
logger.debug("An unexpected error occurred. Processing halted.");
}
}
private void handleFailureState(Exception e) {
// 시스템 무결성을 위해 현재 작업 상태를 'FAIL'로 마킹하거나 알림 발송
logger.debug("Transitioning to error state for safe recovery.");
}
}
코멘트: 예외를 무시하는 것은 발생한 불을 끄지 않고 화재경보기를 꺼버리는 것과 같습니다. CWE-390 대응의 핵심은 "무엇이 잘못되었는지 시스템이 알고 있어야 한다"는 것입니다. logger.debug()를 사용하여 상황을 기록하고, 이후 로직을 안전하게 제어함으로써 시스템의 투명성과 안정성을 동시에 확보하십시오.
댓글 달기