취약점 개요
개발자 백도어는 모바일 앱을 배포하기 전/후 소스코드에 최고 권한이 부여된 계정을 삽입하고, 문제가 발생했을 때 해당 계정으로 접속하여 디버깅을 수행하게 된다.
보통 자신이 개발한 모바일 앱의 모든 기능이 정상적으로 동작하는지 테스트하려고 백도어 코드를 삽입한다.
하지만, 악의적인 목적을 가지고 모바일 앱에 백도어 코드를 포함시켜 사용자의 모바일 단말기에 설치하게 만들어서 개인 정보 및 주요 정보를 탈취하는 경우가 존재한다.
인시큐어뱅크 앱은 개발할 당시 테스트를 할 목적으로 백도어 코드가 삽입되어 있다. 백도어 코드가 삽입되어 있는 상태에서 모바일 앱을 배포한다면 권한이 없는 사용자가 백도어 경로로 접속하여 중요 정보를 획득할 수 있다.
취약점 진단
소스코드를 보면 두 가지 형태의 계정 처리 루틴이 존재한다.
사용자가 이용하는 아이디와 비밀번호를 입력하면 /login 주소로 패킷을 전달하고, 아이디가 devadmin이라면 /devlogin 주소로 패킷을 전달한다.
devadmin 계정은 비밀번호 없이 접속할 수 있는 디버깅 용도로 생성된 계정이다.
모바일 앱을 실행하여 devadmin 아이디와 임의의 비밀번호를 입력하고, 로그인 버튼을 클릭했을 때 패킷을 캡처한다.
패킷을 보면 요청 패킷에 아이디와 비밀번호를 /devlogin 주소로 전달하고, 응답 패킷에 devadmin 계정으로 인증이 성공했다는 메시지를 전달 받는다.
/devlogin 패킷을 처리하는 서버의 소스코드를 보면 주석으로 개발자에게 허용된 계정이라고 명시되어 있고, 하단에 /devlogin 주소로 아이디만 전달한다.
※ 서버의 소스코드 : Android-InsecureBankv2\AndroLabServer\app.py
# app.py
'''
The function provides login mechanism to a developer user during development phase
'''
@app.route('/devlogin', methods=['POST'])
def devlogin():
user=request.form['username']
Responsemsg="Correct Credentials"
data = {"message" : Responsemsg, "user": user}
print makejson(data)
return makejson(data)
대응 방안 및 검증
개발자 백도어 취약점은 개발자가 모바일 앱을 배포하기 전 테스트 용도로 생성한 계정을 삭제하지 않아 발생한다.
이를 통해 인가되지 않는 사용자가 개발자용 계정을 확인 후 해당 계정으로 접속하여 중요 정보를 획득할 수 있으므로 관련 코드를 제거해야 한다.
개발자 백도어 취약점 |
자바 소스코드에 개발자 백도어 코드 제거 |
서버 소스코드에 개발자 백도어 코드 제거 |
DoLogin.java 소스코드에서 사용자가 이용하는 계정을 처리하는 코드를 제외하고 개발자 백도어 코드(115, 127 ~ 130행)를 제거한다. 또한, app.py 소스코드에서 /devlogin 패킷을 처리하는 코드와 주석을 제거한다.
소스코드를 수정했으면 프로젝트를 빌드 후 모바일 단말기에 앱을 설치하고 앱을 실행한다. 이후 devadmin 계정으로 로그인을 시도하면 응답 패킷에 존재하지 않는 계정 메시지를 전달받는다.
▶ 안드로이드 컴포넌트 취약점 (Android Activity)
▶ 안드로이드 컴포넌트 취약점 (Android Broadcast Receiver)
▶ 안드로이드 컴포넌트 취약점 (Android Content Provider)
▶ 안드로이드 백업 취약점 (Android Backup)
▶ 안드로이드 루팅 탐지 우회 (Frida Hooking)
▶ 안드로이드 로컬 암호화 취약점 (Android Local Encryption)
▶ 안드로이드 웹뷰 취약점 (Android Webview)
▶ 안드로이드 SD카드 저장소 취약점 (Android SDCard Storage)
▶ 안드로이드 하드코딩 취약점 (Android Hardcoded Secrets)
▶ 안드로이드 HTTP 통신 취약점 (Android Insecure HTTP Connections)