안드로이드 String 메모리 보안이슈 해결하기 (메모리 취약점) #1

개발/안드로이드 2017. 8. 6. 13:47
반응형

안녕하세요 투믹스입니다.


이번 강의는 안드로이드 개발시 중요정보인 비밀번호를 처리하는 방법에 대해서 알아보려고 합니다.





비밀번호, 실명번호등 메모리에 평문으로 남아 유출될 수 있습니다.

중요정보는 AES-256 등 암호화를 하여도 String 객체에 넣는순간 메모리에 평문이 남게 됩니다.

 

String 객체에 넣은 후 객체를 초기화 혹은 해제하는데 평문이 남게되는 이유가 무엇일까요?

이 강좌에서 메모리상 평문이 노출되는 원인과 해결 방법을 알아보고자 합니다.


저는 이 방법으로 금융보안원에서 실시하는 취약점 점검에서 통과하였습니다. 




1. String 객체 Overwrite

2. 메모리상의 비밀번호 확인 하기 (메모리 덤프 확인 방법)

3. 실제 비밀번호 처리 방법

4. 비밀번호 체크 로직




1. String 객체 Overwrite


String 객체는 불변 객체로 JVM에서 GC가 일어날 때까지 메모리에 그대로 남아 있으며, 메모리 덤프를 통해 평문으로 된 비밀번호 정보를 알아내는게 가능한데요.


String 객체를 초기화 하는 방법은 두가지가 있으나 둘다 문제점을 가지고 있습니다.

1) null로 초기화 하는 방법

  - 객체 Reference만 null로 만듬으로써 실제 평문 데이터는 메모리에 남아 있음

  - GC가 언제 수행되는지 알 수 없음.




String str = "Hello !!";

str = null;









2) 데이터 Overwrite 하는 방법

  - String 객체는 불변이라 Overwrite 가 안된다. 

  - 같은 String 객체에 다른 문자열을 대입해도 새로운 메모리를 생성 후 입력된다.  Reference 값만 바꿔지고  기존 값은 남아 있다.



String str = "Hello !!";

str = "World !!";







개발 시 비밀번호 데이터를 암호화 함에도 불구하고 평문데이터가 메모리에 남는데요.

비밀번호를 암호화 할때 평문이 메모리에 남지않게 하려면 어떤 처리를 해야 할까요?


그것은 String 에 담지 말고 char[] 로 데이터를 처리해애 합니다.

Overwrite 가 가능하므로 메모리에서 삭제가 가능합니다.



다음코드를 보고 Overwrite하는 방법을 살펴보도록 하겠습니다.


char ch[] = new char[10];
ch [0] = 'H';
ch [1] = 'e';
ch [2] = 'l';
ch [3] = 'l';
ch [4] = 'o';
ch [5] = '!';
ch [6] = '@';

// 쓰고난 후 Overwrite (삭제) 할때...
java.util.Arrays.fill(ch, (char)0x20);


코드에 보면 java.utilArrays,fill 메소드로 0x20(아스키 코드로 스페이스값)으로 Overwrite를 하고 있습니다.

이렇게 해야 메모리상에 데이터가 사라지게 됩니다. 



그외 참고 URL: https://kldp.org/node/77978





결론 : 

        - String 객체는 Overwrite 가 안된다.

        - 비밀번호는 절대 String 객체에 평문으로 넣어서는 안된다.

        - 비밀번호 평문은 char[] 로 처리해야한다. 

        



다음 시간에는 메모리상에 비밀번호가 어떻게 남는지 직접 확인 해보고 char[]로 처리한 뒤 메모리상에서 정말 사라지는지 확인 하는 방법도 

알아보도록 하겠습니다.










반응형
admin