앱 진단(Android)/Insecurebank 실습

4. 액티비티 컴포넌트 취약점

보안개구리 2024. 7. 7. 22:39

[개 요]

 안드로이드 액티비티는 애플리케이션을 구성하는 가장 기본적인 구성단위 중 하나로, 안드로이드 애플리케이션과 사용자 간의 상호 작용에 필요한 기능을 제공합니다.(ex. 전화, 이메일)

 각 액티비티는 독립적으로 동작하기 때문에 현재 액티비티에서 다음 액티비티를 실행하는데 액티비티가 보안적으로 취약하게 선언되어 있으면 로직을 무시하고 공격자가 필요한 액티비티를 강제로 호출하며, 해당 취약점을 악용하는 경우 권한이 없는 사용자가 특정 액티비티에 접근하여 특정 기능을 활성화할 수도 있습니다.

 

[진단 과정]

1) drozer를 이용하여 외부에 노출된 액티비티가 있는지 확인한 결과 5개의 액티비티가 외부에 노출되어 있는 것을 확인하였습니다.

drozer을 통해 외부에 노출된 액티비티 확인

- 명령어 : run app.activity.info -a com.android.insecurebankv2

 

2) dreozer를 통하여 노출된 액티비티(ChangePassword)를 강제로 실행합니다. ChangePassword 액티비티는 패스워드 변경에 사용되는데 이때 사용자는 입력된 아이디값을 변경할 수 없습니다. 즉 jack이라는 사용자로 로그인했으면 패스워드 변경 시 아이디 값은 'jack'으로 고정됩니다. 하지만 로그인 없이 ChangePassword 액티비티에 강제로 실행시킬 경우 아이디입력창에 아무런 값도 입력되지 않습니다. 이때 아이디 입력창에 문자열을 입력하여 타인의 비밀번호도 변경할 수 있는지 소스코드를 확인해 보겠습니다.

로그인 후 화면
액티비티 강제 실행 시 화면

- 명령어 : run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword  

3) 아래 소스코드는 onCreate() 메서드로 ChangePassword 액티비티가 실행되면 가장 먼저 실행되는 부분입니다.

 해당 메서드는 비밀번호 변경 액티비티가 실행될 때 사용자 이름을 Intetn로 받아와 화면에 표시하고 사용자가 새 비밀번호를 입력하면 이를 서버로 전송하여 비밀번호를 변경하게 됩니다.

 

ChangePassword.onCreate

 

4) 사용자명 변수를 알았으니 drozer로 액티비티를 실행하는데 이때 --extra 옵션을 사용하여 uname값을 'jack'로 설정합니다.

- 명령어 : run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.ChangePassword --extra string uname jack

 

5) 로그인을 하지 않았을 때 기존에는 아무런 값도 입력되지 않았으나 이번에는 jack이라는 아이디가 들어가 있는 것을 확인하였습니다. 새로운 패스워드(Jack123!@#)를 입력 후 'Change Password' 버튼을 클릭하여 비밀번호 변경을 시도합니다.

 

6) 패스워드 변경 시 서버 측에 "Change Password Successful"라는 메시지가 출력되며 변경된 패스워드로 로그인이 가능한 것을 확인하였습니다.

 

[대응 방안]

o 컴포넌트에 대한 외부 접근 불허

 - 특별한 경우가 아니라면 액티비티의 속성은 android:exported="false"로 설정합니다.

1) APK Studio를 통하여 AndroidManifest.xml 내 외부로 노출된 5개의 액티비티 중 로그인 페이지를 제외한 나머지 액티비티의 속성을 android:exported="false"로 변경 후 빌드를 해줍니다.

노출된 액티비티에 대해서 android:exported 속성 변경

 

2) 기존에 설치되어 있던 v2 앱을 삭제 후 새로 만든 v3 앱을 설치 후 실행합니다.

 

3) drozer을 통하여 노출된 액티비티를 강제로 실행시킵니다. 강제 실행 시 drozer를 통하여 액티비티에 접근할 수 없다고 출력되며 액티비티 실행일 실패합니다.

액티비티 강제 실행 실패

 

4) 또한 외부에 노출된 취약점과 외부에 노출된 액티비티 확인 시 LopginActivity를 제외한 다른 액티비티가 더 이상 노출되지 않는 것을 확인하였습니다.