Expo Love (APK 미확보) 상세 분석 보고서

Expo "LOVE" 앱 심층 분석 보고서

> 보고서 버전: v3.0 (ML Gold Standard 14-Phase 확장)

> 분석 일자: 2025-12-14

> 최종 갱신: 2026-02-14

> 분석 기관: 주식회사 아크링크 (378-88-03382)

> 분석가: [비공개] 대표

> 위협 등급: CRITICAL

> 프레임워크: Expo SDK 54.0.0 / React Native 0.81.5 (Hermes v96)

> 분석 Phase: 14 Phases 완료

> MITRE ATT&CK: T1437, T1418, T1432, T1533, T1521

1. 앱 기본 정보

항목 · 값

**앱 이름** · LOVE

**개발자 계정** · @hhseong/LOVE

**프로젝트 ID** · 1cbf9a4e-61c3-4c83-82c5-5d61a8fffec9

**업데이트 그룹** · 8c4d4f91-b014-4097-9d76-2ac547953b2c

**매니페스트 ID** · 856c35be-8ceb-4fba-baec-7ec45732d5f6

**생성 일자** · 2025-12-10T08:44:28.944Z

**SDK 버전** · Expo SDK 54.0.0

**런타임 버전** · 1.0.0

**브랜치** · main

**패키지명** · com.anonymous.LOVE

**compileSdkVersion** · 36 (Android 16 Preview)

**프레임워크** · React Native 0.81.5 + Hermes JS Engine v96

**번들 형식** · Hermes JavaScript Bytecode (v96)

**번들 크기** · 1,381,520 bytes (1.32MB)

**에셋 수** · 28개 이미지 (프로필 사진 5장 + UI 요소)

**네이티브 ABI** · arm64-v8a, armeabi-v7a, x86, x86_64

**네이티브 라이브러리** · 13개 (.so 파일)

1.1 Expo 프레임워크 특성

이 앱은 전통적인 APK가 아닌 Expo Go 플랫폼 위에서 실행되는 JavaScript 번들이다. 피해자에게 Expo Go 앱 설치를 유도한 후, preview URL을 통해 악성 코드를 로드하는 방식이다. 이는 Google Play Protect 등 기존 보안 솔루션을 완전히 우회하는 신종 배포 기법이다.

배포 URL:

```

[비공개]

```

번들 다운로드 URL:

```

[비공개]

```

Expo Go 임베디드 매니페스트:

```json

{

"id": "856c35be-8ceb-4fba-baec-7ec45732d5f6",

"createdAt": "2025-12-10T08:44:28.944Z",

"runtimeVersion": "1.0.0",

"launchAsset": {

"key": "bundle",

"contentType": "application/javascript",

"url": "file:///android_asset/embedded_project/bundle.js"

},

"metadata": {

"updateGroup": "8c4d4f91-b014-4097-9d76-2ac547953b2c",

"branchName": "main"

},

"extra": {

"expoClient": {

"name": "LOVE",

"slug": "LOVE",

"version": "1.0.0",

"sdkVersion": "54.0.0",

"platforms": ["android"],

"orientation": "portrait"

},

"scopeKey": "@hhseong/LOVE"

}

}

```

1.2 Hermes 바이트코드

번들은 Hermes JavaScript Engine v96 바이트코드로 컴파일되어 배포된다. 이는 소스코드의 직접 열람을 방지하지만, 문자열 추출과 디컴파일이 가능하다. 13,423줄의 문자열이 추출되었으며, 이 중 악성 행위 관련 문자열이 다수 식별되었다.

1.3 독립 APK 빌드 정보

항목 · 값

**빌드 유형** · React Native CLI (Expo Prebuild)

**메인 컴포넌트** · "main" (ReactActivity)

**Kotlin 버전** · Metadata v2.1.0

**새 아키텍처** · 비활성 (newArchEnabled: false)

**Expo Updates** · CHECK_ON_LAUNCH: ALWAYS

**SoLoader** · 활성화 (com.facebook.soloader.enabled: true)

2. 권한 분석

2.1 AndroidManifest.xml 선언 권한

독립 빌드 APK의 AndroidManifest.xml에서 확인된 명시적 권한:

권한 · 위험도 · 용도

`INTERNET` · Normal · C2 서버 통신

`READ_CONTACTS` · **Dangerous** · 연락처 전체 탈취

`WRITE_CONTACTS` · **Dangerous** · 연락처 조작/위변조

`READ_EXTERNAL_STORAGE` · **Dangerous** · 파일/사진 탈취

`WRITE_EXTERNAL_STORAGE` · **Dangerous** · 파일 시스템 조작

`SYSTEM_ALERT_WINDOW` · Special · 다른 앱 위에 표시 (피싱 오버레이)

`VIBRATE` · Normal · 사용자 주의 환기

2.2 번들 내 Expo Go 런타임 권한 요청

Hermes 바이트코드 문자열 추출에서 발견된 Expo Go 런타임 권한:

권한 · 위험도 · 피해 시나리오

`READ_CONTACTS` · **Critical** · [피해자 정보 비공개] 연락처를 C2 서버로 전송

`CALL_PHONE` · **Critical** · [피해자 정보 비공개] 전화 발신, 과금 유발

`READ_PHONE_STATE` · **High** · IMEI, 전화번호 수집으로 [피해자 정보 비공개]

`WRITE_CALL_LOG` · **High** · 통화 기록 위변조로 증거 인멸

`READ_CALL_LOG` · **High** · 통화 기록 전체 탈취

`READ_EXTERNAL_STORAGE` · **High** · 사진, 문서 등 파일 탈취

`CAMERA` · **High** · 원격 카메라 촬영으로 사생활 침해

`ACCESS_BACKGROUND_LOCATION` · **High** · 백그라운드 실시간 위치 추적

`ACCESS_COARSE_LOCATION` · **High** · 대략적 위치 추적

`SEND_SMS` · **Critical** · [피해자 정보 비공개] 악성 문자 발송

`WRITE_CALENDAR` · Medium · 캘린더 데이터 조작

`BLUETOOTH_CONNECT` · Medium · 블루투스 디바이스 연결 정보 수집

`BLUETOOTH_ADVERTISE` · Medium · 블루투스 광고 패킷 송출

`BLUETOOTH_SCAN` · Medium · 주변 블루투스 장치 스캔

`NEARBY_WIFI_DEVICES` · Medium · 주변 WiFi 장치 스캔

`UWB_RANGING` · Low · Ultra-Wideband 거리 측정

`BODY_SENSORS_BACKGROUND` · Medium · 백그라운드 신체 센서 데이터

`GET_ACCOUNTS` · Medium · 기기 계정 정보 수집

`USE_SIP` · Medium · SIP 통화 기능 악용

`ACCEPT_HANDOVER` · Medium · 통화 전환 가로채기

`RECEIVE_WAP_PUSH` · Medium · WAP 푸시 메시지 수신

`RECEIVE_MMS` · Medium · MMS 메시지 수신

2.3 Expo Contacts 라이브러리 사용

번들에서 expo-contacts 라이브러리의 다음 API 호출이 확인됨:

· _addContactAsync - 연락처 추가 (허위 연락처 주입 가능)

· _addExistingContactToGroupAsync - 그룹에 연락처 추가

· ContactsChangeEventName - 연락처 변경 실시간 감시

· Contacts.getContactByIdAsync - 개별 연락처 조회 (ID 기반 타겟팅)

· getContactsAsync - 전체 연락처 일괄 조회 (벌크 탈취)

· presentFormAsync - 연락처 폼 표시 (소셜 엔지니어링)

· removeContactAsync - 연락처 삭제 (증거 인멸)

· addContactChangeListener - 연락처 변경 이벤트 리스너

2.4 권한별 피해 체인

```

READ_CONTACTS -> 연락처 탈취 -> POST [비공개] -> 보이스피싱 DB 등록

WRITE_CONTACTS -> 허위 연락처 주입 -> [피해자 정보 비공개] 유발

CAMERA -> 사진 촬영 -> 협박 소재 확보 -> 금전 갈취

ACCESS_BACKGROUND_LOCATION -> 실시간 추적 -> 물리적 위협

CALL_PHONE -> 해외 유료 전화 -> 금전 피해

SEND_SMS -> 악성 링크 발송 -> 2차 피해 확산

WRITE_CALL_LOG -> 증거 인멸 -> 수사 방해

READ_CALL_LOG -> 통화 패턴 분석 -> 맞춤형 피싱

SYSTEM_ALERT_WINDOW -> 피싱 오버레이 -> 인증정보 탈취

```

2.5 권한 요청 전략 분석

번들 문자열에서 _requestPermissionsAsync 패턴이 확인됨. Expo의 권한 요청 API를 사용하여 단계적으로 권한을 요청하는 전략이다:

1. 초기 진입: 매력적인 프로필 UI로 신뢰 구축

2. 1차 권한: READ_CONTACTS (핵심 탈취 대상)

3. 점진적 확대: 위치, 카메라 등 추가 권한 요청

4. 백그라운드 유지: ACCESS_BACKGROUND_LOCATION으로 지속 감시

3. 코드 구조 분석

3.1 프로젝트 아키텍처

```

expo_love_analysis/

├── bundle.js # Hermes 바이트코드 (1,381,520 bytes, v96)

├── bundle_strings.txt # 추출된 문자열 (13,423줄)

├── images/

│ ├── icon.png # 앱 아이콘

│ ├── image1.jpg # 유인용 여성 프로필 이미지 1

│ ├── image2.jpg # 유인용 여성 프로필 이미지 2

│ ├── image3.jpg # 유인용 여성 프로필 이미지 3

│ ├── image4.jpg # 유인용 여성 프로필 이미지 4

│ └── image5.jpg # 유인용 여성 프로필 이미지 5

├── LOVE_rebuild/ # Expo 프로젝트 재구성

│ ├── App.js # React Native 엔트리포인트

│ ├── index.js # 앱 등록

│ ├── package.json # NPM 의존성 정의

│ └── node_modules/ # NPM 의존성

├── LOVE_v2/ # 독립 APK 빌드 버전

│ ├── App.js # React Native 앱

│ ├── package.json # NPM 의존성 정의

│ ├── android/ # Android 네이티브 프로젝트

│ │ └── app/

│ │ ├── src/main/AndroidManifest.xml

│ │ └── debug.keystore

│ └── assets/ # 리소스

├── LOVE_decompiled/ # 디컴파일된 APK 구조 (apktool)

│ ├── AndroidManifest.xml # 매니페스트

│ ├── smali/ # Dalvik 바이트코드

│ ├── smali_classes2/ # 추가 DEX 클래스

│ ├── lib/ # 네이티브 라이브러리 (4 ABI)

│ ├── res/ # 리소스

│ └── assets/ # 에셋

├── LOVE_v2_decompiled/ # v2 빌드 디컴파일

├── expo_go_mod/ # 수정된 Expo Go

│ ├── xapk_extracted/ # XAPK 추출

│ └── expo_go_decompiled/ # Expo Go 디컴파일

│ └── assets/embedded_project/

│ ├── bundle.js # 임베디드 악성 번들

│ ├── manifest.json # Expo 매니페스트

│ └── assets/ # 유인용 이미지 5장

└── 스크린샷 6장 # 분석 증거 화면

```

3.2 Smali 코드 분석

디컴파일된 smali 코드에서 핵심 클래스 구조 확인:

com/anonymous/LOVE/MainActivity.smali (Kotlin):

```smali

.class public final Lcom/anonymous/LOVE/MainActivity;

.super Lcom/facebook/react/ReactActivity;

```

· getMainComponentName() -> "main" 반환

· createReactActivityDelegate() -> ReactActivityDelegateWrapper 사용

· invokeDefaultOnBackPressed() -> SDK 30 이하에서 moveTaskToBack(false) 호출 (뒤로가기 방지)

· SplashScreen 테마 적용 후 onCreate에서 null 번들로 super 호출

com/anonymous/LOVE/MainApplication.smali (Kotlin):

```smali

.class public final Lcom/anonymous/LOVE/MainApplication;

.super Landroid/app/Application;

.implements Lcom/facebook/react/ReactApplication;

```

· ReactNativeHostWrapper로 Expo 모듈 시스템 래핑

· DefaultNewArchitectureEntryPoint -> STABLE 릴리스 레벨

· ApplicationLifecycleDispatcher -> Expo 모듈 생명주기 관리

· ReactNativeApplicationEntryPoint.loadReactNative() -> 네이티브 모듈 로드

3.3 뒤로가기 방지 메커니즘

invokeDefaultOnBackPressed() 메소드 분석:

```

SDK_INT <= 30 (Android 11 이하):

-> moveTaskToBack(false) // 앱을 종료하지 않고 백그라운드로

-> 실패 시에만 super.invokeDefaultOnBackPressed()

SDK_INT > 30 (Android 12+):

-> super.invokeDefaultOnBackPressed() // 정상 동작

```

이는 Android 11 이하 기기에서 사용자가 뒤로가기 버튼으로 앱을 종료하기 어렵게 만드는 의도적 설계이다. 권한 요청 화면에서 이탈을 방지하는 목적으로 추정된다.

3.4 소셜 엔지니어링 UI

앱은 5개의 이미지를 임베디드 프로젝트에 포함하며(image1.jpg ~ image5.jpg), 매력적인 여성 프로필 사진이다. 로맨스 스캠 패턴으로, 남성 피해자를 유인하여 앱 설치 및 권한 허용을 유도한다.

번들 문자열에서 확인된 UI 컴포넌트:

· react-navigation (Bottom Tabs, Stack Navigator) - 다중 화면 네비게이션

· ScrollView, FlatList - 스크롤 가능한 컨텐츠

· TouchableOpacity, Button - 터치 인터랙션

· Image - 프로필 이미지 표시

· Modal, Alert - 팝업/알림

· StatusBar - 상태바 제어

· galleryScreen, HomeScreen - 갤러리/홈 화면 구현

3.5 NPM 의존성 분석

package.json에서 확인된 의존성:

패키지 · 버전 · 용도 · 위험도

`axios` · 1.13.2 · HTTP 클라이언트 (C2 통신) · **High**

`expo-contacts` · 15.0.11 · 연락처 접근 API · **Critical**

`expo-device` · 8.0.10 · 기기 정보 수집 · **High**

`expo-constants` · 18.0.12 · 앱/기기 상수 접근 · Medium

`expo-status-bar` · 3.0.9 · 상태바 UI 제어 · Low

`@react-navigation/native` · 7.1.25 · 화면 네비게이션 · Low

`@react-navigation/bottom-tabs` · 7.8.12 · 하단 탭 네비게이션 · Low

`react-native-screens` · 4.16.0 · 네이티브 화면 관리 · Low

`react-native-safe-area-context` · 5.6.0 · 안전 영역 제어 · Low

`react` · 19.1.0 · UI 프레임워크 · Low

`react-native` · 0.81.5 · 네이티브 브릿지 · Low

핵심 발견: axios는 HTTP 클라이언트로, C2 서버 [비공개]에 탈취 데이터를 전송하는 데 사용된다. expo-device는 기기 식별 정보(모델명, OS 버전 등)를 수집하여 피해자를 추적하는 데 활용된다.

3.6 번들 내 Axios 설정 분석

번들 문자열에서 발견된 Axios 관련 설정:

```

Axios v1.12.2

xsrfCookieName

X-XSRF-TOKEN

Content-Type

application/x-www-form-urlencoded;charset=UTF-8

multipart/form-data; name="

Accept-Encoding

proxy-authorization

```

Axios의 XSRF 토큰 처리, 다양한 Content-Type 지원, 프록시 인증 헤더 등이 구성되어 있어, 단순한 데이터 전송 외에도 정교한 HTTP 통신이 가능한 상태이다.

4. 네트워크/C2 분석

4.1 C2 서버 정보

항목 · 값

**도메인** · [비공개]

**IP 주소** · [비공개]

**ISP** · SK Broadband (한국)

**서비스명** · MyContactService

**프로토콜** · HTTPS

**TLD** · .space (비주류 TLD - 악성 도메인 선호)

**포트** · 443 (HTTPS 기본)

4.2 API 엔드포인트

메소드 · 엔드포인트 · 용도 · 인증

POST · `[비공개] · 탈취 데이터 업로드 · 없음

4.3 서버 응답 테스트

```bash

$ curl -X POST "[비공개] \

-H "Content-Type: application/json" \

-d '{}'

응답: {"status":"success"}

```

서버가 빈 JSON에도 success 응답을 반환하여, 수신 전용 서버(데이터 싱크홀)임을 확인. 입력 검증이 전혀 없으며, 어떤 데이터든 무조건 수락한다.

4.4 데이터 전송 프로토콜

```

POST [비공개]

Content-Type: application/json

User-Agent: axios/1.12.2

Body: { contacts: [...탈취된 연락처 배열...] }

```

추정 데이터 구조 (expo-contacts API 기반):

```json

{

"contacts": [

{

"id": "1",

"name": "홍길동",

"firstName": "길동",

"lastName": "홍",

"phoneNumbers": [

{ "number": "010-**-**", "label": "mobile" }

],

"emails": [

> [비공개]

],

"addresses": [...],

"birthday": {...},

"company": "..."

}

],

"deviceInfo": {

"brand": "Samsung",

"modelName": "Galaxy S24",

"osVersion": "14"

}

}

```

4.5 Expo 인프라 악용

인프라 · URL · 용도

Expo Dev · expo.dev/preview/update · 앱 배포 링크

Expo CDN · [비공개] · 번들 파일 호스팅

Expo CDN (Classic) · [비공개] · 에셋 호스팅

Expo Updates · expo.dev OTA · 원격 코드 업데이트

공격자는 Expo의 정당한 인프라를 악용하여 악성코드를 배포하고 있음. Expo CDN을 통해 번들이 다운로드되므로, 네트워크 필터링으로 차단이 어려움.

4.6 Expo OTA 업데이트 악용

expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH 값이 ALWAYS로 설정되어, 앱 실행 시마다 OTA 업데이트를 확인한다. 이는 다음 공격 시나리오를 가능하게 한다:

1. 초기 배포: 무해한 앱으로 위장하여 설치 유도

2. OTA 업데이트: 악성 코드를 포함한 업데이트 푸시

3. 실시간 변경: C2 서버 주소, 탈취 대상 데이터를 실시간으로 변경

4. 증거 인멸: 분석 감지 시 무해한 코드로 롤백

5. 방어기제 분석

5.1 방어기제 종합 평가

방어기제 · 수준 · 우회 상태 · 상세

Hermes 바이트코드 · Medium · **우회 완료** · 문자열 추출로 핵심 로직 노출

Expo Go 의존성 · Low · **우회 완료** · 독립 APK 빌드로 해소

CDN 분산 호스팅 · Low · **우회 완료** · 직접 번들 다운로드

HTTPS 통신 · Low · **MITM 가능** · SSL 피닝 없음

에뮬레이터 탐지 · 없음 · N/A · 탐지 코드 미존재

루팅 탐지 · 없음 · N/A · 탐지 코드 미존재

SSL 피닝 · 없음 · N/A · 인증서 고정 없음

코드 난독화 · Low · **디컴파일 완료** · Hermes 외 추가 난독화 없음

뒤로가기 방지 · Low · **분석 완료** · SDK 30 이하에서만 동작

OTA 업데이트 · Medium · **분석 완료** · ALWAYS 체크 설정

5.2 에뮬레이터 탐지

없음. Expo Go 기반이므로 에뮬레이터에서도 정상 실행됨. 번들 문자열에서 에뮬레이터 감지 관련 코드가 발견되지 않음.

5.3 루팅 탐지

없음. Expo Go 앱의 기본 보안만 의존. SafetyNet, Play Integrity 등의 API 호출 없음.

5.4 코드 보호 수준 평가

전반적으로 방어기제가 매우 약함. Hermes 바이트코드 외에는 특별한 보호 기법이 적용되지 않았으며, 이는 앱의 빠른 배포와 대량 유포에 초점을 맞춘 것으로 보임. 개발자의 기술 수준은 중급이나, 보안에 대한 투자는 최소한으로 판단됨.

6. SSL/TLS 보안 분석

6.1 SSL 피닝 부재

검증 항목 · 결과 · 위험도

인증서 피닝 (Certificate Pinning) · **미구현** · Critical

공개키 피닝 (Public Key Pinning) · **미구현** · Critical

OkHttp CertificatePinner · **미사용** · High

TrustManager 커스텀 · **미사용** · High

Network Security Config · **미구현** · High

6.2 MITM 공격 가능성

Expo 앱은 React Native의 기본 HTTP 클라이언트(Fetch API / XMLHttpRequest)와 Axios를 사용한다. SSL 피닝이 구현되지 않았으므로, mitmproxy, Burp Suite 등의 프록시 도구로 모든 HTTPS 트래픽을 가로챌 수 있다.

MITM 공격 절차:

```

1. 프록시 CA 인증서를 기기에 설치

2. WiFi 프록시 설정을 MITM 프록시로 지정

3. 앱 실행 → 모든 HTTPS 요청이 프록시를 경과

4. [비공개] 요청 본문 캡처 가능

5. 요청 변조/차단 가능

```

6.3 네트워크 보안 설정

AndroidManifest.xml에 android:networkSecurityConfig 속성이 없음. 이는 Android 9+ 기본 설정(cleartext 차단)에 의존하지만, HTTPS 트래픽에 대한 추가 보호는 없음.

6.4 Axios 보안 설정 분석

번들 문자열에서 확인된 Axios 보안 관련 설정:

· xsrfCookieName: XSRF 토큰 쿠키명 설정 (서버 측 CSRF 보호)

· X-XSRF-TOKEN: XSRF 헤더 자동 첨부

· proxy-authorization: 프록시 인증 헤더 지원

그러나 이들은 클라이언트-서버 간 보안이 아닌 Axios 프레임워크의 기본 기능일 뿐, 실제 SSL 보안 강화에는 기여하지 않음.

7. 데이터 탈취 분석

7.1 탈취 데이터 유형

데이터 유형 · 수집 API · 전송 엔드포인트 · 확인 상태

**연락처 전체** · expo-contacts · POST /backup · **확인됨**

**기기 정보** · expo-device · POST /backup · **확인됨**

사진/미디어 · READ_EXTERNAL_STORAGE · 미확인 · 추정

위치 정보 · ACCESS_BACKGROUND_LOCATION · 미확인 · 추정

전화번호/IMEI · READ_PHONE_STATE · 미확인 · 추정

통화 기록 · READ_CALL_LOG · 미확인 · 추정

SMS 발송 · SEND_SMS · 미확인 · 추정

7.2 연락처 탈취 상세 흐름

```

1. 앱 실행 -> 매력적인 여성 프로필 사진 표시 (소셜 엔지니어링)

2. 네비게이션: HomeScreen -> GalleryScreen (프로필 갤러리)

3. "연락처 접근" 권한 요청 다이얼로그 표시

4. 피해자가 "허용" 클릭

5. expo-contacts API로 전체 연락처 조회

· getContactsAsync() -> 전체 연락처 벌크 수집

· getContactByIdAsync(id) -> 개별 연락처 상세 조회

6. JSON 형식으로 직렬화

7. Axios를 통해 POST [비공개] 으로 전송

Headers: { "Content-Type": "application/json" }

Body: { contacts: [

{ name: "...", phone: "010-XXXX-XXXX", ... },

...

]}

8. 서버 응답: {"status":"success"}

9. addContactChangeListener() 등록 -> 연락처 변경 실시간 감시

```

7.3 expo-device를 통한 기기 핑거프린팅

expo-device 모듈(v8.0.10)로 수집 가능한 정보:

항목 · API · 예시

기기 브랜드 · Device.brand · "Samsung"

기기 모델 · Device.modelName · "Galaxy S24 Ultra"

디자인명 · Device.designName · "e3q"

OS 이름 · Device.osName · "Android"

OS 버전 · Device.osVersion · "14"

총 메모리 · Device.totalMemory · 12884901888

기기 유형 · Device.deviceType · PHONE

제조사 · Device.manufacturer · "Samsung Electronics"

이 정보는 피해자의 기기를 고유하게 식별하고, 동일 피해자의 중복 데이터를 필터링하는 데 사용될 수 있다.

7.4 2차 피해 체인

탈취된 연락처는 다음과 같은 2차 피해에 활용됨:

1. 보이스피싱 DB 구축: [피해자 정보 비공개] 이름+전화번호로 맞춤형 피싱 공격

2. 스미싱 발송: "OO님이 공유한 사진입니다" 형태의 악성 링크 발송

3. 대출 사기: 연락처 정보를 이용한 신원 도용

4. 협박: "연락처를 유포하겠다"는 형태의 금전 갈취

5. 연쇄 감염: 탈취된 연락처 목록의 모든 번호로 동일 악성앱 URL 발송

9. MITRE ATT&CK 매핑

9.2 킬 체인 분석

```

[정찰] SNS/메신저에서 [피해자 정보 비공개] (로맨스 스캠)

[무기화] Expo 프로젝트 구성 + 악성 번들 빌드

[배포] Expo Preview URL 생성 및 공유

[공격] 피해자 Expo Go 설치 + URL 클릭

[설치] 악성 JavaScript 번들 자동 로드

[명령제어] OTA 업데이트로 코드 실시간 변경

[목표달성] 연락처 탈취 -> [비공개]

[확산] 탈취된 연락처로 2차 스미싱 발송

```

10. Expo 프레임워크 심층 분석

10.1 Expo Go 악용 메커니즘

Expo Go는 개발자를 위한 정당한 도구이지만, 공격자에 의해 다음과 같이 악용된다:

정상 사용 · 악용 패턴

개발 중인 앱 미리보기 · 악성앱 배포 채널

OTA 업데이트로 빠른 반복 · 악성 코드 실시간 변경

Expo CDN으로 에셋 호스팅 · 악성 번들 은닉 호스팅

네이티브 모듈 접근 · 위험 권한 요청 수단

10.2 Expo SDK 54.0.0 분석

구성요소 · 버전 · 역할

Expo SDK · 54.0.0 · 코어 프레임워크

React Native · 0.81.5 · 네이티브 브릿지

React · 19.1.0 · UI 렌더링

Hermes · v96 · JS 엔진

Metro Bundler · 내장 · 번들 빌드

10.3 Expo 모듈 시스템 분석

번들 문자열에서 확인된 Expo 네이티브 모듈:

모듈 · 경로 · 악용 가능성

`expo-contacts` · expo.modules.contacts · **핵심 악용 모듈**

`expo-device` · expo.modules.device · **기기 핑거프린팅**

`expo-constants` · expo.modules.constants · 앱 메타데이터 접근

`expo-file-system` · expo.modules.filesystem · 파일 시스템 접근

`ExpoModulesCore` · expo.modules (Native) · 모듈 브릿지

`ReactActivityDelegateWrapper` · expo.modules · 액티비티 래핑

`ReactNativeHostWrapper` · expo.modules · RN 호스트 래핑

`ApplicationLifecycleDispatcher` · expo.modules · 생명주기 관리

10.4 Expo Go 내 임베디드 프로젝트 구조

```

expo_go_decompiled/assets/embedded_project/

├── bundle.js # 악성 Hermes 바이트코드 (1.3MB)

├── manifest.json # Expo 매니페스트 (scopeKey: @hhseong/LOVE)

└── assets/

├── image1.jpg # 유인용 이미지 1

├── image2.jpg # 유인용 이미지 2

├── image3.jpg # 유인용 이미지 3

├── image4.jpg # 유인용 이미지 4

└── image5.jpg # 유인용 이미지 5

```

10.5 Expo Go 디컴파일 부가 발견

Expo Go XAPK 디컴파일에서 발견된 추가 에셋:

· expo-root.pem - Expo 루트 인증서

· ds-visa.crt, ds-mastercard.crt, ds-amex.pem - 결제 관련 인증서 (Stripe 연동)

· kernel.android.bundle - Expo 커널 번들

· kernel-manifest.json - 커널 매니페스트

· ML 바코드 모델 (barcode_ssd_mobilenet_v1_dmp25_quant.tflite)

· 얼굴 인식 모델 (blazeface.tfl, BCLjoy_200.emd 등)

이는 Expo Go 자체의 기능이지만, 악성앱이 이를 활용하여 바코드 스캔, 얼굴 인식 등 추가 데이터 수집이 가능함을 의미한다.

11. 네이티브 라이브러리 분석

11.1 네이티브 SO 라이브러리 목록

LOVE_decompiled/lib

본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr