본문 바로가기
IT/Digital

클린코드 - 시큐어코딩 (CWE 497취약점)

by 청바지 입고 개발자 2021. 5. 24.
반응형

안녕하세요

자바 프로그램 개발 시 시큐어 코딩 관련 내용 중 유의해야 할 e.printstacktrace() 코드 취약점에 대해서 알아보겠습니다.

 

CWE (Common Weakness Enumeration) 취약점이란?

다양한 소프트웨어 언어 및 아키텍처, 디자인 패턴, 설계 단계에 발생 가능한 취약점

- 진단방법 : 소스 취약점 진단 도구 사용(오픈 소스, 상용 솔루션, 눈팅)

- 개선 가능 여부 : 개발자의 소스 코드 수정을 통해 자체 개선이 가능

 

코드 취약점 도구로 소스 코드를 인스펙션 하다보면 보안적으로 위험한 코드들이 발견될  때가 있습니다. 그 중에서도  현업에서 조심해야 되는 e.printstacktrace() 코드에 대해서 알아보겠습니다.

 

자주 사용되는 오류 처리 메시지 처리

오류처리를 하는 catch블락에 보통 아래와 같은 오류로그를 많이 남깁니다.

 

e.getMessage() : 에러의 원인을 간단하게 출력

e.toString() : 에러의 Exception 내용과 원인을 출력

e.printStackTrace() : 에러의 발생근원지를 찾아서 단계별로 에러를 출력합니다.

 

최근에는 서버 프로그램 개발이나 프론트엔드 개발 시 프레임워크를 많이 사용하기 때문에 패턴화된 개발에서는 발생되기가 쉽지 않지만 모바일 프로그램 개발 등 개발 자유도가 높은 개발 시에는 e.printStackTrace() 와 같은 코드들을 자주 사용 합니다.

 

e.printstacktrace()은 작성하게 되면 런타임시 오류가 발생한 곳부터 호출된 클래스와 메서드 정보를 순차적으로 출력하게 되고 오류가 발생한 메서드가 어떻게 호출됐는지 구조를 유추할 수 있습니다.

 

CWE-497 : Exposure of Sensitive System Information tp an authorized Control Sphere

 

아래와 같은 코드에서는 Exception이 발생될 경우 콘솔에 시스템 파일 경로 및 각종 정보들이 확인되어 외부인들로부터 상상의 실마리를 제공할 수 있습니다. End User가 볼 수 있는 스택 정보 등은 생성하지 않아야 합니다.

실제 오류코드가 발생한 라인까지 출력이 되니 오류가 어떻게 어디서 발생이 됐는지 분석하기 쉽지만 이 코드와 관련 없는 외부인에게도 역시 쉽게 분석이 가능하다는 뜻이겠죠 외부로 노출될 수 있는 소스에서는 아래와 같은 처리는 피하셔야 됩니다.

 

 

그럼 간단한 샘플 소스를 한번 보겠습니다.

 

e.printStackTrace() 샘플 소스

샘플 소스

 

아래 콘솔로그에 아래와 같이 오류가 발생한 소스의 위치가 나옵니다.

응용프로그램부터 호출시작부터 자바 레벨의 순수 메서드까지 호출 경로가 노출이 됩니다. 

오류가 발생한 소스라인이 노출됨 17라인

 

 

e.printStackTrace() 로 인한 취약점 해결방법

디버깅 중에 넣었던 시스템 정보 출력 코드를 모두 삭제해야 합니다.

특히 외부에 노출되는 모바일 소스 같은 경우에는 공격의 빌미를 제공할 수 있다는 점에서 반드시 수정되어야 하는 예외처리 방식입니다. 오류를 유추할 수 있는 최소한의 정보만을 정의하여 로그를 남길 수 있도록 재정의하는 방법이 있을 수 있습니다. 아마도 대부분의 상용 인스펙션 솔루션에서 e.printstacktrace() 로그 처리는 인스펙션에서 필수로 체크되는 항목일 겁니다.

 

 

e.getMessage() 출력 메시지 샘플

 

e.getMessage()의 결과

아래와 같이 정말 간단한 오류 정보만 제공합니다.

 

 

 

 

 

e.toString()의 출력 메시지 샘플

 

 

e.toString() 의 결과

오류 메시지와 오류에 원인(숫자변환오류)에 대해서 역시 아주 간단하게 출력됩니다.

 

 

오늘은 자바 프로그램에서 예외처리시 사용하는 e.printstacktrace() 의 취약점에 대해서 알아 보았습니다.

시큐어 코딩에도 신경 써서 클린 코드로 작성하시길 바랍니다.

 

반응형

댓글