자격/SW보안약점진단원

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

Ignatius Heo 2023. 7. 6. 15:36

작성일: 230706

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(476~480p)

구분 - 캡슐화
설계단계  
개요 디버깅 목적으로 삽입된 코드는 개발이 완료되면 제거해야 한다.
디버그 코드는 설정 등의 민감한 정보를 담거나 시스템을 제어하게 허용하는 부분을 담고 있을 수 있다.
만일, 남겨진 채로 배포될 경우, 공격자가 식별 과정을 우회하거나 의도하지 않은 정보와 제어 정보가 노출될 수 있다.
진단 세부사항
(설계단계)
 
보안대책
(구현단계)
소프트웨어 배포 전, 반드시 디버그 코드를 확인 및 삭제한다.

일반적으로 Java 개발자의 경우 웹 응용 프로그램을 제작할 때 디버그 용도의 코드를 main()에 개발한 후 이를 삭제하지 않는 경우가 많다.

디버깅이 끝나면 main() 메서드를 삭제해야 한다.
진단방법
(구현단계)
J2EE를 제외하고 디버그 코드를 정적도구만으로 판단하기는 쉽지 않다.

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

 

다. 코드예제

 

ㅇ 분석

1: class Base64 {
2: public static void main(String[] args) {
3: if (debug) {
4: byte[] a = { (byte) 0xfc, (byte) 0x0f, (byte) 0xc0 };
5: byte[] b = { (byte) 0x03, (byte) 0xf0, (byte) 0x3f };
6: ……
7: }
8: }
9: public void otherMethod() { … }
10:}

ㅇ 수정

1: class Base64 {
2: public void otherMethod() { … }
3: }

ㅇ 내용

1. 디버그코드 제거

 


ㅇ 분석

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

ㅇ 수정

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

ㅇ 내용

1. 주석처리 말고 지우면 안돼?


ㅇ 분석

1: void LeftoverDebugCode() {
2: int i, ntprs;
3: char **strings;
4: nptrs = backtrace(buffer, 100);
5: strings = backtrace_symbols(buffer, nptrs);
6: …
7: // 디버그 모드일 시 콜스택을 출력한다
8: if(debug) {
9: for(i=0; i < nptr; i++) printf(“%s\n”, strings[j]);
10: }
11:}

ㅇ 수정

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

ㅇ 내용

 

 

 

 

끝.