소프트웨어 개발보안 가이드 분석(2021) : 오류상황 대응 부재

오류상황 대응 부재란?

오류상황 대응 부재란, 시스템이나 소프트웨어가 예외 상황이나 오류를 발생했을 때 이를 적절히 처리하지 못하는 경우를 말합니다. 이로 인해 개발자가 의도하지 않은 방향으로 시스템 또는 소프트웨어가 작동하게됩니다. 이러한 취약점은 시스템의 안정성과 신뢰성을 저하시킬 수 있습니다.

 

공격 메커니즘

오류상황 발생 시 적절한 예외 처리가 존재하지 않는 경우 다음과 같은 보안 위협이 발생할 수 있습니다.

  1. 기능상의 오류: 적절한 예외 및 에러 처리가 존재하지 않는 경우 시스템이나 소프트웨어에서 기능적인 오류가 발생하며, 시스템이 예상치 못한 방식으로 동작할 수 있습니다.
  2. 시스템 다운: 심각한 예외 상황을 적절히 처리하지 못하면, 시스템 전체가 다운될 위험이 있습니다.
  3. 보안 취약점: 특정 오류 상황을 악용하여 시스템을 공격하거나, 시스템의 안정성을 해치는 공격을 수행할 수 있습니다.

 

취약한 웹 애플리케이션의 예

다음은 로그인을 수행할 때 패스워드가 틀린 경우를 적절히 처리하지 않는 오류상황 대응 부재의 예시 코드입니다.

public class LoginExample {
    public static void main(String[] args) {
        // 사용자 입력 값
        String inputUsername = "user";
        String inputPassword = "wrongPassword";

        // 예시를 위한 하드코딩된 사용자 정보
        String correctUsername = "user";
        String correctPassword = "correctPassword";

        try {
            // 로그인 시도
            if (inputUsername.equals(correctUsername) && inputPassword.equals(correctPassword)) {
                System.out.println("로그인 성공!");
            } else {
                // 패스워드가 틀렸을 때의 예외 상황 처리 누락
                // 적절한 예외 처리 로직이 없음
                System.out.println("로그인 성공!");
            }
        } catch (Exception e) {
            // 예외 처리 블록
            e.printStackTrace();
        }
    }
}

이 코드에서는 사용자가 입력한 패스워드가 틀렸을 경우 적절한 예외 처리가 이루어지지 않고 있습니다. 올바른 로직이라면 패스워드가 틀렸을 때 "로그인 실패"와 같은 메시지를 출력해야 하지만, 현재의 코드는 패스워드가 틀렸음에도 불구하고 "로그인 성공!"이라는 메시지를 출력하고 있습니다. 이는 오류상황 대응 부재의 전형적인 예로, 실제 상황에서는 보안상 큰 문제를 일으킬 수 있는 부분입니다.

 

시큐어코딩 적용 방법

오류상황 대응 부재 취약점은 다음과 같은 방법을 통하여 취약점을 보안할 수 있습니다.

  1. 예외 처리 구현: 오류상황 대응 부재의 주요 원인은 개발 과정에서 예외 상황에 대한 처리 루틴을 구현하지 않아 발생합니다. 모든 예외 상황에 대해 적절한 예외 처리 루틴을 구현하여 예외 상황 발생 시 시스템이 예측 가능하고 안정적인 방식으로 동작하도록 구현합니다.

다음은 로그인 수행 시 패스워드가 틀렸을 경우의 예외 처리를 구현한 예시 코드입니다.

public class LoginExample {
    public static void main(String[] args) {
        // 사용자 입력 값
        String inputUsername = "user";
        String inputPassword = "wrongPassword";

        // 예시를 위한 하드코딩된 사용자 정보
        String correctUsername = "user";
        String correctPassword = "correctPassword";

        try {
            // 로그인 시도
            if (inputUsername.equals(correctUsername) && inputPassword.equals(correctPassword)) {
                System.out.println("로그인 성공!");
            } else {
                // 패스워드가 틀린 경우 적절하게 처리
                throw new Exception("로그인 실패: 사용자 이름 또는 비밀번호가 틀립니다.");
            }
        } catch (Exception e) {
            // 예외 처리 블록에서 로그인 실패 메시지 처리
            System.out.println(e.getMessage());
        }
    }
}

이 코드에서는 패스워드가 틀렸을 경우 Exception을 던지고, 이를 catch 블록에서 적절하게 처리하여 사용자에게 "로그인 실패: 사용자 이름 또는 비밀번호가 틀립니다."라는 메시지를 출력하도록 로직을 구현하여 오류 상황에 대해 적절한 대응하도록 하였습니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 오류 메시지 정보노출
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 부적절한 예외 처리