소프트웨어 개발보안 가이드 분석(2021) : 제거되지 않고 남은 디버그 코드

디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 한다.

디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다.

만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있다.

소프트웨어 개발보안가이드(2021), 한국인터넷진흥원

※ 디버그 : 프로그램이나 시스템에서 발생하는 오류를 찾고 수정하는 과정을 가리킵니다. 소프트웨어가 개발되는 동안에는 다양한 종류의 오류가 발생할 수 있습니다. 이러한 오류를 찾고 해결하기 위해 디버그 과정이 필요합니다.

※ 디버깅 : 디버그를 수행하는 과정

 

제거되지 않고 남은 디버그 코드란?

소프트웨어 개발 과정에서 디버깅은 중요한 단계입니다. 이 단계에서는 프로그램이 예상대로 작동하는지 확인하고, 문제를 해결하기 위해 코드를 검사하고 수정합니다. 그러나 디버그 과정에서 추가된 코드나 출력을 확인하기 위한 코드가 있을 수 있습니다. 이러한 코드는 프로그램이 출시될 때 제거되지 않으면 보안 위협이 될 수 있습니다. 이렇게 최종 배포 이후까지 남아있는 디버그 코드를 "제거되지 않고 남은 디버그 코드"라고 합니다.

 

공격 메커니즘

  1. 정보 노출 : 디버그 코드에는 종종 시스템이나 애플리케이션의 내부 상태나 민감한 정보를 출력하는 기능이 포함될 수 있습니다. 이러한 정보가 외부에 노출되면 공격자들이 시스템의 동작을 분석하고 보안 취약점을 찾는 데 도움이 될 수 있으며 데이터를 탈취할 수 있습니다.
  2. 인증 우회 : 디버그 코드를 통해 시스템의 인증 및 권한 검사를 우회할 수 있는 경우가 있습니다. 공격자는 이를 악용하여 인증된 사용자인 것처럼 시스템에 접근하거나 특정 기능에 대한 권한을 부여받지 않은 상태에서 시스템을 조작할 수 있습니다.
  3. 애플리케이션 조작 : 디버그 코드를 통해 애플리케이션의 실행 흐름을 조작할 수 있습니다. 이를 통해 공격자는 애플리케이션의 예상치 못한 동작을 유도하거나 시스템 자원을 비정상적으로 사용할 수 있습니다.

 

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

    public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);

         // 디버그 모드 여부를 결정하는 변수
   1     boolean debug = true;

         System.out.print("메시지를 입력하세요: ");
         String message = scanner.nextLine();

         // 디버그 모드인 경우 입력된 메시지를 출력
   2     if (debug) {
             System.out.println("[DEBUG] 입력된 메시지: " + message);
         }

         // 입력된 메시지를 대문자로 변환하여 출력
         System.out.println("처리된 메시지: " + message.toUpperCase());
     }
  • 1 : 디버그 모드를 결정하는 boolean 타입의 변수 debug를 선언하고, 초기값으로 true를 할당한다.
  • 2 : 만약 debug 변수가 true 이면, 출력되는 메시지는 "[DEBUG] 입력한 메시지"와 함께 출력합니다.
  • 개발 당시에는 오류 처리 or 실행 결과를 확인하기 위해 디버그 코드를 사용하지만 배포를 한 후에는 이들을 모두 제거해 주어야 합니다. 지금 코드는 예시를 위하여 2번과 같이 적었지만 2번에 시스템의 중요정보를 확인하기 위한 코드가 있었다면 심각한 정보 노출로 이어질 것입니다.

 

시큐어코딩 적용 방법

    public class SafeExample {
       public static void main(String[] args) {
           Scanner scanner = new Scanner(System.in);

           System.out.print("메시지를 입력하세요: ");
           String message = scanner.nextLine();

           // 입력된 메시지를 대문자로 변환하여 출력
           System.out.println("처리된 메시지: " + message.toUpperCase());
        }
    }
  • 해결 방법은 매우 단순합니다. 개발에 사용하였던 디버그 코드를 모두 제거해 주면 됩니다.

제거되지 않고 남은 디버그 코드의 취약점을 완화하기 위한 방법은 다음과 같습니다.

  • 코드 검토 : 배포 전에 코드를 철저히 검토하여 디버그 코드가 남아있지 않도록 확인합니다.
  • 코드 정리 : 사용하지 않은 코드는 제거하여 공격 표면을 줄입니다.
  • 코드 분석 도구 사용 : 코드 분석 도구를 사용하여 디버그 코드를 자동으로 식별하고 제거합니다.
  • 보안 교육 : 개발자들의 실수에서 생긴 취약점이기 때문에 안전한 코딩 방식에 대한 교육을 제공합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 잘못된 세션에 의한 데이터 정보 노출
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : Public 메소드 부터 반환된 Private 배열