
문자 메시지를 통해 개인정보를 탈취하는 스미싱의 수법이 갈수록 고도화되고 있다. 최근에는 지인을 사칭하여 부고장, 청첩장 등의 문자를 보내는 스미싱 수법이 성행하고 있다. 부고장 관련 스미싱의 경우 문자 메시지에는 부고장의 인터넷 주소가 첨부되어 있으며, 장례식장 위치와 발인일 등을 확인하려 클릭하면 부고장을 사칭한 악성 앱이 다운로드된다. 다운로드 된 부고장 사칭 앱은 MQTT 통해 C2 서버에서 명령을 전달받고 정의된 명령에 따라 개인 정보를 탈취한다.
MQTT는 경량 메시징 프로토콜로 소량의 데이터를 전송하는 데 사용된다. 주로 희소 대역폭과 제한된 네트워크 리소스를 가진 IoT 디바이스 간의 통신에 활용된다. MQTT는 발행-구독(Publish-Subscribe) 패턴을 기반으로 하며 발행자(Publisher), 구독자(Subscriber), 브로커 서버(Broker)로 구성되어 있다. 클라이언트는 토픽(Topic)에 메시지를 발행하거나, 해당 토픽을 구독하여 메시지를 수신할 수 있다. 토픽의 배포는 브로커 서버에서 처리되기 때문에 C2 서버의 실제 주소를 숨길 수 있다.
[그림 1] MQTT 프로토콜 악용 사례 예시
안드로이드 악성 앱이 MQTT를 사용하는 것은 아직 보고된 사례가 없다(보고서가 작성된 2024년 4월 3일까지는 보고된 사례가 없었으나, 4월 17일 Kaspersky에서 악용 사례를 공개했다). MQTT는 안드로이드가 아닌 다른 악성코드에서도 일반적으로 사용되지 않는 프로토콜이다. 따라서 보고된 사례가 매우 적으며, 가장 최근 사례는 백도어로 분류되는 WailingCrab과 MQsTTang 악성코드였다.
기능 비교
[그림 2]는 부고장 사칭 앱과 동일하게 MQTT를 사용한 4개 앱들의 기능을 분석한 것이다. [그림 2]의 세모(△) 표시는 코드는 존재하지만 호출되지 않거나 해당 기능을 사용하는 것으로 의심되는 경우이다.
5개 앱 모두 MQTT 통신으로 전달받은 명령에 따라서 개인 정보를 탈취하고 전달받은 정보로 SMS를 발송하는 기능을 갖고 있다. 개인 정보의 경우 앱마다 탈취 하는 종류의 차이는 있다. 아이콘 은닉 기능과 좀비 프로세스를 생성하는 기능도 공통적으로 갖고 있으며 MQTT 통신과 관계없이 실행된다.
부고장 사칭 앱과 카카오픽, 모바일 청첩장, 케이뱅크, 기프트허브 4개 앱들의 차이점은 MQTT 통신을 위해 외부에서 브로커 서버 주소 및 유출지 주소를 외부 서버를 통해 받아오는 것, FCM을 통해서도 C2 서버로부터 명령을 받는 것, 탐지 회피를 위해 보호 기술인 NMMP를 적용한 것이다.
[그림 2] 부고장 유사 앱 기능 비교
공통점
MQTT를 활용한 개인정보 유출
부고장 사칭 앱은 브로커 서버와 지속적으로 통신하기 위해서 [그림 3]과 같이 MQTT Service를 AndroidManifest.xml의 서비스(Service)에 등록하였다. 서비스는 안드로이드에서 음악 재생과 같은 백그라운드 작업을 위해 사용되는 구성요소이며 부고장 사칭 앱은 백그라운드에서 MQTT 통신을 하기 위해 사용하였다.
[그림 3] 부고장 앱의 MQTT 서비스 AndroidManifest.xml 등록
MQTT Service는 ServiceC0370D 서비스에서 실행되며, onCreate 메서드 내부의 startMqtt 메서드를 통해 브로커 서버와 연결한다. 브로커 서버와 연결한 다음에는 [DEVICE_ID]
형태의 토픽을 구독한다. DEVICE_ID
는 안드로이드 디바이스마다 부여되는 고유번호이며 서버에서 사용자를 구분하기 위해 일반적으로 사용되는 값이다. 부고장 사칭 앱의 C2 서버는 [DEVICE_ID]
으로 명령 메시지가 담긴 토픽을 발행하고 부고장 사칭 앱에서는 해당 _[DEVICE_ID]
토픽으로 명령 메시지를 받게 된다
[그림 4] ServiceC0370D 서비스에서 시작되는 MQTT
[그림 5] _[DEVICE_ID] 토픽 구독
부고장 사칭 앱은 C2 서버에서 발행된 토픽 및 메시지를 수신하면, 핸들러로 메시지를 전달한다. 핸들러에는 메시지 별로 악성 행위가 정의되어 있다. 단 앱마다 핸들러에 정의되어 있는 행위에는 조금씩 차이가 있다. 특히 기프트허브의 경우 [그림 8]과 같이 MQTT를 사용하는 패킷은 확인되지만 nmmp 적용으로 명령에 따라 정의된 악성 행위는 확인되지 않는다.
[그림 6] MQTT에서 수신받은 메시지를 핸들러로 전달하는 코드
[그림 7] 핸들러에 정의 된 악성 행위 중 일부
[그림 8] 기프트허브 앱의 MQTT 통신 패킷
5개 앱의 MQTT 명령에 따른 행위를 정리하면 [그림 9]와 같다. 부고장 사칭 앱은 개인 정보들을 단일로 유출하는 명령들이 정의되어 있지만, 한 번에 유출하는 명령은 정의되어 있지 않다. 하지만 부고장 사칭 앱 이후 수집된 유사 유형 앱들은 개인 정보들을 한 번에 유출하는 명령이 핸들러에 정의되어 있다. 대신 계정 정보를 유출하는 명령은 정의되어 있지 않다.
[그림 9] 앱 별 MQTT 수신 명령
아이콘 은닉
부고장 사칭 앱의 아이콘은 서비스에서 MQTT 연결 후에 은닉된다. 은닉은 activity-alias를 활용하여 투명색 아이콘으로 설정된 Activity를 활성화한다. activity-alias는 아이콘 변경과 같이 안드로이드 앱의 관리 및 유지 보수를 위해 사용되는 기능이다. 부고장 사칭 앱은 이를 사용하여 앱 이름이 공백이고 아이콘이 투명색으로 설정된 Activity를 활성화시킨다. “@android:color/transparent”는 안드로이드 기본 제공 색상 중 투명한 색상을 의미한다
[그림 10] 투명 아이콘과 앱 이름이 공백인 Activity
[그림 11] 앱 아이콘을 투명 아이콘으로 전환하는 코드
카카오픽, 모바일 청첩장, 케이뱅크, 기프트허브 앱들도 부고장 사칭 앱과 동일하게 기본 아이콘을 투명한 아이콘으로 변환한다. 카카오픽, 모바일 청첩, 케이뱅크 사칭 앱은 부고장 사칭 앱과 동일한 코드로 아이콘을 은닉한다, 기프트허브는 nmmp가 적용되어 투명화 하는 코드를 확인 할 수 없어 동적으로 아이콘이 투명화되는 것을 확인하였다.
[그림 12] 카카오픽의 아이콘 은닉 코드
[그림 13] 모바일 청첩장의 아이콘 은닉 코드
[그림 14] 케이뱅크의 아이콘 은닉 코드
[그림 15] 기프트허브 아이콘 은닉 (동적 분석)
좀비 프로세스
부고장 사칭 앱은 [그림 16], [그림 17]과 같이 디바이스가 재부팅 되거나, 서비스가 종료될 때마다 ServiceC0370D 서비스를 재실행한다. ServiceC0370D 서비스는 MQTT 통신을 연결하기 때문에 감염된 디바이스는 지속적으로 C2 서버의 명령에 의해서 지속적으로 개인 정보 탈취 위험에 노출된다.
[그림 16] 재부팅 시 ServiceC0370D 서비스를 실행하는 코드
[그림 17] 서비스 종료 시 ServiceC0370D 서비스를 재실행하는 코드
[그림 18] 앱 프로세스 강제 종료 시 재생성 되는 프로세스
카카오픽, 모바일 청첩장, 케이뱅크, 기프트허브 앱들도 부고장 사칭 앱과 동일하게 좀비 프로세스를 생성한다. 카카오픽, 모바일 청첩 사칭 앱은 부고장 사칭 앱과 동일한 코드로 아이콘을 은닉한다, 케이뱅크와 기프트허브는 nmmp이 적용되어 좀비 프로세스 생성 코드를 확인할 수 없었지만 동적으로 좀비 프로세스를 생성하는 것을 확인하였다.
[그림 19] 강제 프로세스 종료 시 재생성 되는 케이뱅크 프로세스
[그림 20] 강제 프로세스 종료 시 재생성 되는 기프트허브 프로세스
차이점
외부에서 받아오는 통신 정보
부고장 앱을 제외하고 카카오픽, 모바일 청첩장, 케이뱅크, 기프트허브 앱 모두 기본 유출지를 갖고 있으며 유출지는 외부 서버의 응답 값으로 바뀐다. 통신하는 외부 서버의 주소는 dbdb[.]addea[.]workers[.]dev 이며 4개 앱 모두 동일하게 사용한다. 해당 URL은 MQTT 브로커 서버 주소와 유출지 주소를 반환한다. [그림 21]은 1월 31일에 모바일 청첩장이 dbdb[.]addea[.]workers[.]dev와 통신한 패킷이며 브로커 서버 주소(mqtt)와 유출지(uploadsite)를 응답으로 받는 것을 확인할 수 있다.
[그림 21] 모바일 청첩장의 dbdb[.]addea[.]workers[.]dev 반환 정보(1월 31일 통신 패킷)
[그림 22] 모바일 청첩장 기본 유출지
[그림 23] dbdb[.]addea[.]workers[.]dev에서 전달받은 정보로 유출지를 변경하는 코드(모바일 청첩장)
외부 서버와 통신하여 MQTT 브로커 서버 주소와 유출지 주소를 받기 때문에 공격자는 시간에 따라 주소들을 바꿀 수 있다. 실제로 카카오픽과 청첩장의 경우 받아오는 유출지 주소가 바뀐 것을 확인하였다. [그림 24]는 모바일 청첩장 앱이 3월 25일에 외부 서버에서 유출지를 받아온 패킷이다. 1월 31일에 받아온 유출지와 다른 것을 확인할 수 있다(그림 21). 하지만 카카오픽의 경우 받아오는 유출지 주소는 바뀌었지만 실제 유출지 주소는 변경되지 않았다.
[그림 24] 모바일 청첩장의 dbdb[.]addea[.]workers[.]dev 반환 정보(3월 25일 통신 패킷)
[그림 25] 시간에 따른 유출지 주소 변경
FCM 활용한 개인정보 유출
부고장 앱을 제외한 모든 앱이 FCM를 사용하고 있다. FCM은 Google의 Firebase 플랫폼에서 제공하는 메시징 서비스로, 서버에서 클라이언트 앱으로 메시지를 전달할 수 있는 방법이며, 주로 안드로이드 디바이스에서 푸쉬(Push) 메시지를 보낼 때 쓰인다. 카카오픽과 청첩장은 해당 기능을 악용하여 공격자가 앱에 명령을 내리는데 사용하였다. FCM의 메시지에 따라 문자 메시지 탈취, 미디어 파일 업로드 등의 행위를 수행하며 MQTT 명령과 동일한 기능을 수행한다. 케이뱅크와 기프트허브는 FCM를 사용하는 패킷은 확인되지만 nmmp 적용으로 명령에 따른 행위는 확인되지 않는다.
[그림 26] 앱 별 FCM 수신 명령
[그림 27] 케이뱅크 FCM 통신 패킷
[그림 28] 기프트허브 FCM 통신 패킷
DEX 보호기술 적용 (NMMP)
케이뱅크와 기프트허브의 경우 다른 앱들과 달리 nmmp를 사용하고 있다.
[그림 29] nmmp이 적용된 MainActivity - 좌(케이뱅크) / 우(기프트허브)
nmmp는 dex-vm를 기반으로 dalvik 바이트 코드를 실행하여 dex 파일을 보호한다. dex를 보호하기 위해 nmmp는 dex의 데이터를 C 구조체로 변환하고, 이를 기반으로 opcode를 무작위로 생성하여 ndk를 생성한다. [그림 30]과 달리 nmmp이 적용된 앱은 vmInterpret 메서드를 호출 하는 코드만 확인 된다. 따라서 분석을 위해 후킹(Hooking)과 같은 분석 기법이 필요하다.
[그림 30] nmmp이 적용되지 않은 앱
[그림 31] nmmp이 적용된 앱(케이뱅크)
vmInterpret 메서드는 [그림 32]와 같이 파라미터로 구조체를 받는다. 구조체는 dex에서 변환된 것이며, dex에 작성되어있던 코드에 대응하는 opcode가 포함되어 있다. 따라서 vmInterpret 메드가 전달받는 파라미터의 주소를 확인하면 opcode 확인이 가능하며, 이를 통해 실제 호출된 dex내의 메서드 확인이 가능하다. [그림 33]은 Frida로 vmInterpret 메서드의 후킹을 통해 확인한 opcode이다.
[그림 32] vmInterpret 메서드 구조
[그림 33] Frida로 vmInterpret 메서드의 후킹을 통해 확인한 opcode
결론
부고장 사칭 앱을 포함한 5개 앱 모두 아이콘을 은닉하고 MQTT를 실행하는 좀비 프로세스를 생성한다. 또한 MQTT 통신을 사용해 원격으로 명령을 내리고, 명령에 따라 SMS 발송, 개인 정보 탈취를 시도하고 있다. 부고장 사칭 앱과의 차이점은 MQTT의 브로커 서버 주소를 외부 서버에서 전송받는 것과 원격 제어를 위한 FCM 활용, 탐지 및 분석을 피하기 위해 DEX 보호 기술을 적용한 것이다.
[그림 34] 점차 고도화 되어가는 스미싱 앱
MQTT는 안드로이드 악성 앱에서 일반적으로 사용되지 않는 기술이었다. 하지만 MQTT를 적용한 안드로이드 악성 앱에서 사용되는 사례가 발견되었고 이를 기반으로 점차 변이 되고 고도화된 스미싱 앱이 유포되는 것을 확인할 수 있었다. 악성 앱은 탐지를 회피하기 위해 이전에 사용하지 않던 방식을 사용하고 이를 토대로 지속적으로 고도화시켜 나간다. 따라서 MQTT를 활용한 악성 앱들이 계속해서 유포될 가능성이 높기에 지속적인 모니터링과 추적이 필요하다.