국민서비스포털 사칭 보이스피싱 앱 분석

Post image

안녕하세요. 분석팀의 Jiyong입니다.

최근 보이스피싱 범죄가 날로 고도화되고 있습니다. 경찰청 보이스피싱 현항에 따르면 기관사칭형 보이스피싱 발생 건수는 2016년 3,384건에서 2025년 13,323건으로 꾸준한 증가세를 보이고 있으며, 2025년 피해액은 9,884억원에 달합니다. 최근 보이스피싱 범죄는 대부분 악성 앱 설치를 통한 개인정보 탈취로 시작되며, 카드 배송이나 사건 조회 등으로 위장해 피해자의 휴대전화에 악성 앱을 설치하도록 유도하는 방식을 주를 이루고 있습니다.

[그림 1] 기관사칭형 보이스피싱 발생 현황

[그림 1] 기관사칭형 보이스피싱 발생 현황

2026년 3월 27일 국민일보 단독 보도에 따르면, ‘보안의 성역’으로 여겨졌던 Apple App Store에도 정부기관을 사칭한 보이스피싱 앱이 등록된 사실이 확인되었습니다. 해당 앱은 심사를 통과한 후에만 악성 기능이 활성화되는 방식으로 애플의 보안망을 우회한 것으로 분석됐으며 취재가 시작된 직후 삭제 조치되었습니다. 이는 보이스피싱 악성 앱이 더 이상 출처 불명의 APK에만 국한되지 않고 공식 마켓까지 침투하고 있음을 보여주는 사례입니다.

이번 포스팅에서 소개할 국민서비스포털 사칭 보이스피싱 앱이 바로 해당 보도에서 언급된 앱으로, hxxps://www.ksp1301[.]com 피싱 사이트를 통한 APK 유포와 App Store 등록을 통해 안드로이드 및 iOS 사용자 모두를 타겟으로 하였으며 App Store 내 해당 앱은 분석 시점인 2026년 3월 27일 기준 이미 삭제된 상태였습니다. 분석은 피싱 사이트를 통해 유포된 Android APK를 기반으로 진행하였습니다.

[그림 2] App Store에 등록된 국민서비스포털

[그림 2] App Store에 등록된 국민서비스포털

개요

분석 대상 앱은 국민서비스포털이라는 이름으로 유포되는 보이스피싱 악성 앱으로, 패키지명은 antifraud.nd.com입니다. 앱 이름과 패키지명 모두 정상적인 금융·공공 서비스처럼 보이도록 설계되어 있습니다.

특이한 점은 해당 앱이 Flutter 기반으로 제작되었다는 것입니다. Flutter 앱은 Dart 코드가 libapp.so에 AOT 컴파일되어 핵심 로직이 Java 레벨이 아닌 네이티브 라이브러리에 존재합니다. 이로 인해 DEX 파일을 Java 소스코드로 디컴파일하는 JADX만으로는 정적 분석이 어렵습니다. 따라서 Dart 함수 심볼 복구 도구인 Blutter와 IDA를 이용하여 분석을 진행하였습니다. 분석 방법론에 대한 자세한 내용은 별도 포스팅에서 다룰 예정입니다.

[그릠 3] 앱 초기 실행 동작

[그릠 3] 앱 초기 실행 동작

앱 실행 시 형사사법포털을 사칭한 UI가 표시되고 뉴스 및 사건조회 등 정상 공공 서비스와 유사한 화면을 제공하여 피해자가 악성 앱임을 인지하지 못하도록 유도합니다. 간편인증 로그인 버튼을 통해 이름과 주민등록번호 입력을 요구하며 입력 완료 후 실명인증을 사칭한 얼굴인식을 요구합니다.

인증이 완료되면 입력된 개인정보를 기반으로 사칭 공문서를 생성하여 피해자에게 제공함으로써 신뢰를 유도하고, 이와 동시에 백그라운드에서 갤러리 탈취 및 연락처 조작 등의 악성행위가 시작됩니다.

[그림 4] 개인정보 입력 및 생체 인증

[그림 4] 개인정보 입력 및 생체 인증

권한 분석

분석 대상 앱의 AndroidManifest.xml 분석 결과 해당 앱은 아래와 같은 권한을 요청하며, 단순한 공공서비스 앱에서는 불필요한 권한들이 다수 포함되어 있습니다. 특히 CAMERA , READ_CONTACTS , READ_MEDIA_IMAGES , RECORD_AUDIO , WRITE_CONTACTS 권한은 피해자의 갤러리 탈취, 연락처 원격 제어, 실명인증 사칭을 통한 얼굴 촬영 등의 악성 행위에 직접 활용됩니다.

권한 설명
INTERNET 인터넷 접속
ACCESS_NETWORK_STATE 네트워크 연결 상태 확인
READ_CONTACTS 연락처 읽기
WRITE_CONTACTS 연락처 쓰기
CAMERA 카메라 접근
READ_EXTERNAL_STORAGE 외장 저장소 읽기
WRITE_EXTERNAL_STORAGE 외장 저장소 쓰기
READ_MEDIA_IMAGES 미디어 이미지 읽기
RECORD_AUDIO 마이크 접근 및 오디오 녹음
POST_NOTIFICATIONS 알림 전송
WAKE_LOCK 백그라운드 실행 유지
USE_BIOMETRIC 생체인증 접근
USE_FINGERPRINT 지문인증 접근
c2dm.permission.RECEIVE 구글 클라우드 메시지 수신
DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION 앱 내부 자체 정의 권한

[표 1] 요청 권한 목록

악성 행위 분석

갤러리 전체 탈취

앞서 언급했듯이, 개인정보 입력 및 실명인증이 완료되면 백그라운드에서 갤러리 탈취가 시작됩니다. 정적 분석 결과 BBackupAlbumManager::startBackup 함수가 실행되며, 최초 실행 시 갤러리 접근 권한(READ_MEDIA_IMAGES)을 확인한 후 PhotoManager::getAssetPathList()를 통해 기기 내 전체 앨범 목록을 조회합니다.

앨범 목록 조회가 완료되면 아래와 같이 device-count/create 엔드포인트로 갤러리에 있는 총 이미지 개수를 C2 서버에 먼저 전송합니다.

[그림 5] 이미지 개수 전송

[그림 5] 이미지 개수 전송

이후 50개 단위로 이미지를 페이징하여 순차적으로 업로드를 수행하고, BBackupAlbumManager::_uploadPhoto()를 호출하여 C2 서버(api.k-spo[.]app/device/upload)로 전송합니다.

[그림 6] 갤러리 탈취 함수

[그림 6] 갤러리 탈취 함수

실제 트래픽 캡처를 통해 hxxps://api.k-spo[.]app/device/upload?device_id={기기식별자} 엔드포인트로 이미지가 연속적으로 전송되는 것이 확인되었으며, 서버 응답으로 /uploads/photo/ 경로의 저장 URL이 반환되었습니다.

[그림 7] 이미지 전송 패킷 예시

[그림 7] 이미지 전송 패킷 예시

연락처 원격 제어

갤러리 탈취와 병행하여 피해자 기기의 연락처를 원격으로 제어하는 악성 행위를 수행합니다.

정적 분석 결과 BPhoneContactsSyncManager::syncContactsFromServer 함수를 통해 C2 서버(api.k-spo[.]app/contact/my)로부터 조작할 연락처 목록을 수신한 후 FlutterContacts::getContacts()를 통해 기기 내 전체 연락처를 열람 및 수정하고 탈취하는 것을 확인하였습니다.

[그림 8] 기기 내 연락처 탈취 함수

[그림 8] 기기 내 연락처 탈취 함수

[그림 9] 기기에서 탈취된 연락처 목록

[그림 9] 기기에서 탈취된 연락처 목록

특히 금융감독원 민원센터 번호인 1301을 특정 전화번호와 함께 연락처에 저장하는 행위가 확인되었습니다. 이는 피해자가 해당 번호로 전화를 수신할 경우 금융감독원 발신으로 인식하도록 유도하여 보이스피싱 통화에 대한 신뢰도를 높이기 위한 목적으로 판단됩니다.

[그림 10] 피해자 기기에 저장할 연락처 목록 수신

[그림 10] 피해자 기기에 저장할 연락처 목록 수신

[그림 11] 기기에 저장된 연락처 목록

[그림 11] 기기에 저장된 연락처 목록

생체 인식

앱은 실명인증을 사칭한 팝업을 표시하여 피해자에게 얼굴인식을 요구합니다. 정적 분석 결과 showAmountAlterDialog 함수 내부에서 팝업을 호출하며, backDismiss: false 옵션이 설정되어 있어 뒤로가기 버튼으로 팝업을 닫을 수 없도록 강제됩니다. 이는 피해자가 얼굴인식을 거부하기 어렵도록 의도적으로 설계된 것으로 판단됩니다.

[그림 12] showAmountAlterDialog 함수

[그림 12] showAmountAlterDialog 함수

blutter로 복원된 _LiveDetectionContentState 코드에서는 얼굴인식 과정에서 피해자에게 표시되는 안내 문자열이 그대로 확인되었습니다.

[그림 13] b_live_detection_alter.dart 내부 코드

[그림 13] b_live_detection_alter.dart 내부 코드

AndroidManifest.xml에서도 ML Kit Face Detection SDK(com.google.mlkit.vision.face.internal.FaceRegistrar) 탑재가 확인되었습니다. ML Kit Face Detection은 카메라로 촬영된 이미지에서 얼굴을 실시간으로 감지하는 머신러닝 SDK입니다.

[그림 14] AndroidManifest.xml 캡처

[그림 14] AndroidManifest.xml 캡처

libapp.so strings 덤프에서는 얼굴·신분증 이미지 전송용 엔드포인트가 확인되었습니다. 다만 실제 트래픽 캡처 과정에서 해당 엔드포인트로의 전송은 확인되지 않아, 현재 분석 환경에서는 실제로 동작하지 않는 것으로 추정됩니다.

[그림 15] Strings 검색 결과

[그림 15] Strings 검색 결과

관리자 페이지

정적 분석 과정에서 확인된 도메인을 통해 공격자용 관리자 패널이 운영되고 있음을 확인하였습니다. 관리자 패널은 계기반, 관리자 목록, 불법 데이터, 이미지 관리, 내부 메시지, 장치 토큰 목록, 연락처 변경, 콘텍트 렌즈, 팝업 관리 등의 메뉴로 구성되어 있으며, 이를 통해 피해자 기기에서 탈취한 정보를 체계적(?)으로 관리하는 구조임을 알 수 있습니다.

[그림 16] 관리자 패널 메뉴

[그림 16] 관리자 패널 메뉴

탈취된 갤러리 이미지, 연락처 정보, 입력된 개인정보 등이 피해자별로 분류되어 저장되는 구조로 단순한 악성 앱 배포를 넘어 조직적으로 피해자를 관리하고 있음을 알 수 있습니다. 다만 2026년 3월 30일 기준 해당 도메인 접근 시 관리자 패널이 아닌 다른 사이트로 리다이렉트되고 있어, 공격자가 인프라를 변경한 것으로 추정됩니다.

마치며

이번 분석에서는 Flutter 기반 악성 앱이라는 특성상 일반적인 분석 도구만으로는 접근이 어려워 Blutter와 IDA를 사용하는 추가적인 분석 과정이 필요했습니다.

분석 결과를 요약하자면, 이 앱은 국민서비스포털이라는 공신력 있는 공공기관을 사칭하여 피해자의 심리적 신뢰를 악용하는 전형적인 기관사칭형 보이스피싱 앱입니다. 갤러리 전체 탈취, 연락처 원격 제어, 실명인증 사칭을 통한 얼굴인식에 이르기까지 피해자의 개인정보를 체계적으로 수집하고 탈취하는 구조를 갖추고 있습니다.

만약 해당 앱에 감염되었다면 즉시 비행기 모드로 전환하여 추가 정보 유출을 차단하고, 금융기관에 개인정보 유출 사실을 통보한 뒤 모바일 백신으로 악성 앱을 삭제하시기 바랍니다. 그리고 무엇보다 중요한 것은 어떠한 공공기관도 문자나 링크를 통해 앱 설치를 요구하지 않는다는 점을 반드시 기억하시기 바랍니다.

보이스피싱 범죄는 기술적으로 날로 고도화되고 있습니다.
이번 포스팅이 독자분들의 보안 인식을 높이는 데 조금이나마 도움이 되었으면 합니다.

긴 글 읽어주셔서 감사합니다.

You May Also Like

안드로이드 악성코드의 진화: 스파이웨어(Spyware)
안드로이드 악성코드의 진화: 스파이웨어(Spyware)

안녕하세요. Secolt입니다. 어느덧 2025년도 막바지를 향해 달려가고 있습니다. 갑작스럽게 추워진 날씨에 다들 건강 관리는 잘 하고 계신가 …

안녕하세요. Secolt입니다. 어느덧 2025년도 막바지를 향해 달려가고 있습니다. 갑작스럽게 추워진 날씨에 다들 건강 관리는 잘 하고 계신가요? 연말이 다가오면서 거리의 분위기는 들뜨고 있지만, 악성코드 분석가들의 마음은 마냥 편하지는 않습니다. 연말연시는 해커들이 가장 활발하게 움직이는 시기이기도 하니까요.