시큐어 코딩

JAVA 메모리 취약성 제거

Security_Info 2020. 3. 11. 15:19

JAVA 개발을 하다보면 String 객체를 이용하여 개인정보 관련 데이터를 넣어서 로직을 처리하는 경우가 있습니다.

 

그러나 이 경우 String 객체에 개인정보가 남아 있어 '메모리 덤프'를 이용해 개인정보가 유출 된다면?

String?

자바의 String은 값을 주입하는 순간, 값에 대한 객체를 생성하여 참조하게 됩니다.

위의 사진 처럼 하나의 값에 대해 참조를 하게됩니다.

이때 바로 암호화를 이용하여 보호하면 된다고 생각한다.

 

암호화 수행 후 메모리 결과는 다음과 같습니다.

이렇게 Mypassword 데이터는 메모리에 남아 있으며, String 객체는 새로운 객체를 생성하여 암호화된 데이터를 참조하는 형태가 됩니다.

즉 메모리 덤프를 통해 개인정보 탈취가 가능하다는 것입니다.

 

우리는 본질적으로 메모리의 데이터를 지우고싶습니다.

 

 

 

이미 예전부터 이 방법에 대해서 정리된 영문 자료가 존재했습니다.

there are no methods defined that allow you to change (overwrite) or zero out the contents of a String after usage

요약: String은 기본적으로 문자열 사용 후 덮어쓰기(Overwrite), 제로화 시키는 기능이 정의되어 있지않다.

 

his feature makes String objects unsuitable for storing security sensitive information such as user passwords. You should always collect and store security sensitive information in a char array instead.

요약: 민감한 정보를 수집할 때에는 String이 아닌, char array로 수집하여 처리하세요.

 

 

 

그렇습니다. 다음의 소스코드과 같이 중요정보를 처리해줘야 합니다.

 

따라서 사용된 char array는 위의 사진처럼 아스키 0x20값으로 처리하여, 암호화된 데이터이든 평문 데이터이든 

메모리 상에서 지워주도록 합시다.