메뉴 건너뛰기

app

CWE-754: 시스템 안정성을 위협하는 부적절한 예외 처리

suritam92026.01.17 12:10조회 수 1댓글 0

    • 글자 크기

1. 광범위한 예외 처리가 초래하는 보안 및 운영 문제

Exception이나 Throwable 같은 최상위 클래스로 모든 예외를 한 번에 잡아버리는 광범위한 예외 처리는 코드 작성을 편하게 만들지만, 실제 운영 환경에서는 심각한 문제를 야기합니다. 가장 큰 문제는 시스템의 내부 상태를 알 수 없게 만드는 정보의 은폐입니다. 예외가 발생했을 때 구체적인 원인을 구분하지 못하면 적절한 복구 로직을 실행할 수 없습니다. 또한, 예기치 못한 런타임 에러까지 모두 정상 흐름으로 삼켜버릴 경우, 시스템이 비정상적인 상태로 계속 동작하다가 더 큰 장애나 데이터 오염으로 이어지는 연쇄 효과를 낳을 수 있습니다.

2. 예외 처리의 세분화와 보안성 강화

보안과 안정성을 모두 잡기 위해서는 발생 가능한 예외를 유형별로 세분화하여 처리해야 합니다. XML 파싱 과정을 예로 들면, XML 문법이 틀린 경우(SAXParseException), 리소스가 없는 경우(IOException), 보안 설정에 의해 거부된 경우(SecurityException)를 각각 분리해야 합니다. 이렇게 세분화된 처리를 통해 각 상황에 맞는 명확한 로그를 남길 수 있으며, 사용자에게는 시스템 내부 정보를 노출하지 않는 정제된 에러 메시지만을 전달하여 CWE-209(에러 메시지를 통한 정보 노출) 취약점까지 동시에 예방할 수 있습니다.

3. 실무적 대안: 계층적 예외 처리 구조

현실적으로 모든 예외를 일일이 정의하기 어렵다면 계층적 구조를 활용하는 것이 합리적입니다. 먼저 비즈니스 로직에서 예상되는 구체적인 예외들을 상단에서 개별적으로 catch하여 처리하고, 마지막 단계에서 예상치 못한 장애를 방지하기 위해 광범위한 예외 처리를 배치하는 방식입니다. 이는 시스템이 예외 상황에서도 완전히 중단되지 않도록 보장하는 최후의 보루 역할을 합니다. 즉, 무조건적인 광범위 처리는 지양해야 하지만, 세분화된 처리 이후에 배치하는 광범위 예외 처리는 시스템 가용성 측면에서 반드시 필요한 전략이기도 합니다.

 

4. CWE-754 대응 및 XML 보안 적용 자바 코드 예시

import javax.xml.parsers.DocumentBuilderFactory;

import org.xml.sax.SAXParseException;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.File;

import java.io.IOException;

 

public class XmlSecurityProcessor {

    private static final Logger logger = LoggerFactory.getLogger(XmlSecurityProcessor.class);

 

    public void processXmlSafe(File xmlFile) {

        try {

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

            

            // CWE-112: 무결성 검증 설정

            factory.setNamespaceAware(true);

            factory.setValidating(true);

            factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema");

            factory.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", new File("universal.xsd"));

            

            // CWE-611: XXE 공격 방어 설정

            factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

 

            factory.newDocumentBuilder().parse(xmlFile);

            logger.debug("XML parsing and validation successful.");

 

        } catch (SAXParseException e) {

            // 세분화된 예외 처리: XML 구조 및 스키마 위반

            logger.debug("XML validation error: {}", e.getMessage());

            

        } catch (IOException e) {

            // 세분화된 예외 처리: 파일 접근 및 I/O 오류

            logger.debug("I/O error processing XML file: {}", e.getMessage());

            

        } catch (Exception e) {

            // 최후의 보루: 예상치 못한 광범위 예외 처리

            // 시스템 가용성을 위해 서비스 중단을 방지하며 로그를 기록

            logger.debug("Unexpected system error occurred: {}", e.getMessage());

        }

    }

}

 

코멘트: CWE-754 조치의 핵심은 단순히 모든 예외를 나누는 데 있지 않습니다. 운영 환경에서 시스템이 예기치 않게 종료되지 않도록 관리하는 것 또한 보안의 중요한 요소인 가용성(Availability)에 해당합니다. 따라서 앞단에서 상세한 예외 처리를 통해 원인을 파악하되, 가장 마지막 블록에 광범위 예외 처리를 배치하여 알 수 없는 오류로부터 서비스를 보호하는 설계가 실무적으로 가장 권장됩니다.

    • 글자 크기
CWE-489: 시스템 내부를 노출하는 제거되지 않은 디버그 코드 (by suritam9) [CWE-116 분석] 부적절한 출력 인코딩: 왜 ${var}보다 <c:out>이 안전한가? (by suritam9)

댓글 달기

첨부 (0)
위로