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

구현단계 보안약점 기준 - 오류상황 대응 부재

브루노W 2025. 6. 4. 22:30
유형 에러처리
보안약점 오류상황 대응 부재
개요
오류가 발생할 수 있는 부분을 확인하였으나, 이러한 오류에 대하여 예외 처리를 하지 않을 경우, 공격자는 오류 상황을 악용하여 개발자가 의도하지 않은 방향으로 프로그램이 동작하도록 할 수 있다.
보안대책
오류가 발생할 수 있는 부분에 대하여 제어문을 사용하여 적절하게 예외 처리(C/C++에서 if와 switch, Java에서 try-catch 등)를 한다.
진단방법
오류가 발생할 수 있는 부분에 대하여 예외처리를 수행했는지 확인하고 제어문으로 예외 처리하는 루틴이 비어있는지 확인한다.
연관된 설계단계 기준 -

 

코드예제

 

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

protected Element createContent(WebSession s) {
    ……
    try {
        username = s.getParser().getRawParameter(USERNAME);
        password = s.getParser().getRawParameter(PASSWORD);
        if (!"webgoat".equals(username) || !password.equals("webgoat")) {
            s.setMessage("Invalid username and password entered.");
            return (makeLogin(s));
        }
    } catch (NullPointerException e) {
        // 요청 파라미터에 PASSWORD가 존재하지 않을 경우 Null Pointer Exception이 발생하고
        // 해당 오류에 대한 대응이 존재하지 않아 인증이 된 것으로 처리
    }
}

 

● 안전한 코드 예 (Java)

protected Element createContent(WebSession s) {
    ……
    try {
        username = s.getParser().getRawParameter(USERNAME);
        password = s.getParser().getRawParameter(PASSWORD);
        if (!"webgoat".equals(username) || !password.equals("webgoat")) {
            s.setMessage("Invalid username and password entered.");
            return (makeLogin(s));
        }
    } catch (NullPointerException e) {
        // 예외 사항에 대해 적절한 조치를 수행하여야 한다.
        s.setMessage(e.getMessage());
        return (makeLogin(s));
    }
}

 

 

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

try {
	InvokeMtd();
} catch (CustomException e) {
	// 예외 상황에 대한 대응 부재
}

 

● 안전한 코드 예 (C#)

try {
	InvokeMtd();
} catch (CustomException e) {
    // 예외 상황에 대해 적절한 조치를 수행하여야 한다.
    logger.Debug("log message");
}

 

 

진단방법
 
오류가 발생할 수 있는 부분에 대하여 예외처리를 수행했는지 확인하고 제어문으로 예외 처리하는 루틴이 비어있는지 확인한다.

 

 

● 일반적인 진단의 예

…
private Connection conn;

public Connection DBConnect(String url, String id, String password) {
    try {
        String CONNECT_STRING = url + ":" + id + ":" + password;
        InitialContext ctx = new InitialContext();
        DataSource datasource = (DataSource) ctx.lookup(CONNECT_STRING);
        conn = datasource.getConnection();
    } catch (SQLException e) {
    	// catch 블록이 비어있음
    } catch (NamingException e) {
    	// catch 블록이 비어있음
    }
    return conn;
}

try 블록에서 발생하는 오류를 포착(catch)하고 있지만 그 오류에 대해서 아무 조치를 하고 있지 않다. 따라서 프로그램이 계속 실행되기 때문에 프로그램에서 어떤 일이 일어났는지 전혀 알 수 없게 된다.