안드로이드 악성코드의 진화: 스파이웨어(Spyware)

Post image

안녕하세요. Secolt입니다.

어느덧 2025년도 막바지를 향해 달려가고 있습니다. 갑작스럽게 추워진 날씨에 다들 건강 관리는 잘 하고 계신가요? 연말이 다가오면서 거리의 분위기는 들뜨고 있지만, 악성코드 분석가들의 마음은 마냥 편하지는 않습니다. 연말연시는 해커들이 가장 활발하게 움직이는 시기이기도 하니까요.

이에 발맞춰 저희 시큐리온도 서비스중인 OnAV도 보이스피싱 악성 앱 탐지 성능 강화 업데이트를 진행했습니다. 저희 서비스 많은 관심 가져주시길 바랍니다.

시큐리온 “숨은 피싱앱까지 잡는다”···AI 백신, 신종 보이스피싱 차단

오늘은 2025년에 있었던 안드로이드 보안 위협에 대한 이야기를 조금 할까 합니다. 그리고 이들의 공통점이 되는 부분이 무엇이고 그것에 대한 기술적인 부분도 얘기해볼까 합니다. 그럼 같이 살펴보러 가실까요?


2025년 안드로이드 동향

2025년은 모바일 보안 분야에서 참 다사다난한 해였던 것 같습니다. 기존의 APT 그룹이 주도하는 지능형 공격은 여전했고, 여기에 MaaS 모델이 대중화되면서 신규 범죄자들까지 대거 유입되는 혼란스러운 양상이 펼쳐졌습니다.


MaaS(Malware as a Service)는 무엇이길래 범죄자들이 열광을 하는 것일까요?

MaaS는 악성코드를 서비스 형태로 판매하거나 대여하는 모델입니다. 다크웹이나 텔레그램을 통해 월 구독료를 지불하면 악성 앱과 관리자 패널(C&C Panel, Command and Control)을 제공받을 수 있어, 기술력이 부족한 범죄자들도 쉽게 사이버 범죄에 가담할 수 있게 되었습니다. 이에 따라 악의적인 행위를 하는 사람의 기술적 진입 장벽이 많이 낮아졌죠.

image01.png

[그림 1] C&C 관리자 패널(출처: Check Point Research)


그렇다면 2025년 한 해 동안 안드로이드 생태계를 뒤흔든 대표적인 악성코드들은 무엇이 있을까요?

올해 자주 탐지된 악성코드들은 주된 목적에 따라 크게 두 가지 유형, 금전 탈취 목적과 기기 제어 및 감시 목적의 악성코드로 구분할 수 있습니다.

뱅킹 트로이목마(Banking Trojan)

가장 직접적인 금전 피해를 입히는 유형입니다. 은행 앱 위에 가짜 화면을 띄우는 오버레이(Overlay) 공격을 통해 아이디, 비밀번호, OTP 등을 탈취합니다.

  • 주요 패밀리: Anatsa, Ghostbat, Herodotus
RAT(Remote Access Trojan) & 스파이웨어

정보 수집과 기기 제어권 탈취에 집중하는 유형입니다. 주로 MaaS 형태로 유포되며 감염된 기기를 좀비 폰으로 만들어 범죄에 악용합니다.

  • 주요 패밀리: HyperRAT, ClayRat, DCHSpy

이들의 공통점은 무엇일까요? 운영 방식은 다르더라도 결국 정보 탈취를 목적으로 하는 스파이웨어 기능과 RAT의 원격 제어 기능을 모두 탑재하여 진화하고 있다는 것입니다.


스파이웨어란?

스파이웨어(Spyware)는 Spy와 Software의 합성어로 사용자의 동의 없이 기기에 잠입하여 중요 정보를 수집하고 이를 공격자에게 전송하는 악성 소프트웨어를 뜻합니다.

과거에는 주로 웹 서핑 기록이나 연락처 등 단순 정보 수집에 그쳤지만, 최근에는 마이크를 통한 도청, 카메라 촬영, 실시간 위치 추적 등 사생활을 침해하고 보이스피싱 범죄에 악용되는 등 그 형태가 크게 진화했습니다.


주요 감염 경로

이러한 악성 앱들은 주로 기술적 취약점보다는 사용자의 심리를 이용한 사회공학적 기법(Social Engineering)을 통해 유포됩니다.

가장 대표적인 방식은 스미싱(Smishing)입니다. 특히 11월 블랙프라이데이와 연말 쇼핑 시즌은 택배 물량이 급증하는 시기인 만큼, 이를 노린 공격이 집중됩니다.

image02.png

[그림 2] 스미싱 문자 유형


실제로 악성코드 분석가인 저에게도 아래와 같은 메시지가 수신되기도 합니다. 제가 받은 초대장이나 할인 쿠폰과 같은 미끼로 링크 클릭을 유도하고 연결된 피싱 사이트에서 악성 APK 설치를 요구하죠.

image03.png

[그림 3] 직접 수신한 스미싱 문자


이외에도 검색 엔진 결과를 조작하는 SEO 포이즈닝(SEO Poisoning) 기법이 성행하고 있습니다. 사용자가 “유료 앱 무료 다운로드” 등을 검색할 때, 악성 코드가 심어진 가짜 다운로드 사이트를 검색 결과 최상단에 노출시켜 자발적인 다운로드를 유도합니다.

또한 텔레그램(Telegram)이나 왓츠앱(WhatsApp) 등의 메신저 채널을 통한 유포도 활발합니다. 폐쇄적인 커뮤니티에서 “리딩방 전용 앱”, “코인 채굴 앱” 등으로 위장한 APK 파일을 직접 공유합니다.

지난 드로퍼 글에서 살펴본 것처럼 공식 마켓인 구글 플레이 스토어도 안전지대는 아닙니다. 정상적인 앱으로 위장해 심사를 통과한 뒤, 추후 업데이트를 통해 악성 코드를 내려받는 드로퍼(Dropper) 방식도 주요 유포 방법이죠.


그렇다면 그들이 어떻게든 설치하려고 하는 스파이웨어, RAT는 어떤 기능을 하는 걸까요?


실전 분석

이 파트에선 스파이웨어, 그 중에서도 RAT를 중심으로 실제 동작 방식을 살펴보겠습니다.

앞서 설명한 바와 같이 스파이웨어가 단순히 연락처나 문자와 같은 정보를 탈취하는 수준에 머문다면 RAT는 여기서 더 나아가 C&C 서버로부터 공격자의 명령을 실시간으로 전달받아 능동적으로 악성 행위를 수행합니다. 이로 인해 감염된 기기는 해커의 손아귀에서 원격 조종되는 ‘좀비 폰’으로 전락해 사용자의 모든 활동이 통제되고 감시당할 수 있습니다.

RAT의 통신 기법

이제 이러한 원격 조종이 실제로 어떻게 가능해지는지 이해하기 위해 먼저 RAT가 C&C 서버와 주고받는 통신 방식을 살펴보겠습니다.

최신 RAT를 심층적으로 이해하기 위해서는 공격자가 원격으로 명령을 내리는 C&C 서버와의 통신 구조를 파악하는 것이 선행되어야 합니다. 현재 공격자들이 주로 사용하는 통신 기법은 크게 여섯 가지로 분류되며 특정 시기나 캠페인에 따라 유사한 통신 방식을 공유하는 경향을 보입니다.

  • WebSocket: 가장 빈번하게 사용되는 방식으로 서버와 기기 간의 실시간 양방향 통신을 보장합니다. 예를 들어 공격자가 “Record” 명령을 내리면 지연 없이 녹음 기능이 실행됩니다.
  • FCM(Firebase Cloud Messaging): 구글의 공식 푸시 알림 서비스를 악용하는 경우도 있습니다. 앱이 종료되었거나 기기가 절전 모드에 있더라도 강제로 깨워 명령을 전달할 수 있다는 점이 가장 큰 장점입니다.
  • MQTT(Message Queuing Telemetry Transport): 원래 IoT 기기를 위한 경량 프로토콜이지만 악성 앱 간 통신 수단으로도 자주 활용됩니다.
  • SMS: 이미 감염된 좀비폰이나 인터넷 문자 등을 C&C 서버로 사용합니다. 피해 기기가 특정 문자열이 포함된 메시지를 수신하면 해당 명령을 수행하도록 설계됩니다.
  • HTTP/HTTPS: 가장 전통적인 방식으로 C&C 명령 제어나 데이터 유출(예: 연락처, 갤러리 사진 등)에 자주 사용됩니다.
  • Telegram BOT API: 별도의 C&C 서버를 구축하지 않고 텔레그램 메신저를 서버로 활용합니다. 통신이 암호화되어 있고 서버 IP 추적이 사실상 어려워 최근 MaaS 형태의 악성 앱에서 특히 선호됩니다.

image04.png

[그림 4] 텔레그램 봇을 이용한 C&C 명령(출처: Certo Software)


이처럼 합법적인 메신저 인프라를 그대로 악용함으로써, 공격자는 인프라 구축 비용을 줄이면서도 추적을 어렵게 만들 수 있습니다. 이외에도 Discord, Signal 등 합법적인 서비스를 C&C 서버로 악용하는 사례가 지속적으로 보고되고 있습니다.

명령 처리 로직

앞에서 통신 채널을 통해 명령이 어떻게 전달되는지 보았다면, 이제는 이렇게 전달된 명령이 단말기 내부에서 어떻게 해석되고 실행되는지 살펴보겠습니다.

실제 분석된 샘플 코드를 보면 공격자가 보낸 commandType 값에 따라 서로 다른 악성 행위로 분기되는 구조임을 확인할 수 있습니다.

public Object handleCommand(Object params, int commandType) {

        switch (commandType) {
            case 0: // SMS 발송 준비
                Object[] smsParams = (Object[]) params;
                return prepareSmsTask(smsParams, loader);
                
            case 1: // 디바이스 상태 업데이트
                updateDeviceState();
                return null;
                
            case 2: // 디바이스 잠금/무음 모드
                Object[] lockParams = (Object[]) params;
                boolean shouldLock = ((Boolean) lockParams[0]).booleanValue();
                SharedPreferences prefs = loader.preferences;
                prefs.edit().putBoolean("lock", shouldLock).apply();
                
                if (shouldLock) {
                    Context ctx = loader.context;
                    AudioManager audioManager = (AudioManager) ctx.getSystemService("audio");
                    audioManager.setRingerMode(0);
                    Timer lockTimer = new Timer(0, loader);
                    loader.lockTimer = lockTimer;
                    loader.timerScheduler.schedule(lockTimer, 0L, 150L);
                } else {
                
                }
                return null;
                
            case 3: // 원격 전화 걸기
                Object[] callParams = (Object[]) params;
                Context callContext = loader.context;
                
                AudioManager audioManager = (AudioManager) callContext.getSystemService("audio");
                audioManager.setRingerMode(0);
                String phoneNumber = (String) callParams[0];
                Intent callIntent = new Intent("android.intent.action.CALL", 
																                Uri.parse("tel:" + phoneNumber));
                callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                callContext.startActivity(callIntent);
                return null;
								//... 이하 생략   
								
            default:
                Object[] defaultParams = (Object[]) params;
                return executeCommand(defaultParams);
        }
    }

위 코드를 보면 commandType이 2번일 때 setRingerMode(0)을 호출하여 강제로 무음 모드로 만든 뒤 기기를 잠그고, 3번일 때는 몰래 전화를 거는 등 사용자의 조작을 방해하거나 은밀하게 악성 행위를 수행하는 로직이 포함되어 있습니다. 통신 기법이 공격자의 “입·출구”라면 이런 명령 분기 로직은 기기 내부에서 실제 피해를 만들어 내는 “두뇌” 역할을 합니다.

주요 기능 상세 분석

마지막으로 위와 같은 통신 및 명령 처리 구조를 기반으로 실제 현장에서 관찰된 주요 명령어와 그에 대응하는 악성 기능을 정리해 보겠습니다.

분석된 샘플에서 확인된 실제 명령어와 해당 악성 행위 목록은 다음과 같습니다. 단순 정보 수집을 넘어 감염 기기를 완전히 장악하기 위한 다양한 기능이 포함되어 있습니다.

명령(Command) 악성 행위(Malicious Activity)
sendSms SMS 발송 (파라미터 기반, 스미싱 유포 등)
setWifi Wi-Fi 설정 변경
gcont 연락처 전체 수집
lock 디바이스 잠금 및 무음 모드 강제 설정
bc 브로드캐스트 명령 (파일 업로드 트리거 등)
setForward 통화 착신 전환(Call Forwarding) 설정
getForward 통화 착신 전환 정보 반환 및 확인
hasPkg 특정 패키지(보안 앱, 금융 앱) 설치 여부 확인
setRingerMode 벨소리/진동/무음 모드 설정 (전화 수신 은폐)
setRecEnable 녹음 활성화 설정 (도청)
reqState 디바이스 상태 정보 수집 및 전송
showHome 홈 화면으로 강제 이동 (사용자 조작 방해)
getnpki NPKI(공인인증서) 파일 압축 및 탈취
http HTTP 서버 기능 구동 (피싱 페이지 표시)
call 원격 전화 발신 (무음 모드)
get_apps 설치된 앱 목록 수집
ping 네트워크 Ping 테스트 (연결 확인)
getPhoneState IMSI, Serial, AndroidID 등 고유 식별값 수집
get_gallery 갤러리 파일 목록 조회
get_photo 특정 사진 파일 가져오기

결론

오늘은 2025년 안드로이드 위협의 핵심인 MaaS, 진화하는 스파이웨어, 그리고 RAT에 대해 심층적으로 알아보았습니다. 최근 연구에 따르면 MaaS 모델이 공격자의 진입 장벽을 크게 낮추면서 누구나 사이버 위협의 표적이 될 수 있는 시대가 되었습니다. 특히 스마트폰이 우리를 감시하는 도구가 될 수 있다는 사실은 매우 우려스러운 현실입니다.

하지만 두려움에 머물지 말고 위협에 대해 정확히 인지하고 철저히 예방하는 것이 무엇보다 중요합니다. 문자 메시지에 포함된 링크는 항상 의심하고 꼭 공식 앱이나 기관의 대표 번호를 통해 확인하는 습관을 길러야 합니다. ‘무료 앱’이나 ‘전용 뷰어’ 같은 유혹에 흔들리지 말고 공식 앱 마켓 외의 출처에서 앱 설치는 반드시 피해야 합니다.

감염 의심 증상이 포착된다면 즉시 비행기 모드로 전환하여 외부와의 연결을 차단하고, 신뢰할 수 있는 모바일 백신으로 철저히 점검해야 합니다. 필요하다면 공장 초기화와 전문가의 도움도 권장됩니다. 운영체제와 앱을 항상 최신 버전으로 유지하고 강력한 비밀번호와 2단계 인증을 통해 개인정보를 보호하는 기본 수칙도 반드시 준수해야 합니다.

또한 신속한 위협 대응을 위해 OnAV와 같은 신뢰할 수 있는 모바일 백신 사용을 강력히 추천합니다. OnAV는 AI 기반의 탐지 기술로 스미싱, 스파이웨어, RAT 등 다양한 악성 앱으로부터 스마트폰을 효과적으로 보호하며, 실시간 감시와 자동 검사로 잠재적 위협을 사전에 차단합니다.

안전한 모바일 환경은 기술적 대비뿐 아니라 사용자 여러분의 작은 관심과 실천이 더해질 때 완성됩니다. 시큐리온은 여러분의 소중한 디지털 일상을 지키기 위해 최선을 다하겠습니다.

안전하고 행복한 연말연시 보내시길 기원합니다.


IoC

MD5 hash
f4d195bb00bf0be8e10a49773b350f40
3f5bf768b663a94c81081664e35c0329
f6f589d1a0a189aded4d008b671be0db
4bff84935397ada96b9164e7fd5e3d65
94bca3926cd70f60d54be7218dd7ac55

You May Also Like

가상화 난독화 NMMP를 의미로 복원하는 방법 - PART2
가상화 난독화 NMMP를 의미로 복원하는 방법 - PART2

이 글은 보안 분석가, 리버스 엔지니어, 안드로이드 앱의 내부 동작 원리에 깊은 관심이 있는 개발자를 대상으로 합니다.

이 글은 보안 분석가, 리버스 엔지니어, 안드로이드 앱의 내부 동작 원리에 깊은 관심이 있는 개발자를 대상으로 합니다.