Android + RAT(2)

4. GBWhatsAPP_New.apk (Joker 악성코드) 분석

4-1. 개요

“WhatsApp”은 세계에서 가장 널리 사용되는 메신저 애플리케이션 중 하나로, 사용자들 간의 무료 메시지 전송, 음성 및 영상 통화, 사진과 동영상 공유 등의 기능을 제공한다. 해당 앱은 전 세계적으로 20억 명 이상의 사용자를 보유하고 있으며, 사용자들 간의 안전한 통신을 위해 종단 간 암호화(end-to-end encryption)를 기본으로 지원하여 보안과 프라이버시를 보장한다. 하지만 이러한 대중적인 애플리케이션을 기반으로 한 다양한 변형된 버전들이 존재하며, 이중 일부는 악성코드를 포함한 APK 파일로 배포된다.

이번 실습에 다룰 “GBWhatsApp”은 이러한 변형된 WhatsApp 클라이언트 중 하나로, 사용자에게 추가적인 기능을 제공하는 비공식 애플리케이션이다. GBWhatsApp과 같은 변형 앱들은 공식 마켓플레이스가 아닌 웹사이트를 통해 APK 파일 형태로 배포되기 때문에 그 출처와 신뢰성을 확인하기 어렵다. 특히 GBWhatsApp APK 파일이 Joker 악성코드와 유사하게 작동한다는 경고가 발견되었으며, 이는 사용자 기기를 원격으로 제어하고 개인 정보를 탈취하는 등의 악의적인 목적으로 사용될 수 있음을 의미한다. 사용자의 통화 기록, 문자 메시지, 사진, 위치 정보 등 중요한 개인 정보가 유출될 위험이 있으며, 이러한 악성코드가 범죄 활동에 사용될 수 있기 때문에 해당 APK 파일의 다운로드 및 사용은 법적·보안상 심각한 문제가 발생할 수 있다.

이번 실습에서는 교육 목적으로 GBWhatsApp APK 파일을 분석하며 악성코드가 포함된 앱의 동작 방식을 이해하고자 한다. 분석 실습은 안전한 환경에서 이루어질 예정이며, 악성 APK 파일을 통한 공격 기법을 학습하는 데 그 목적이 있다.

그림 32. “WhatsApp”

그림 32. ["WhatsApp"]

그림 33. 실제 “GBWhatsApp” 악성 APK 홍보 글

그림 33. [실제 “GBWhatsApp” 악성 APK 홍보 글]


4-2. Joker 악성코드

“Joker 악성코드”는 주로 안드로이드 애플리케이션을 통해 사용자 기기에 침투하여 금융 사기, 데이터 탈취, 프리미엄 서비스 자동 가입 등 다양한 악성 행위를 수행한다. 이 악성코드는 2017년경 처음 등장했으며, 주로 Google Play 스토어에서 정상적인 애플리케이션으로 위장된 채 배포되었다. 사용자가 앱을 다운로드 및 설치하면 사용자의 동의 없이 백그라운드에서 활동을 시작하는 특징이 있다.

그 외의 주요 특징은 사용자 모르게 프리미엄 서비스에 가입시키는 “WAP 프리미엄 서비스”라는 방식을 사용한다는 점이다. 이 과정에서 사용자의 SMS 메시지를 가로채거나, 통화 기록을 훔쳐 다른 서버로 전송할 수 있으며, 이를 통해 공격자는 사용자의 금융 정보를 악용하거나, 기기를 원격으로 제어할 수 있다.

이러한 악성코드는 주기적으로 새로운 변종이 나타나기 때문에 Google Play 스토어의 보안 필터를 우회하는 경우도 종종 발생한다.

따라서 이로 인한 피해를 방지하기 위해서는 공식 스토어 외의 출처에서 APK 파일을 설치하지 않는 것이 중요하며, 앱이 요구하는 권한을 신중하게 확인해야 한다. 또한, Google Play Protect와 같은 보안 솔루션을 사용하여 의심스러운 앱을 탐지하고 차단하는 것도 유용할 수 있다.


4-3. 정적 분석

해당 APK 파일을 “Jadx-gui(디컴파일러 프로그램)”로 디컴파일해 내부 구조와 소스 코드를 분석했다.

그림 34. 해당 APK의 백그라운드에서 SMS를 보낼 수 있는 권한

그림 34. [해당 APK의 백그라운드에서 SMS를 보낼 수 있는 권한]

그림 35. 해당 APK가 백그라운드에서 SMS를 보낼 수 있는 앱 권한

그림 35. [해당 APK가 백그라운드에서 SMS를 보낼 수 있는 권한]

[그림 34, 그림 35]를 살펴보면 해당 APK가 백그라운드에서 SMS를 작성하고 전송할 수 있는 기능을 가지고 있음을 알 수 있다. 백그라운드 실행이므로 사용자가 모르게 SMS를 작성하고 전송할 수 있으며, 이는 SMS 사기나 자격 증명 등의 정보를 공격자에게 전송하는 데 사용될 수 있을 것으로 보인다.


그림 36. 해당 APK가 기기 부팅 시 감지하고, 다운로드를 실행

그림 36. [해당 APK가 기기 부팅 시 감지하고, 다운로드를 실행]

[그림 36]의 코드는 AndroidManifest.xml에서 발견되었으며, 부팅 완료 시 실행되는 리시버를 정의해 백그라운드에서 특정 동작을 시작하게 하거나 특정 작업을 에약할 수 있다. 이 설정은 악성 APK에서는 보통 부팅 직후 자동으로 악성 동작을 시작시키는 메커니즘으로 활용된다. 해당 APK에서는 코드를 통해 기기 부팅 시 이를 감지할 수 있는 권한을 가질 뿐 아니라, 다운로드 기능까지 가지도록 설정해 두었다. 이 다운로드 기능은 악성 코드를 해당 APK가 설치된 디바이스에 설치하기 위해 사용될 가능성이 크다.

해당 AndroidManifest.xml 부분을 더 살펴보니,
<permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/> 라는 코드를 발견할 수 있었다.

이 부분은 해당 APK가 사용자로부터 또 다른 앱을 설치할 수 있는 권한을 요청하는 기능을 가진다. 이를 통해 알 수 없는 출처에서 앱을 설치할 수 있는 권한도 얻을 수 있기에, 사용자가 모르게 기기에 악성 소프트웨어를 설치할 수 있는 위험성이 있다. 해당 코드 부분이 다운로드하는 파일들을 정확히 분석하기 위해서는 설치 디렉토리의 소스 폴더에서 API, C2 서버와 같은 정보를 추가적으로 확인해야 할 것으로 예상된다. 위와 같은 다운로드 기능은 Joker 악성코드가 여러 APK 다운로드 스토어에서 확산된 방식과 유사하다고 한다.


그림 37. 해당 APK가 특정 URL로부터 파일을 다운로드함

그림 37. [해당 APK가 특정 URL로부터 파일을 다운로드함]

AndroidManifest.xml이 아닌 다른 소스 코드에도 URL을 전달받는 부분이 있는 것으로 보아, 해당 APK가 백그라운드에서 Joker 악성 코드처럼 다운로드 기능을 수행하고 있는 것을 다시 한번 확인할 수 있다. 이는 해당 APK가 특정 URL로부터 파일을 다운로드하며, 해당 파일을 실행하기 위해 운영 체제의 인터넷 연결에 접근할 수 있는 권한을 가지려 하는 것으로 보인다.


그림 38. 해당 APK가 자격 증명과 사용자 활동 정보를 취득함

그림 38. [해당 APK가 자격 증명과 사용자 활동를 정보 취득함]

AndroidManifest.xml의 다른 부분을 살펴보면, 해당 APK가 기기에 저장되어 있는 잠금 패턴, 지문 인식, 핀 번호 설정과 관련된 자격 증명 정보를 가져와 사용할 수 있는 능력을 가지고 있다. 이는 해당 APK가 다른 계정 서비스에서도 로그인할 수 있게 하기 위함으로 보인다. 해당 WhatsApp 자체가 Google 서비스 인증을 필요하지 않는 앱임에도 불구하고, 자격 증명을 수집하는 기능이 포함되어 있는 것 역시 의심스럽다.

그 외에도 UPI(통합 결제 인터페이스) 관련 패키지들을 살펴보면, GetCredential, CLRemoteServiceImpl 같은 서비스나 액티비티들이 존재하는데, 이는 자격 증명을 처리하거나 원격으로 금융 관련 작업을 수행할 수 있는 기능들을 가지고 있다. 해당 WhatsApp 앱 자체가 메시징 서비스 앱이기 때문에, 실제로 UPI 기능을 필요로 하지 않는다는 특성을 미루어 보면, UPI 관련 코드를 포함하고 있는 것은 상당히 의심스럽다. 이러한 부분은 의도적으로 자격 증명이나 금융 정보를 탈취하기 위한 목적의 코드로 보인다.


그림 39. 해당 APK의 기기 진단 데이터 요청 권한

그림 39. [해당 APK의 기기 진단 데이터 요청 권한]

DiagnosticsReceiver는 운영 체제와 기기의 진단 데이터를 수신하는 리시버이고,
android.permission.DUMP 부분은 기기에서 진단 데이터를 덤프할 수 있는 권한을 가지게끔 한다. 여기에는 프로세스 상태, 메모리 상태 등 다양한 정보가 포함된다. 그 뒤에 REQUEST_DIAGNOSTICS 코드가 있는 것을 보아, 위에서 언급한 운영 체제와 기기에 대한 기본 정보를 해당 APK가 요청하는 것으로 보이고, 이를 공격자가 나중에 악용할 가능성이 높아 보인다.


그림 40. 해당 APK의 의심스러운 결제 권한(1)

그림 40. [해당 APK의 의심스러운 결제 권한(1)]

그림 41. 해당 APK의 의심스러운 결제 권한(2)

그림 41. [해당 APK의 의심스러운 결제 권한(2)]

[그림 40, 41]을 보면 유사한 코드들이 셀 수 없이 나열되어 있는데, 이 중 대다수는 의심스러운 결제 권한과 관련되어 있다.

코드를 살펴보면, 대부분 인도 UPI 결제와 관련된 계정 설정, 은행 선택, 결제 확인 등의 기능과 브라질 결제 시스템과 관련된 액티비티가 나열되어 있다. 해당 앱이 UPI나 브라질 결제 시스템과 같은 다양한 국제 결제 시스템에 액세스할 수 있는 기능을 가지고 있는 점이 매우 의심스럽다. 이러한 권한들은 보통 (해외 원조 등) 기부를 목적으로 하는 앱에서 사용되긴 하지만, WhatsApp은 애당초 기부를 목적으로 하는 앱이 아니기 때문에 맥락적으로 악성 행위에 활용하기 위해 작성한 코드로 보인다.

코드를 자세히 살펴보면, IndiaUpiPinRecoveryActivity, IndiaUpiSimVerificationActivity, PinRecovery 와 같은 액티비티로 사용자의 결제 PIN과 SIM을 복구하거나 재설정할 것으로 추정된다.
IndiaUpiBankPickerActivity, IndiaUpiBankAccountAdditionLandingActivity 와 같은 액티비티는 UPI 시스템을 통해 사용자의 은행 계좌를 선택하거나 설정하고, 새로운 은행 계좌를 추가하기 위해 사용되는 것으로 보인다.
또한, IndiaUpiPaymentTransactionDetailsActivity 액티비티는 결제 거래 내역을 확인하는 기능을 제공할 가능성이 커 보인다. 이러한 기능들이 악용될 경우, PIN 복구를 통해 결제 정보를 가로채거나, 계좌 설정을 통해 사용자의 금융 정보를 빼앗고, 결제 내역에 접근하여 사용자의 결제 활동을 모니터링할 수 있는 위험이 있다.


그림 42. 해당 APK의 타 인기 앱 정보 요청 권한(1)

그림 42. [해당 APK의 타 인기 앱 정보 요청 권한(1)]

그림 43. 해당 APK의 타 인기 앱 정보 요청 권한(2)

그림 43 [해당 APK의 타 인기 앱 정보 요청 권한(2)]

해당 부분을 살펴보면, “Facebook”, “Instagram”, “Horizon” 등 다양한 인기 앱들의 설치 여부를 담은 정보를 요청할 수 있는 기능을 가지고 있다. 또한, 이런 타 앱에서 메시지를 전송하거나, 콜백을 수행하는 권한도 가지고 있는 것으로 보인다. 이는 공격자가 사용자의 기기를 통해 사기성 메시지를 발송하거나 피싱 공격을 시도하는 데 악용될 위험성이 크다.

이처럼 설치된 앱 확인과 메시지 전송 권한을 결합하면, 사용자 기기가 원치 않는 방식으로 이용되거나, 외부 공격에 노출될 가능성이 높아진다.

그림 44. 해당 APK의 과도한 권한 요청(1)

그림 44. [해당 APK의 과도한 권한 요청(1)]

그림 45. 해당 APK의 과도한 권한 요청(2)

그림 45. [해당 APK의 과도한 권한 요청(2)]

해당 부분들을 살펴보면, 전화 설정, 생체 정보, 지문 인식, 설치된 앱 정보에 접근할 수 있는 권한들을 요청하는 것을 확인할 수 있다. 이외에도 SMS를 보내거나, 알람을 예약하거나, 백그라운드에서 프로세스를 종료하거나, 네트워크 기능을 변경, 사용자 자격 증명 사용, 계정 인증 사용, 인터넷 및 WiFi 액세스 확인, 블루투스 관리, 전화 상태 모니터링 등 해당 APK가 셀 수 없이 많은 과도한 권한들을 가지고 있다. 해당 WhatsApp 앱의 기능에 실제로 필요하지 않은 권한들이 포함되어 있는 것으로 보아, 이를 악용할 소지가 다분해 보인다.


그림 46. 해당 APK 개발자와 관련된 웹사이트와 텔레그램 사이트

그림 46. [해당 APK 개발자와 관련된 웹사이트와 텔레그램 사이트]

그림 47. 노출된 해당 APK의 개발자들 정보

그림 47. [노출된 해당 APK의 개발자들 정보]

assests/credits.html([그림 46])에서 <a href=https://www.fouadmods.com> 라는 코드를 발견했다. 해당 도메인 주소에 관한 정보를 더 얻기 위해 검색창에 ‘https’를 검색해서 찾아보니, “Fouad MODS”라는 웹사이트와 텔레그램 링크를 참조하고 있는 HTML 코드 부분을 확인할 수 있었다. 해당 링크는 자신들이 만든 앱들을 홍보하는 사이트로 추정된다.

해당 HTML 코드 부분([그림 47])으로 이동 후 코드를 더 살펴보니, “Yousef AI Basha” 라는 이름의 개발자 정보와 여러 외국인들의 팀원들 정보를 확인할 수 있었다. 텔레그램의 암호화 기능을 사용하여 자신들의 정보를 숨기려고 했지만, 일부 정보가 실수로 노출된 것으로 보인다.


그림 48. 개발자 사이트 링크 코드

그림 48. [개발자 사이트 링크 코드]

그림 49. 실제 개발자 포트폴리오 웹사이트(1)

그림 49. [실제 개발자 포트폴리오 웹사이트(1)]

그림 50. 실제 개발자 포트폴리오 웹사이트(2)

그림 50. [실제 개발자 포트폴리오 웹사이트(2)]

그림 51. 실제 개발자 포트폴리오 웹사이트(3)

그림 51. [실제 개발자 포트폴리오 웹사이트(3)]

res/values-az-vl/strings.xml를 살펴보다 아까 위에서 발견한 개발자 이름으로 된 “https://yousefalbasha.com” 링크를 발견하였다. 해당 링크를 들어가보니, 개발자 포트폴리오로 추정되는 웹사이트로 연결되었다. 그의 정확한 신원과 개인정보가 드러나 있어, 이 APK 뒤에 그가 있다는 것을 증명하는 정보가 포함되어 있다. 이 역시도 실수로 노출된 것으로 추정된다.


4-4. 동적 분석

그림 52. 좌: 실제 WhatsApp / 우: 해당 악성 APK

그림 52. [좌: 실제 WhatsApp / 우: 해당 악성 APK]

[그림 52]에 나와있듯, GBWhatsAPP_New.apk가 사용자들을 속이기 위해 실제 WhatsAPP 화면과 상당히 유사하게 디자인된 것을 확인했다.

frida를 통해 정적 분석을 진행하면서 가장 의심스러웠던 부분들 위주로 동적 분석을 진행했다.


그림 53. SMS 관련 동작 추적 후킹 스크립트

그림 53. [SMS 관련 동작 추적 후킹 스크립트]

그림 54. SMS 관련 동작 추적 후킹 결과

그림 54. [SMS 관련 동작 추적 후킹 결과]

위의 frida 스크립트를 통해 악성 앱이 사용자 모르게 SMS를 발송하는지 확인하고자 한다. SmsManager 클래스의 sendTextMessage , sendMultipartTextMessage 메서드를 후킹하여 SMS 발송 시도 시 이를 로그로 기록하고, SMS 내용을 출력하게끔 작성하였다.

스크립트 실행 결과, 단일 SMS 메시지로는 사용자의 디바이스로부터 프리미엄 서비스 가입 요청을 보내는 코드 혹은 사용자의 프리미엄 서비스 활성화 코드로 보이는 코드가 전송된 것을 확인할 수 있었다. 나누어져서 보내진 긴 메시지는 프리미엄 서비스 가입 요청과 사용자가 “YES”로 응답하도록 유도하는 내용이다.

이 로그는 프리미엄 서비스 가입 악성 행위를 명확히 보여준다. 실제 Joker 악성 코드가 주로 SMS를 통해 프리미엄 서비스에 사용자를 자동 가입시키거나, 인증 메시지를 가로채는 사례와 유사해 보인다.


그림 55. 권한 요청 추적 후킹 스크립트

그림 55. [권한 요청 추적 후킹 스크립트]

그림 56. 권한 요청 추적 후킹 결과(1)

그림 56. [권한 요청 추적 후킹 결과(1)]

그림 57. 권한 요청 추적 후킹 결과(2)

그림 57. [권한 요청 추적 후킹 결과(2)]

위의 frida 스크립트를 통해 정적 분석에서 발견한 수많은 과도한 권한 요청 API들이 실행되는지 확인하고자 한다. 해당 스크립트는 ContextCompat.checkSelfPermission 메서드를 후킹하여 요청된 권한 이름을 출력한다.

스크립트 실행 결과, 정적 분석에서 발견한 수많은 권한 요청들이 남용되고 있는 것을 확인할 수 있었다.


그림 58. 사용자 인증 정보 추적 후킹 스크립트

그림 58. [사용자 인증 정보 추적 후킹 스크립트]

그림 59. 사용자 인증 정보 추적 후킹 결과

그림 59. [사용자 인증 정보 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱이 사용자 인증 정보에 접근하는지 확인하고자 한다. KeyguardManager , FingerprintManager API를 후킹하여, APK가 기기의 보안 상태를 확인한 뒤 지문 인증을 호출해 사용자의 인증 정보를 확인하려고 시도하는지 추적한다.

스크립트 실행 결과, “기기 보안 상태 확인 시도”와 “지문 인증 시도” 메시지가 출력되었다. 이를 통해 해당 APK가 PIN, 패턴, 비밀번호 등의 잠금 설정 여부를 확인하고, 지문 데이터를 탈취하거나 인증을 가장하려고 했을 가능성을 확인했다. 또한, APK가 기기의 보안 상태를 확인하여 이에 따른 조건부 악성 행위를 진행할 것으로 추측할 수 있다.


그림 60. UPI 및 금융 정보 수집 추적 후킹 스크립트

그림 60. [UPI 및 금융 정보 수집 추적 후킹 스크립트]

그림 61. UPI 및 금융 정보 수집 추적 후킹 결과

그림 61. [UPI 및 금융 정보 수집 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱의 사용자 디바이스에 저장된 결제 정보를 탈취하려는 시도를 감지하려고 한다. com.example.payment.UPI 클래스의 startPayment 메서드를 후킹하여, 저장된 결제 정보를 APK가 처리하려는 순간 로그를 출력하게끔 작성하였다.

스크립트 실행 결과, 해당 메서드가 호출되었지만, 현재 디바이스에 저장된 결제 정보가 존재하지 않아, 은행 이름과 계좌번호가 딱히 출력되지 않은 것으로 보인다. 이는 Joker 악성코드의 주요 목표 중 하나인 금융 관련 UPI와 계좌 정보를 수집하려는 악성 행위인 것으로 명확해 보인다.


그림 62. 설치된 앱 상태 확인 후킹 스크립트

그림 62. [설치된 앱 상태 확인 후킹 스크립트]

그림 63. 설치된 앱 상태 확인 후킹 결과

그림 63. [설치된 앱 상태 확인 후킹 결과]

위의 frida 스크립트를 통해 해당 앱이 ‘기기에 설치된 모든 앱 목록 요청’을 시도하는 것을 감지하고자 한다. android.content.pm.PackageManager 클래스의 getInstalledApplications 메서드를 후킹하여, 사용자의 기기에 설치된 모든 애플리케이션 정보를 가져가는지 출력하게끔 작성하였다.

스크립트 실행 결과, 설치된 앱 목록과 실행 상태 정보들을 확인하려는 시도를 감지하였다. 이는 일반적인 동작으로도 여겨지지만, 앞선 정적 분석 결과와 연결하자면 수상한 점을 찾을 수 있다. 앞선 정적 분석에서 다양한 인기 앱들을 직접 지정하여 설치 여부의 정보를 일일이 요청할 수 있는 API뿐만 아니라, 이런 타 앱에서 메시지를 전송하거나, 콜백을 수행하는 권한을 발견했다. 이러한 점을 미루어 보았을 때, 해당 APK가 사용자의 동작을 감시려는 의도를 가진 것으로 의심할 수 있다.


그림 64. 부팅 시 자동 실행 감지 후킹 스크립트

그림 64. [부팅 시 자동 실행 감지 후킹 스크립트]

그림 65. 부팅 시 자동 실행 감지 후킹 결과

그림 65. [부팅 시 자동 실행 감지 후킹 결과]

위의 frida 스크립트를 통해 부팅 후 APK가 자동으로 실행되도록 설계되었는지 확인하고, 부팅 이후 발생하는 추가 동작에 대한 단서 또한 얻고자 한다.

위의 스크립트는 android.content.BroadcastReceiver 클래스의 onReceive 메서드를 후킹한다. 해당 코드의 결과를 확인해 보았을 때, APK가 기기 부팅 완료 이벤트를 감지하고 특정 작업을 수행하려는 의도를 엿볼 수 있으며, 이는 정적 분석 단계에서 발견한 부팅 후 자동 다운로드 기능이 포함되었던 것과 연결된다. 이를 통해, 해당 APK가 설치된 디바이스에 악성 코드를 설치할 것으로 의심할 수 있다.


그림 66. 부팅 시 추가 다운로드 실행 감지 후킹 스크립트

그림 66. [부팅 시 추가 다운로드 실행 감지 후킹 스크립트]

앞서 발견한 부팅 시 자동 다운로드 기능 실행 여부를 감지하기 위해 위와 같은 스크립트를 작성하였다. 스크립트는 해당 APK가 기기 부팅 시 실행되는 리시버를 통해 파일 다운로드/설치를 시도하는지 감지하는 역할을 한다. 그러나 스크립트 결과 APK의 명확한 악성 행위 여부는 확인할 수 없었다. 그럼에도 불구하고, 정적 분석 결과에서 매우 명확하게 악성 행위임을 암시하고 있기 때문에, 해당 APK가 특정 URL에서 악성 파일을 다운로드할 가능성이 완전히 없다고는 할 수 없다. 이를 위해서는 추후에 추가적인 보다 정밀한 동적 분석을 시도해야 할 것으로 보인다.


4-5. 결과 및 방어 기법

지금까지 정적/동적 분석을 통해 Joker 악성코드가 포함된 GBWhatsAPP APK의 보안 위협을 살펴보았다. 정적 분석 결과 해당 APK에서는 과도한 권한 요청, SMS 가로채기, 자동 실행 설정과 사용자 인증 정보와 금융 정보 탈취가 발견되었으며, 동적 분석 결과 백그라운드에서 SMS를 발송하고 프리미엄 서비스에 자동 가입시키는 행위와 설치된 앱 목록 추적, 기기 부팅 시 악성 파일 다운로드를 수행하려는 시도가 포착되었다. 이러한 분석 결과들은 사용자의 민감한 데이터를 수집하고 금융 사기 및 원격 제어를 수행하는 심각한 보안 위협으로 해석된다.

이러한 악성 APK 파일들엔 일반적으로 APK 파일 설치 전 권한과 출처를 철저히 검토하고, 악성코드 탐지 및 네트워크 트래픽 모니터링 같은 보안 기법을 적용하는 식으로 대응할 수 있다. 아래로는 보다 Joker 악성코드의 동작 특성을 기반으로 한 적절한 방어 기법을 서술하겠다.

  1. 동작 특성(1): 다른 앱/시스템 리소스에 접근함
  • 대응법(1): 안드로이드 기본 보안 모델 “애플리케이션 샌드박싱(Application Sandboxing)”.
    해당 기능은 앱을 독립된 환경에서 실행시켜 앱이 다른 앱이나 시스템 리소스에 접근하는 것을 차단한다.
  • 대응법(2): “안드로이드 네이티브 코드 검사(Android Native Code Inspection)”.
    악성코드가 C/C++ 라이브러리 등 네이티브 코드 레벨에서 시스템 리소스에 접근하려는 시도를 탐지하고 차단한다.
  1. 동작 특성(2): 변조/위조된 APK 파일
  • 대응법(1): “디지털 인증서 기반 애플리케이션 검증(App Verification via Digital Certificates)”.
    공식 애플리케이션은 디지털 서명을 통해 검증되기 때문에, 비공식 변형 앱을 설치하기 전에 디지털 서명을 검증하면 악성코드가 포함된 APK 파일을 차단할 수 있다. 또한 “정적 및 동적 코드 서명 검증(Code Signing Verification)”을 통해서도 앱 실행 전후에 코드 서명을 확인함으로써 APK 파일의 변조 여부를 확인할 수 있다.
  • 대응법(2): “서드파티 스토어 정책 강화(Strict Policy for Third-Party App Stores)”.
    많은 악성코드가 공식 앱 스토어가 아닌 서드파티 앱 스토어를 통해 배포되므로, 서드파티 스토어에서 다운로드된 APK 파일을 설치할 때 경고 메시지를 표시하거나 자동으로 차단함으로써 악성코드가 유입되는 경로를 차단할 수 있다.
  1. 동작 특성(3): 악성 네트워크 활동
  • 대응법(1): “네트워크 트래픽 암호화 및 모니터링(Network Traffic Encryption & Monitoring)”.
    모든 네트워크 트래픽을 TLS/SSL 암호화하여 기밀성을 보호하며, 동시에 네트워크 트래픽을 모니터링하여 의심스러운 트래픽이나 비정상적인 데이터 송수신을 탐지하고 차단하기 때문에, Joker와 같은 트로이 목마형 악성코드의 네트워크 활동(C2 서버와의 통신 포함)을 제한하는 데 효과적이다.
  • 대응법(2): “행동 기반 네트워크 보안 분석(Behavior-Based Network Security Analysis)”.
    악성코드가 네트워크를 통해 수행하는 비정상적인 행동을 실시간으로 분석하고 탐지하며, 악성코드가 평소와 다른 데이터 송수신 패턴을 보이면 즉시 경고를 생성하거나 해당 트래픽을 차단한다.

그 외의 총체적인 보안 강화 전략은 아래와 같다.

  • “취약점 탐지 및 패치 관리(Vulnerability Scanning and Patch Management)”
    : 악성코드가 보안 취약점을 통해 시스템에 침투하는 것을 방지하는 필수적인 방어 기법.
    시스템과 앱의 보안 패치를 최신 상태로 유지하고, 발견된 취약점에 대해 신속하게 패치를 적용해 악성코드가 취약점을 악용하지 못하게 한다.
  • “악성코드 자동 제거 툴(Malware Removal Tools)”
    : 기기에서 악성 애플리케이션이 탐지되면 즉시 제거하고, 악성코드로 인해 손상된 파일이나 시스템 설정도 복구하는 기능을 제공하여 악성코드의 피해를 최소화할 수 있다.
  • “머신 러닝 기반 악성코드 탐지(Machine Learning-Based Malware Detection)”
    : 평소와 다른 사용 패턴이나 비정상적인 API 호출, 파일 접근 시도를 실시간으로 분석하여 악성코드를 탐지하는 최신 기법.
    머신 러닝을 통해 사용자의 기기에서 발생하는 비정상적인 행동을 즉각적으로 탐지하고 대응할 수 있으며, Joker 악성코드와 같은 새로운 위협에도 신속하게 대응할 수 있다.




5. ScotiaBank.apk (Banking Trojan) 분석

5-1. 개요

“뱅킹 트로이 목마”는 주로 금융 서비스를 목표로 하는 악성 소프트웨어로, 안드로이드 기기에서 사용자의 금융 정보를 탈취하는 데 사용된다. 이 악성코드는 뱅킹 앱이나 결제 서비스를 모니터링하거나, 위조된 로그인 페이지를 생성하여 로그인 정보와 이체 인증 정보를 가로챌 수 있도록 설계되었다. 또한, 공격자는 감염된 기기의 SMS 메시지, 통화 기록, 주소록에 접근해 “이중 인증(2FA)”을 우회하거나 추가적인 악성 행위를 수행할 수 있다.

해당 뱅킹 트로이 목마는 주로 정상적인 애플리케이션으로 위장한 악성 APK 파일 형태로 배포되며, 사용자는 이를 공식 마켓플레이스가 아닌 외부 출처에서 다운로드하면서 자신도 모르게 기기에 악성코드를 설치하게 된다. 감염된 기기는 공격자가 원격 제어할 수 있으며, 이를 통해 사용자의 통화 기록과 SMS 인증 코드를 수집하고, 은행 계좌 정보를 탈취하여 불법적으로 자금을 이체하는 데 악용된다.

이번 실습에서는 뱅킹 트로이 목마가 포함된 악성 APK 파일을 분석할 예정이다. 이 과정을 통해 뱅킹 트로이 목마의 악성 행위가 실제로 어떻게 작동하는지 이해하고, 이를 방어하기 위한 대응 방법을 학습하는 데 목적이 있다. 실습은 안전한 환경에서 진행되며, 이러한 뱅킹 악성코드의 공격 기법을 심층적으로 분석할 예정이다.


그림 67. Scotiabank 캐나다 은행

그림 67. [Scotiabank 캐나다 은행]

5-2. 정적 분석

그림 68. 해당 APK의 과도한 권한 요청(1)

그림 68. [해당 APK의 과도한 권한 요청(1)]

그림 69. 해당 APK의 과도한 권한 요청(2)

그림 69. [해당 APK의 과도한 권한 요청(2)]

그림 70. 해당 APK의 과도한 권한 요청(3)

그림 70. [해당 APK의 과도한 권한 요청(3)]

뱅킹 앱에서는 일반적으로 사용자의 금융 정보를 보호하고, 안전하게 서비스를 제공하기 위해 필요한 권한을 요청한다. 위의 코드들에서 발견된 권한 요청의 대부분은 뱅킹 앱에서 흔히 요구하지 않는 고위험 권한들이다. 특히 android.permission.RECEIVE_SMS, android.permission.SEND_SMS,
android.permission.CALL_PHONE, android.permission.RECORD_AUDIO,
android.permission.READ_PHONE_STATE 등의 권한 요청들은 상당히 의심스럽다.

해당 앱이 요청한 권한 중 하나인 External_storage는 외부 저장소에서 데이터를 읽고 쓰는 행위를 허용해 공격자가 기기 내 개인 파일에 접근하거나 악성 파일을 저장하게 할 수 있다.

android.permission.RECEIVE_SMS, android.permission.SEND_SMS 등 SMS 관련 권한들은 주로 뱅킹 트로이 목마형 공격에서 이중인증(2FA) 메시지를 가로채고, 사용자의 동의 없이 고비용 SMS를 전송하는데 악용된다.

SYSTEM_ALERT_WINDOW 권한은 앱이 화면 위에 다른 창을 띄울 수 있게 허용하는데, 이는 피싱 공격에 자주 악용된다.

AUTHENTICATE_ACCOUNTS 권한은 기기에 있는 계정을 인증할 수 있는 권한으로, 공격자가 이를 이용하여 사용자 계정을 추적하고 탈취할 위험이 있다.

그 외에도 연락처를 읽고 쓸 수 있는 권한, 전화 권한, 음성 녹음, 기기 상태 접근, 계정 인증, 기기 위치 정보 수집 등의 권한들은 사용자 정보 탈취, 기기 관리 권한 획득, 피싱 공격과 같은 악성 활동에 사용될 수 있는 위험이 있다.


그림 71. 해당 APK의 실행 중인 앱 정보 수집

그림 71. [해당 APK의 실행 중인 앱 정보 수집]

위 부분은 android.app.ActivityManager.getRunningTasks 코드이다. 해당 함수는 현재 실행 중인 앱의 작업을 가져오며, 시스템에서 실행 중인 작업 리스트를 불러와서 앱 간의 포그라운드 상태를 모니터링하는 데에 사용된다. 이는 API 레벨 21 이상에서는 권장되지 않으며, 최신 버전에서는 비공개 API로 취급되어 아예 사용이 불가능한데, 이 메서드를 사용하면 사용자 기기에서 실행 중인 앱 정보를 쉽게 수집할 수 있어 개인 정보 침해나 악성 행위에 이용될 가능성이 있기 때문이다. 뱅킹 앱에서는 사용자의 보안과 프라이버시를 최우선으로 하기 때문에 일반적으로 getRunningTasks()와 같은 메서드는 사용하지 않는 점을 미루어 보아, 이 부분에 대한 추가적인 분석이 필요해 보인다.


그림 72. 해당 APK의 기기 위치 정보 수집

그림 72. [해당 APK의 기기 위치 정보 수집]

위의 코드에서는 getLastKnownLocation() 함수가 사용되고 있다. 이는 기기의 마지막으로 알려진 위치 정보를 가져오는 메서드로, GPS, Wi-Fi 등으로 수집된 마지막 위치 정보를 반환한다. 위치 기반 서비스를 제공하는 앱에서는 유용하게 사용되지만, 뱅킹 앱에서는 이러한 위치 정보가 필수적인 경우가 많지 않다. 사용자의 현재 위치를 기반으로 가까운 은행 지점을 안내하는 지점 찾기 기능 등에서 위치 정보를 요구하긴 하지만, 이러한 경우에도 실시간 위치 추적이 아닌, 간단한 위치 서비스를 사용하는 것이 일반적이기 때문에, 이는 보안과 프라이버시 측면에서 문제가 될 것으로 보인다.


그림 73. 해당 APK의 기기 위치 정보 수집, 일몰/일출 계산 기능

그림 73. [해당 APK의 기기 위치 정보 수집, 일몰/일출 계산 기능]

위의 코드에서는 getLatitude(), getLongitude() 함수가 사용되었다. 위도와 경도를 각각 가져와 사용자의 현재 위치를 가져오고, 이를 기반으로 일몰 및 일출 시간과 같은 황혼 정보를 계산한다. 현재 시간이 일몰 이후인지, 일출 이전인지 여부를 판단하고, 이에 따라 상태를 업데이트하는데 사용하기 위함으로 판단된다. 이는 당연히 일반적인 뱅킹 앱에서 사용되지 않는 기능으로, 보안과 프라이버시 측면에서 문제가 될 수 있다.


그림 74. 해당 APK의 캐시 초기화 기능

그림 74. [해당 APK의 캐시 초기화 기능]

해당 코드에서는 java.lang.reflect.Field.get 함수가 사용되었다. 안드로이드에서는 빠른 동작을 위해 이미 로드된 리소스를 캐시해 두고 재사용하는데, 해당 함수는 이를 수동으로 제거하여 메모리를 확보할 때 사용된다. 일반적으로 시스템이 자동으로 메모리 관리를 하지만 특정 상황에서는 캐시가 계속 유지되면서 메모리 누수가 발생할 수 있는데, 해당 코드는 그런 상황에서 캐시를 직접 정리해 메모리 누수를 방지하고 리소스를 강제로 다시 로드하는 것이다. 하지만, 이는 뱅킹 앱과 같은 금융 앱보다는 리소스를 많이 사용하는 앱(ex. 게임, 그래픽 처리 앱)에서 메모리 최적화나 리소스 관리를 위해 사용된다. 즉 뱅킹 앱에서는 주로 사용하지 않는 기능이니만큼 검토가 필요해 보인다.


그림 75. 해당 APK의 EXIF 데이터

그림 75. [해당 APK의 EXIF 데이터]

해당 부분은 EXIF 데이터와 관련된 작업을 수행하는 코드로 보인다. EXIF 데이터는 이미지 파일에 저장되는 메타데이터로, 사진 촬영에 대한 GPS 위치, 카메라 모델 등 다양한 정보를 포함한다. 이 기능은 이미지 처리 앱에서 주로 사용되며, 뱅킹 앱에서 이런 기능을 요구하는 것은 드물기에 의심의 여지가 있다.


5-3. 동적 분석

그림 76. 해당 APK의 실행 화면

그림 76. [해당 APK의 실행 화면]

ScotiaBank.apk의 실행화면이 실제 ScotiaBank 모바일 뱅킹 앱 실행화면과 유사한 것을 확인했다.

앞서 정적 분석을 진행하며 가장 의심스러운 부분들을 위주로 frida를 이용한 동적 분석을 진행했다.


그림 77. SMS 관련 동작 추적 후킹 스크립트

그림 77. [SMS 관련 동작 추적 후킹 스크립트]

그림 78. SMS 관련 동작 추적 후킹 결과

그림 78. [SMS 관련 동작 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱의 SMS 관련 동작을 추적하고자 한다. sendTextMessage 메서드와 ContentResolver.query 를 후킹하여, 메시지를 발송하려는 시도와 기기에 저장된 SMS 데이터를 읽으려는 시도가 발생할 때만 로그를 출력하도록 했다.

악성 앱이 발송하려 시도한 SMS 메시지를 살펴보니, 또 다른 사용자를 속여 피싱 URL로 유도하려는 시도가 있었음을 확인할 수 있었다. 이는 은행 계정을 가장하여 로그인 정보를 탈취하는 식으로 악용이 되고, 사용자에게 원치 않는 요금을 부과할 수 있다. 기존 기기에 저장된 SMS 데이터를 읽으려는 시도 역시 확인할 수 있었다. 악성 앱이 사용자 모르게 기존 SMS 데이터에 접근하여 민감한 정보나 OTP를 훔치는데 악용될 수 있다.


그림 79. 위치 및 기기 정보 수집 추적 후킹 스크립트

그림 79. [위치 및 기기 정보 수집 추적 후킹 스크립트]

그림 80. 위치 및 기기 정보 수집 추적 후킹 결과

그림 80. [위치 및 기기 정보 수집 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱의 사용자 기기 정보와 위치 정보 접근을 감지하고자 한다.

TelephonyManager 클래스의 getDeviceId() , getSimSerialNumber() 메서드와 getLastKnownLocation() 메서드를 후킹하여, 기기의 IMEI와 SIM 카드의 일련번호를 반환하고, 해당 앱이 기기의 마지막 위치를 반환할 때 위치 제공자를 출력시킨다.

스크립트 실행 결과에 비추어 보아, 해당 앱은 IMEI와 SIM Serial을 사용하여 기기와 네트워크를 고유하게 식별하고, 위치 정보를 기반으로 사용자 행동 패턴을 분석하려고 하는 것 같다. 이는 사용자의 기기 정보를 기반으로 한 금융 사기, SIM 스와핑(SIM 교체) 사기 또는 서비스 도용 시도로 이어질 수 있다. 또한, IMEI와 SIM Serial을 C2 서버에 등록하여, 감염된 기기를 제어하거나 추가 명령을 실행할 것으로 추정된다.


그림 81. 네트워크 통신 추적 후킹 스크립트

그림 81. [네트워크 통신 추적 후킹 스크립트]

그림 82. 네트워크 통신 추적 후킹 결과

그림 82. [네트워크 통신 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱이 외부 서버와 통신할 때의 요청 정보를 후킹하여 로그로 출력하고자 한다. java.net.URL 클래스의 openConnection() 메서드와 java.net.HttpURLConnection 클래스의 getInputStream() 메서드를 후킹하여, 앱이 특정 URL에 연결을 시도할 때와 앱이 특정 URL에 데이터를 요청/응답할 때 해당 URL을 출력하게끔 작성하였다.

스크립트 실행 결과, 중국 기반의 “http://www.baidu.com/” 서버와 통신이 시도되었다. 이는 일반적인 중국의 검색 기반 사이트지만, 해당 서버와 여러 번 통신을 주고받는 것을 미루어 보아, Baidu와의 통신이 명령제어(C2) 서버와 연결된 것일 가능성이 있다. 혹은 Baidu와 같은 유명 서버를 사용하여 요청을 위장하거나 탐지를 피하려는 시도일 수 있다.


그림 83. 화면 녹화 추적 후킹 스크립트

그림 83. [화면 녹화 추적 후킹 스크립트]

그림 84. 화면 녹화 추적 후킹 결과

그림 84. [화면 녹화 추적 후킹 결과]

위의 frida 스크립트를 통해 해당 앱의 화면 녹화 또는 오디오 녹음 동작 및 녹화 시작/종료 시도를 감지하고자 한다. MediaRecorder.start() 메서드와 MediaRecorder.stop() 메서드를 후킹하여 위에 나열한 동작들을 감지하도록 작성했다.

스크립트 실행 결과, stop 메서드는 호출되지 않았지만, start 메서드는 호출된 것을 확인할 수 있었다. 이는 앱이 일정 시간이 지나도 녹화를 멈추지 않고 데이터를 계속 저장하는 악성 행위일 것임이 명확해 보인다.


5-4. 결과 및 방어 기법

분석 결과, ScotiaBank.apk로 위장한 뱅킹 트로이 목마가 기기의 민감한 데이터와 사용자의 활동을 감시하여 잠재적으로 금융 사기 및 원격 제어에 악용될 가능성이 확인되었다. 정적 분석에서는 과도한 권한 요청, 실행 중인 앱 정보 및 위치 정보 수집, SMS 가로채기 시도 등이 관찰되었으며, 동적 분석에서는 SMS 전송과 가로채기, 네트워크 통신 시도, 화면 녹화 등 기기의 보안과 개인정보를 침해할 수 있는 악성 행위가 포착되었다. 또한 금융 정보 탈취 행위가 명확히 확인되지는 않았으나, 코드의 행동 패턴을 고려해 보았을 때 이를 목적으로 설계되었을 가능성이 높다.

이러한 위협에 효과적으로 대응하기 위해서는 일반적으로 앱 설치 시 출처와 권한 요청을 철저히 검토하고, 네트워크 모니터링 및 권한 제어 등의 보안 조치를 강화하는 등의 조치가 필요하다. 뱅킹 트로이 목마의 동적 특성에 특화된 대응법은 아래 서술하겠다.

  1. 동작 특성: 비정상적 리소스/권한 접근
  • 대응법(1): “애플리케이션 실행 모니터링(Application Execution Monitoring)”.
    악성코드가 설치된 앱이 기기에서 비정상적으로 작동할 때 이를 탐지하고 경고를 발생시킨다. 이러한 모니터링 기법은 앱이 시스템 리소스에 비정상적으로 접근하거나, 뱅킹 앱과 같은 중요한 애플리케이션을 감시하는 행동을 차단할 수 있다. 이 방식은 특히 뱅킹 트로이 목마가 금융 정보에 접근하기 전에 위험을 감지하는 데 효과적이다.
  • 대응법(2): “권한 제어 및 관리(Permission Control and Management)”.
    사용자가 설치하는 앱이 불필요한 권한을 요구하지 못하도록 제한하거나, 설치 후 권한을 개별적으로 관리하는 방식으로 뱅킹 트로이 목마가 시스템 리소스나 중요한 데이터에 접근하는 것을 방지할 수 있다. 민감한 금융 정보에 접근하려는 앱이 비정상적으로 많은 권한을 요청할 때 이를 탐지하고 차단하는 것이 중요하다는 면에서 이 기법은 매우 유용하다.
  1. 동작 특성: 변조/위조된 APK 파일
  • 대응법(1): “디지털 서명 검증 및 무결성 검사(Digital Signature Verification and Integrity Check)”.
    모든 공식 애플리케이션은 디지털 서명을 통해 검증되며, 악성코드가 포함된 APK 파일은 서명이 변조된다. 뱅킹 트로이 목마처럼 변조된 앱이 시스템에 설치되기 전에 서명 검증을 통해 APK 파일의 출처와 무결성을 확인하여 악성 파일의 실행을 막을 수 있다.
  • 대응법(2): “서드파티 애플리케이션 설치 차단(Blocking Third-Party App Installations)”.
    많은 뱅킹 트로이 목마는 공식 스토어가 아닌 서드파티 스토어에서 배포되기 때문에, 비공식 출처에서 앱을 설치하지 못하도록 차단하거나 경고 메시지를 표시함으로써 악성코드 유입을 사전에 막을 수 있다.
  1. 동작 특성: 네트워크 악성 행위
  • 대응법(1): “네트워크 트래픽 필터링 및 분석(Network Traffic Filtering and Analysis)”.
    네트워크 트래픽을 TLS/SSL로 암호화하고 의심스러운 네트워크 활동을 실시간으로 분석하여 비정상적인 데이터 전송을 탐지 및 차단한다. 이는 특히 뱅킹 트로이 목마가 기기에서 사용자 데이터를 외부로 유출하거나 불법적인 자금 이체를 시도할 때 그 활동을 차단하는 데 유용하다. 공격자의 C2 서버 통신을 차단하는데도 효과적이다.
  1. 동작 특성 : 인증 정보 탈취
  • 대응법: “금융 애플리케이션 보호 솔루션(Financial Application Protection Solutions)”.
    이 솔루션은 “이중 인증(2FA)”과 같은 추가적인 보안 절차를 강화하여 뱅킹 트로이 목마가 인증 정보를 탈취하는 것을 방지하는 역할을 한다. 특히, 이중 인증을 통해 공격자가 SMS 코드를 가로채도 추가적인 보안 계층이 있어 금융 정보 탈취를 더욱 어렵게 만든다. 뱅킹 앱에 특화된 보안 솔루션이라고 할 수 있다.

그 외로 “실시간 악성코드 탐지 엔진(Real-Time Malware Detection Engine)” 같은 방법을 사용할 수 있다. 해당 탐지 엔진은 기기에서 악성코드 패턴을 실시간으로 분석하여 뱅킹 트로이 목마와 같은 악성코드의 활동을 초기에 차단할 수 있는 중요한 방어 기법이다. 이 엔진은 머신 러닝을 통해 평소와 다른 비정상적인 행동 패턴을 실시간으로 탐지하고, 기기에서 이루어지는 API 호출이나 파일 접근을 감시하여 의심스러운 활동이 감지될 경우 즉시 경고를 발생시킨다.


(2)편에서는 GBWhatsAPP_New.apk와 ScotiaBank.apk를 정적/동적 분석해 보안 위협을 살펴본 뒤 이에 대한 적절한 대응 방안을 탐구했다. (3)편에서는 RAT 악성코드 분석 및 실습이 이어질 예정이다.