
요약
DOCSWAP 악성 앱의 최신 유포 경로와 새로운 버전의 APK 파일을 다수 확보해 분석했다.
악성 앱은 내부에 암호화된 APK 파일을 복호화해 C&C 서버와 통신하며 RAT 기능을 수행하는 악성 서비스를 등록한다.
공격자는 새로운 네이티브 복호화 함수를 추가했으며, 미끼 동작도 다양화했다.
C&C 서버 공유, 한글 주석 등 Kimsuky의 공격으로 추정되는 단서가 다수 발견되었다.
1. 개요
지난 2025년 9월, 엔키화이트햇 위협연구팀은 피싱 사이트를 통해 유포되는 악성 모바일 앱을 발견했다. 공격자는 QR코드와 알림 창을 이용해 피해자가 모바일 환경에 악성 앱을 설치 및 실행하도록 유도했다.
분석 결과 확보한 악성 앱은 2025년 3월 S2W에서 “DOCSWAP”으로 명명한 악성 앱의 최신 버전으로, 기존 악성 앱과 동작은 동일하지만 내부 APK 복호화 과정이 상이하다. 또한 분석 과정에서 북한 배후 공격 그룹인 Kimsuky와의 연관성도 다수 확인되었다.
추가로 APK 파일 메타데이터와 인프라 유사성을 토대로 추가 악성 앱 3개와 공격자 C&C 서버 7개를 확보했다. 이 과정에서 공격자는 악성 앱마다 다양한 테마의 미끼용 동작을 추가해 피해자가 의심하지 않도록 설계했다.
2. 공격 분석

caption - 공격 개요도
2.1. 악성 앱 유포 경로
악성 앱 유포는 27.102.137[.]181 에서 배송 업체를 사칭한 QR 코드로 이뤄진 것을 확인하였다. 조사 중 발견된 4 개의 악성 앱 중 2 개가 배송 업체를 사칭하였는데, 과거 ESTSecurity의 보고서 사례에는 배송 업체를 사칭한 스미싱으로 피해자에게 악성 앱 유포 URL을 전송했다. 따라서 과거 사례와 유사하게 초기 접근에 스미싱 또는 피싱 이메일을 이용하였을 것으로 추정된다. 확인된 URL은 아래와 같다.
hxxps://27.102.137[.]181/store/tracking.php?id=[base64 인코딩 된 이메일 주소]
hxxps://27.102.137[.]181/store/delivery.html

caption - 모바일 접속 유도 QR코드
PC 환경에서 URL에 접속하면 “보안상의 이유로 PC에서는 조회할 수 없습니다.”라는 문구를 띄워 QR코드를 통해 스마트폰으로 접속하도록 유도한다. 분석 당시 QR코드와 연결된 경로가 서버에 존재하지 않아 정상적으로 접속되지는 않았다. QR코드 URL은 아래와 같다.
hxxps://delivery.cjlogistics[.]kro[.]kr/loing/tracking.php?id=dGVzdEBuYXZlci5jb20=
User-Agent를 안드로이드 환경 값으로 설정해 URL에 접속하면 공격자가 설계한 유포 과정이 드러난다. tracking.php 파일 자체에 요청의 User-Agent에 따라 다른 사이트를 로드하는 기능이 포함된 것으로 보인다. 유포 과정에서 확인된 화면은 다음과 같다.

caption - 가짜 보안 검사 화면

caption - 보안 앱 설치 버튼
“보안앱 설치하기” 버튼을 클릭하면 Base64 인코딩된 URL로 접속해 APK를 다운로드 한다. 디코딩된 URL은 아래와 같다.
hxxps://27.102.137[.]181/store/SecDelivery.APK

caption - 보안 앱 설치 루틴
APK 다운로드와 동시에 downcat.php로 접근 시간과 앱 URL 경로를 포함한 POST 요청을 보내 로그를 남긴다. 해당 루틴에서 “버튼 클릭시 로그 남기기”라는 한글 주석과 “로그 전송 실패”라는 한글 에러 메시지가 확인되었다.

caption - 로그 전송 루틴
2.2. 악성 앱 분석
2.2.1. SecDelivery.apk

caption - 보안배송확인 악성 앱 아이콘
SecDelivery.apk는 내부에 암호화된 APK 파일을 복호화 및 로드한 뒤, 악성 RAT 서비스를 생성하는 APK 파일이다. APK 서명의 유효 시작 시간은 2025년 5월 20일로, 공격자가 악성 앱을 제작하고 테스트 또는 공격에 사용한 시기는 이와 비슷할 것으로 추정된다. APK 서명 정보는 아래 표와 같다.
caption - APK 서명 정보
2.2.2. 리소스 복호화 & 서비스 생성
AndroidManifest.xml 파일에서 SplashActivity가 MAIN activity로 설정되어 있다. 앱 실행 시 SplashActivity에 의해 APK 내부에 암호화된 리소스가 로드되고, 악성 행위에 필요한 각종 권한을 획득한 뒤 악성 서비스를 등록한다.

caption - AndoridManifest.xml MAIN activity
암호화된 APK파일은 리소스 영역의 security.dat 파일로 저장되어 있다. 이전 “DOCSWAP”사례에서는 내부 APK 복호화 시 Java 코드 상에서 XOR을 수행하지만, 이번 사례의 경우 공격자가 추가한 네이티브 라이브러리를 이용한다.
loadPluginAPK 메소드는 암호화된 APK 파일인 security.dat 파일을 내부 저장소에 security.dat_copy 파일로 저장한 뒤 native-lib 라이브러리의 decryptFile 함수를 이용해 복호화한다.

caption - 내부 APK 로드 루틴
decryptFile 함수는 리소스 영역의 libnative-lib.so 파일을 추출해 직접 확인할 수 있다. decryptFile 함수 내에서 xorDecrypt 함수가 직접적인 복호화를 담당한다. 4바이트 key를 이용한 XOR 복호화만 수행했던 이전 사례와 달리, 약간의 비트 연산이 추가되었다.
xorDecrypt 함수의 알고리즘은 아래와 같다.
바이트 데이터 비트 반전
5비트 ROL 적용
4바이트 key로 XOR

caption - 내부 APK 복호화 루틴
XOR에 사용되는 4 바이트 키는 아래와 같다.
541161FE (hex)
데이터 로드 이후에는 필요한 권한이 확보되었는지 확인한다. 필요한 권한이 모두 획득된 상태이면 곧바로 새로 로드한 APK 파일의 MainService를 “com.delivery.security.MainService” 서비스로 등록한다. AndroidManifest.xml에 등록된 앱의 권한은 아래와 같다.
서비스 등록과 동시에 기존 앱은 AuthActivity를 실행한다. AuthActivity는 OTP 인증 창으로 위장되어 있으며 배송 번호를 이용한 본인 확인이 진행된다. 배송 번호는 APK 내부에 “742938128549” 으로 하드코딩 되어 있으며, 초기 접근 시 악성 앱 유포 URL과 함께 전달되었을 것으로 추정된다. 배송 번호를 입력하면 ((int) (Math.random() * 900000.0d)) + 100000으로 계산된 6자리 인증 번호 알림이 표시된다.

caption - 가짜 인증 화면
발급된 인증 번호를 입력하면 MainActivity를 실행한다. MainActivity에선 WebView 설정 및 공식 배송 정보 조회 사이트로의 접속이 이루어진다.

caption - 공식 사이트 리다이렉션 루틴
2.2.3. 내부 APK & 악성 서비스
복호화된 APK 파일은 SecDelivery.apk와 다른 서명이 사용되었다. APK 서명의 유효 시작 시간이 2025년 4월 22일로 기록되어 있어 SecDelivery.apk 개발 전부터 공격에 사용되던 악성 APK임을 알 수 있다. APK 서명 정보는 아래 표와 같다.
caption - APK 서명 정보
복호화된 security.dat에 포함된 MainService는 앞서 SplashActivity에 의해 서비스로 등록되어 반복 동작한다. 또한 아래 액션에 대한 인텐트 필터를 설정해 재부팅 뒤에도 자동으로 MainService를 실행한다.
android.intent.action.BOOT_COMPLETED
android.intent.action.ACTION_POWER_CONNECTED
android.intent.action.ACTION_POWER_DISCONNECTED
Mainservice는 C&C 서버와 연결되어 인포스틸러 및 RAT 역할을 수행한다. RAT가 수행하는 명령은 총 57개로, 명령에 따른 동작은 부록에 “명령 목록”으로 첨부한다.
초기 C&C 서버는 유포 서버와 같은 IP인 27.102.137[.]181:50005 으로 설정되어 있으며, 서버와 통신 시 [ 길이 | Null | Gzip 압축된 payload ] 형태로 데이터를 주고 받는다.

caption - 데이터 전송 루틴
데이터 수신 시 [ 길이 | Null | 명령어 ] 구조로 명령어를 분리하고, 이를 파싱해 알맞은 동작을 수행한다. 명령어 파싱 시 구분자로 “10249” 문자열을 이용한다.
“10256” | “10249” | “arg1” | “10249” | “arg2” → StartAudioRecord(arg1 , arg2 )

caption - 명령어 파싱 루틴
이외에도 접근성 서비스를 통한 키로깅 로직도 실행된다. 키로거는 접근성 이벤트 발생 시 발생한 앱의 아이콘, 패키지 이름, 이벤트 텍스트, 발생 시각을 기록한다. 앱 아이콘 파일은 PNG 파일로 압축된 뒤 Base64 인코딩 되어 키로그에 포함된다.

caption - 앱 아이콘 저장 루틴
기본적으로 작성한 키로그를 내부 저장소 file 경로의 ”/Security/download_[일-월-연도].dat” 경로에 저장한다. 명령에 의해 isOnelineKeylogger 변수가 True로 설정된 경우 작성된 키로그를 서버에 먼저 전송한 뒤 로컬에 저장한다.

caption - 실시간 키로깅 및 키로그 저장 루틴
3. 추가 정보
3.1. 추가 악성 APK 파일
분석 과정에서 유사한 동작을 수행하는 APK 파일 3개가 추가로 발견되었다. 이중 2개는 분석된 파일과 동일한 27.102.137[.]181를 C&C 서버로 사용하였고, 나머지 1개는 분석된 파일과 동일한 APK 서명을 사용했다. 추가로 확보한 3개의 APK 파일 모두 내부에 암호화된 apk 파일을 복호화해 악성 서비스 등록에 이용하며, 각각 다른 유형의 앱으로 위장되었다. 추가 악성 APK 파일의 세부 정보는 아래 표와 같다.
caption - 악성 APK 파일 세부 정보
APK 서명 및 내부 APK 파일의 해시 정보는 아래 표와 같다.
caption - 악성 APK 서명 및 내부 APK 파일 해시 정보
추가 악성 APK 파일 중 27.102.137[.]181를 C&C 서버로 사용한 두 파일은 동일한 APK 서명을 사용했으며, 세부 정보는 아래 표와 같다.
caption - APK 서명 세부 정보
옥션 위장 앱은 사용자가 실행 시 공식 사이트로 리다이렉션 하며, P2B Airdrop 위장 앱은 분석된 악성 앱과 유사한 인증 로직이 존재한다. 이때 입력하는 지갑 주소의 “0x”를 제외한 문자열 길이가 42인 경우 검증을 통과하고, 인증번호 생성 로직은 ((int) (Math.random() * 900000.0d)) + 100000으로 분석된 악성 앱과 같다. 인증 화면의 UI 또한 분석된 악성 앱과 매우 유사하다.

caption - 추가 APK 가짜 인증 화면
VPN 위장 앱의 패키지 명은 “com.bycomsolutions.bycomvpn”으로, 파일 구성과 메타데이터, 코드 루틴 등이 같은 패키지명의 공식 앱과 매우 유사하다. 이는 공격자가 공식 APK에 악성 행위를 추가하고 리패키징해 악성 행위로 사용하려 했음을 보여준다.

caption - 악성 앱의 UIActivity onCreate 메소드

caption - 공식 앱의 UIActivity onCreate 메소드
3.2. 추가 C&C 서버
악성코드 유포 및 C&C 서버로 사용된 27.102.137[.]181과 같은 JARM값을 가지며, http 포트가 열려 있는 다우 기술 소속 ip를 조사한 결과 공격자가 사용한 추가 인프라를 확인할 수 있었다. 여기에는 Airdrop 인증 위장 앱의 C&C 서버로 사용된 27.102.137[.]180이 포함되어 있다. JARM과 검색된 C&C 서버는 아래 표와 같다.
caption - JARM 해시가 동일한 IP
확인된 C&C 서버 중, 27.102.137[.]106에서 옥션 악성 앱을 유포하는 피싱 사이트가 발견되었다. CJ 사례와 동일하게 피해자가 컴퓨터로 링크에 접속하면 모바일로 접속 가능하다는 알림을 띄워 모바일 접속을 유도한다. 본 글 사례와 같이 QR코드를 이용해 모바일 접속을 유도하지는 않았다. URL은 아래와 같다.
hxxp://27.102.137[.]106/tracking.php?id=[이메일 주소 base64 인코딩]
hxxp://27.102.137[.]106/mobile.html

caption - 모바일 접속 유도 알림
본 글 사례와 동일하게 User-Agent로 우회 시 APK 설치 안내 메세지가 나타난다. 안드로이드는 기본적으로 공식 앱스토어가 아닌 곳에서 다운로드된 출처를 알 수 없는 앱의 설치를 차단하며, 보안 경고를 띄운다. 공격자는 이를 인지하고 정식 배포된 안전한 앱으로 피해자를 속여 경고를 무시하고 설치하도록 유도한다.

caption - 악성 APK 설치 시 안내 문구
경고창의 확인 버튼 클릭 시 분석된 CJ 악성 앱과 동일하게 같은 서버의 downcat.php로 로그를 전송한다. 이후 같은 C&C 서버에서 auction_8.7.01.APK를 다운로드 하는데, 해당 루틴에서 “APK 다운로드 시작”이라는 한글 주석이 확인되었다.

caption - 로그 전송 및 악성 앱 다운로드 루틴
3.2.1 네이버 피싱 사이트
27.102.137[.]180를 제외한 모든 추가 C&C 서버에서 프록시 서버 형태의 네이버 피싱 사이트가 확인되었다. wreply 인자로 피해자 이메일, m 인자로 프록시 URL이 전달된다. 이때 프록시를 통해 띄우는 사이트 URL을 URL 인코딩 후 ROT13 처리를 한 뒤에 전달해야 프록시 사이트가 정상적으로 로드된다. 예시 URL과 나타나는 로그인 화면은 아래와 같다.
hxxp://27.102.137[.]181/users2/?wreply=qwer@naver.com&m=uggcf%3N%2S%2Savq.anire.pbz%2Savqybtva.ybtva

caption - 네이버 로그인 피싱 화면
로그인 정보 입력 시 입력된 이메일 주소로 새로운 디렉토리를 생성하며 해당 디렉토리에 피해자 정보가 저장된다.

caption - 저장된 피해자 정보
3.2.2. 카카오 피싱 사이트
27.102.137[.]180와 27.102.138[.]181에서는 /login 경로에서 카카오 피싱 사이트가 확인되었다.

caption - 카카오 로그인 피싱 화면
네이버 피싱과 마찬가지로 프록시 형식으로 사이트를 로드하지만, 비밀번호 입력 시 입력된 값을 가로채 pass.php로 POST 전송하는 유출 루틴이 확인되었다.

caption - 비밀번호 유출 루틴
4. APT 그룹 연관성
4.1. Million OK !!!! 피싱 캠페인과 공격 인프라 공유
앞서 악성 앱이 유포된 27.102.137[.]181, 27.102.137[.]106와 Kimsuky의 네이버 피싱 사이트 인프라 사이의 연결점이 확인되었다. 참고한 외부 자료 링크는 아래와 같다.
확인된 피싱 사이트는 Kimsuky의 이전 네이버 피싱 사례와 같은 형식의 인자를 사용하지만, 프록시 사이트의 URL을 ROT13 암호화하는 로직이 추가되었다. 과거 동일 캠페인의 피싱 사이트 URL과 현재 피싱 사이트 URL은 아래 표와 같다.
caption - 과거, 현재 네이버 피싱 URL 비교
피싱 사이트 UI는 과거 네이버 피싱 사례와 동일하다.

caption - 동일한 로그인 피싱 화면
C&C 서버 루트 디렉토리에 접속했을 때 Kimsuky 피싱 인프라의 특징인 “Million OK !!!!” 문구도 확인되었다.

caption - 루트 디렉토리 “Million OK !!!!” 문자열
4.2. html 코드 내의 한글 주석
발견된 APK 유포 웹사이트 html 코드에서 한글 주석과 에러 구문을 확인할 수 있다. 해당 주석들은 로그 생성 및 APK 다운로드 루틴에 포함되어 공격자가 작성했을 가능성이 매우 높다. 이는 한글을 사용할 줄 아는 공격자가 작성한 코드임을 드러낸다.

caption - CJ 악성 앱 유포 사이트의 한글 주석

caption - 옥션 악성 앱 유포 사이트의 한글 주석
5. 대응 방안
5.1. 링크 주소 재확인 등 주의 필요
본 글 사례에서는 악성코드 유포 방법을 확인하지 못했지만, 공격자는 문자 메세지 또는 이메일을 통해 피해자에게 악성 앱 다운로드 링크를 전송한 것으로 추정된다. 모바일로 URL에 접속하면 바로 악성 모바일 앱 다운로드가 이루어지지만 모바일 이외의 다른 기기로 URL에 접속하면 QR 코드를 띄웨 모바일로 URL에 접속하도록 유도한다.

caption - QR코드 인식 시 나타나는 악성 링크
링크를 클릭하는 것 만으로 악성 앱이 실행되지는 않지만, 공격자는 잘 꾸며진 피싱 사이트 등을 통해 피해자가 악성 앱을 실행하거나 개인 정보를 입력하도록 설계한다. 따라서 피해를 예방하기 위해서는 모르는 사람이 보낸 링크는 되도록 클릭하지 않고, 아는 지인에게서 온 링크라도 평소와 다른 내용이거나 의심스럽다면, 클릭하기 전에 먼저 연락하여 확인하는 과정을 거쳐야 한다.
5.2. 앱 사용 시 최소 권한 원칙 적용
안드로이드 앱이 시스템 기능에 접근하기 위해서는 사용자가 해당하는 런타임 권한을 허용해야 한다. 일반적으로 악성 앱은 실행과 동시에 파일 액세스, 전화, 문자 등 다양한 권한을 요구한다.

caption - 악성 앱 요청 권한
본 글 사례의 경우 파일 액세스 및 전화 권한은 “보안배송알림”이라는 앱의 목적에서 크게 벗어난다. 또한 정상 앱은 일반적으로 사용자가 특정 권한을 거부해도 해당 권한을 필요로 하는 기능을 실행할 때 권한을 다시 요청하도록 설계되어 일시적인 권한 거부가 앱의 기능에 문제를 일으키지 않는다. 그러므로 사용자는 앱 이용 시 최소 권한 원칙을 적용하여 해당 권한들이 앱 기능에 필수적인지를 보수적으로 판단파는 습관을 가져야 한다.
6. 마치며
본 글에서는 과거 “DOCSWAP”으로 명명된 악성 앱 캠페인의 새로운 APK 파일과 그 유포 경로를 분석하였다. 최초 유포 과정은 확인되지 않았지만, 공격자는 악성 APK 유포 링크를 스미싱으로 유포한 것으로 추정되며, QR코드를 이용해 피해자가 스마트폰에 악성 앱을 다운로드해 실행하도록 유도하였다.
실행된 악성 앱은 과거 사례와 유사한 RAT 서비스를 실행하지만, 내부 APK 파일 복호화에 새로운 네이티브 함수를 사용하고, 다양한 미끼 동작을 추가하는 등 발전된 형태를 보였다.
추가로 “DOCSWAP” 악성 앱과 Kimsuky 사이의 연관성도 명확해졌다. C&C 서버에서 확인된 “Million OK!!!” 문자열 뿐만 아니라, 최근 Kimsuky 피싱 공격과 유사한 형식의 프록시 서버, 피해자 정보 저장 형태까지 제시된 연관성의 확실한 근거가 된다. 추가로, 악성 앱 유포 사이트에서 확인된 한글 주석과 에러 문구는 공격자가 북한 배후 공격 그룹과 관련되어 있음을 보여준다.
오늘날 스마트폰은 재산, 사생활 등 민감한 개인정보를 가득 담은 움직이는 금고가 되었다. 개인의 삶과 가장 맞닿아 있는 모바일 및 웨어러블 환경을 침해해 귀중한 개인정보를 탈취하려는 공격 또한 지속적으로 이루어지고 있다. 이미 스마트폰이 가장 가까운 친구이자 최고의 비서가 된 현대 사회의 개인들은 유사한 공격과 범행 수법을 미리 알고 예방하려는 노력이 필요하다.
7. 부록
부록 A. MITRE ATT&CK
caption - MITRE ATT&CK
부록 B. IOCs
MD5
36677d732da69b7a81a46f9a06c36260 - SecDelivery.APK
3a2a9f205c79ee45a84e3d862884fd72 - auction_8.7.01.APK
27ea7ef88724c51bbe3ad42853bbc204 - vpn APK
86da5e00a9c73c9cb0855805cbc38c4a - airdrop.apk
2b99603cd8e69f82c064856d6ff63996- decrypted CJ security.dat
858588b7c5331c948fb3e84d9b4ddbb7- decrypted auction security.dat
03a117c6cb86859623720e75f839260a - decrypted vpn search.db
2a7dab4c0f6507bc5fd826f9a336d50c - decrypted airdrop security.dat
436287ad0ea3a9e94cd4574d54d0dec5 - mobile.html
c90ee7d3b1226f73044e7ae635493d31 - delivery.html
506e136336ca9d7246caf8c9011fe97e - login.html
C&C
27.102.137[.]10627.102.137[.]18127.102.137[.]9327.102.137[.]21427.102.138[.]16327.102.137[.]18027.102.138[.]181
부록 C. 명령 목록
caption - 명령 목록
부록 D. Scripts
APK 복호화 스크립트
Popular Articles







