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

구현단계 보안약점 기준 - 제거되지 않고 남은 디버그 코드

by 브루노W 2025. 6. 4.
유형 캡슐화
보안약점 제거되지 않고 남은 디버그 코드
개요
디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 한다.
 
디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다.
만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있다.
보안대책
소프트웨어 배포 전, 반드시 디버그 코드를 확인 및 삭제한다.
 
일반적으로 Java 개발자의 경우 웹 응용 프로그램을 제작할 때 디버그 용도의 코드를 main()에 개발한 후 이를 삭제하지 않는 경우가 많다.
디버깅이 끝나면 main() 메서드를 삭제해야 한다.
진단방법
J2EE를 제외하고 디버그 코드를 정적도구만으로 판단하기는 쉽지 않다.
개발 중 테스트 목적으로 남아 있는 디버그 코드가 존재하는지 확인한다.
 
J2EE 환경(J2EE Standard)에서는 main 메소드 작성을 금하고 있으며, 일반적으로 개발자들은 디버그 코드를 main
으로 작성하므로 main 메소드가 사용되는 경우 디버그코드 인지 확인하여야 한다.
연관된 설계단계 기준 -

 

코드예제

 

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

class Base64 {
    public static void main(String[] args) {
        if (debug) {
            byte[] a = { (byte) 0xfc, (byte) 0x0f, (byte) 0xc0 };
            byte[] b = { (byte) 0x03, (byte) 0xf0, (byte) 0x3f };
            ……
        }
    }
    public void otherMethod() { … }
}

 

● 안전한 코드 예 (Java)

class Base64 {
	public void otherMethod() { … }
}

 

 

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

class Example {
    public void Log() {
        //Console.WriteLine 등의 메소드를 사용한 디버그용 코드가 남아있습니다.
        Console.WriteLine("sensitive info");
    }
}

 

● 안전한 코드 예 (C#)

class Example {
    public void Log() {
        //디버그용 코드를 삭제해야 합니다.
        //Console.WriteLine("sensitive info");
    }
}

 

 

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

void LeftoverDebugCode() {
    int i, ntprs;
    char **strings;
    nptrs = backtrace(buffer, 100);
    strings = backtrace_symbols(buffer, nptrs);
    …
    // 디버그 모드일 시 콜스택을 출력한다
    if(debug) {
    	for(i=0; i < nptr; i++) printf("%s\n", strings[j]);
    }
}

 

 

● 안전한 코드 예 (C)

void LeftoverDebugCode() {
	… // 디버그 코드를 삭제하고 동작 코드만 남긴다.
}

 

 

진단방법
 
J2EE를 제외하고 디버그 코드를 정적도구만으로 판단하기는 쉽지 않다.
개발 중 테스트 목적으로 남아 있는 디버그 코드가 존재하는지 확인한다(①).
 
J2EE 환경(J2EE Standard)에서는 main 메소드 작성을 금하고 있으며, 일반적으로 개발자들은 디버그 코드를 main
으로 작성하므로 main 메소드가 사용되는 경우 디버그코드 인지 확인하여야 한다.

 

 

● 일반적인 진단의 예

public class U489 extends HttpServlet {
    protected void doGet(HttpServletRequest request, … ) throws … { … }
    protected void doPost(HttpServletRequest request, … ) throws … { … }
    // 테스트를 위한 main()함수나 디버깅용 로그 출력문 등이 남아 있다.
    public static void main(String args[]) { ···································①
    	System.err.printf(“Print debug code”);
    }
…

 


● 정탐코드

public class U489 extends HttpServlet {
    protected void doGet(HttpServletRequest request, …) throws …{ …}
    protected void doPost(HttpServletRequest request, …) throws …{ …}
    // 테스트를 위한 main()함수나 디버깅용 로그 출력문 등이 남아 있다.
    public static void main(String args[]) {
    	System.err.printf("Print debug code");
    }
}

J2EE와 같은 응용프로그램에서 디버깅용으로 사용되는 main() 메소드는 삭제한다.