로컬 암호화 이슈

Gwon SeolHyeong·2021년 1월 14일
0

취약점 소개

안드로이드 애플리케이션은 실행되는 도중에 특정 정보들을 저장해야 할 때가 있습니다. 개인 정보처럼 민감한 정보일 수도 있고, 민감한 정보가 아닐 수도 있다. 만약 중요한 정보를 저장해야 할 경우 어떠한 방법을 이용할 것인지 고민이 필요하다.

취약점 진단에 들어가기 앞서서 간단한 대표적인 암호화 알고리즘인 대칭키 알고리즘과 공개키 알고리즘을 확인해보자.

  • 대칭키 알고리즘

대칭키 알고리즘은 하나의 키로 암호화, 복호화 하는 방식이다. 암호화된 암호문은 키가 없으면 볼 수 없으며 암호화한 키로만 복호화가 가능하다. 이 알고리즘의 문제점은 키 전달 방식과 관리 방법이다. 하나의 키만 사용하기 때문에 노출될 경우 모든 암호문이 복호화가 가능하고, 전달 받는 사람이 보유하지 않으면 내용 확인이 불가능해서 안전한 전송 방법이 필요하다.

  • 공개키 알고리즘

공개키 알고리즘은 공개키와 개인키(비밀키)가 있어야 한다. 공개키는 말 그래도 외부에 공개하는 키로, A가 B에게 중요한 정보를 전달하기 위해서는 B의 공개키를 사용해 암호화하면 B의 개인키로밖에 복호화하지 못하기 때문에 B에게 안전하게 정보를 전달할 수 있다.

취약점 진단 과정

인시큐어뱅크 앱의 첫 로그인 화면에서 "Autofill Credentials"라는 버튼을 클릭하면 마지막으로 로그인했던 아이디와 패스워드를 자동으로 불러와 로그인이 가능하다.
실제 서비스되고 있는 금융 앱의 자동 로그인 기능이 이와 비슷한 원리라고 한다.

이 정보를 찾기 위해서 VM을 실행시킨 후 "adb shell" 명령어로 가상 디바이스 안에 인시큐어뱅크 앱의 데이터가 저장되는 곳으로 이동해서 확인해본다.

adb 쉘 내부로 접속한 후에 디렉터리 위치 변경 후 해당 리스트를 모두 불러왔다.
(root@android 부분이 필자는 깨져서 나오는 현상이 발생함.. 픽스 시도를 했지만 실패했기 때문에 우선 진행했습니다.)

해당 위치에 "mySharedPreferences.xml" 이라는 파일과 "com.android.insecurebankv2_preferences.xml" 파일이 있다. cat 명령어로 내용을 출력해본다.

해당 내용을 확인하면 "Username"과 "suberSecurePassword"가 암호화 된 것을 확인할 수 있다.

SharedPreferences 파일을 수정하기 위해서는 또한 특정 모듈로만 접근이 가능하다. 인시큐어뱅크 애플리케이션에서 해당 파일에 아이디와 패스워드 정보가 언제 입력되는지 확인하기 위해 코드 내에서 XML 파일이 어디서 사용되는지 찾아본다.

xml 파일의 DoLogin.java 파일을 따라가서 함수를 확인해 본 결과이다. 이곳에서 username을 base64로 암호화 하는 것을 확인할 수 있었다.
따라서 https://www.base64decode.org/ 에서 디코딩을 시도해본다.

복호화를 해보니 jack이라는 username을 알 수 있었다.

이번에는 암호화된 슈퍼키를 찾기 위해서 AES 암호화가 이루어지는 Crypto 클래스로 이동해본다.

Cryptoclass.java 파일로 이동한 후 소스 코드를 살펴보면 다음과 같은 내용이 포함되는 것을 볼 수 있다.

이 값이 실제로 암호화, 복호화 되고 있는지 확인이 필요했다.

해당 java문을 통해서 전달 인자는 대칭키값인 "keyBytes"이고, "textBytes" 값을 받아 패스워드를 암호화 한 후 이 값을 aesEncryptedString 함수로 리턴한다.
리턴 받은 값은 mySharedPreferences.xml 파일에 저장한다.
위에서 확인한 "v/sJpihDCo2ckDmLW5Uwiw=="값이
"This is the super Secret key 123" 이라는 키값으로 AES 암호화된 값인 것이다.
(해당 암호는 따로 공개하지 않았습니다.)

취약점 대응 방안

해당 인시큐어뱅크 앱은 AES 256bit가 가장 강력한 암호화 방법이다. 하지만 대칭키를 사용해 암호화하는 알고리즘에서 고유키가 제대로 보호하지 못하면 아무리 강력한 암호화 방법을 사용하더라도 데이테를 안전하게 보관하지 못하는 것을 알 수 있었다.

키를 관리하는 서버를 별도로 두고, 키는 주기적으로 바꿔야 한다. 또한, 키를 주기적으로 변경하더라고 최소한의 인원만 키에 대한 정보를 알고 있어야 한다. 이 밖에도 공격자가 시간이 더 걸리더라도 메모리 덤프 등을 통해 키를 추출할 수 있다는 점에 주의해야 한다.

profile
정보보안 공부

0개의 댓글