Expo Go 악성 프로젝트 분석 | 몸캠피싱에서 APK 없이 실행되는 구조와 권한 경계
Expo Go 악성 프로젝트 분석은 일반 APK 분석과 출발점이 다릅니다. 휴대폰에 설치된 네이티브 앱은 정상 개발 도구인 Expo Go이고, 상대가 보낸 QR 또는 딥링크가 그 안에서 별도의 JavaScript 프로젝트를 불러올 수 있기 때문입니다. 따라서 앱 이름만 보는 대신 프로젝트 주소, 실행 시각, 권한 요청, 실제 데이터 접근과 외부 통신 정황을 계층별로 나눠 확인해야 합니다.
핵심 요약 Expo Go 자체는 악성 앱이 아닙니다. 다만 Expo Go에 이미 포함된 네이티브 모듈을 JavaScript 번들이 호출할 수 있고, 사용자가 카메라·마이크·연락처·사진 접근을 허용했다면 해당 범위 안에서 데이터가 처리될 가능성은 생깁니다. 반대로 임의 네이티브 모듈 삽입, 접근성 서비스 장악, 기기 관리자 등록처럼 별도 바이너리와 네이티브 구성이 필요한 기능은 일반적인 Expo Go 프로젝트만으로 구현할 수 없습니다. 분석 결론은 `기능 존재`, `권한 허용`, `실제 접근`, `외부 전송`을 분리해 내려야 합니다.
분석 전제: Expo Go와 열린 프로젝트는 같은 대상이 아닙니다
일반적인 악성 APK는 설치 파일 안에 패키지명, 인증서, 네이티브 서비스, 권한 선언, 내장 주소가 함께 들어 있습니다. 반면 Expo Go 방식에서는 휴대폰에 설치된 네이티브 바이너리와 실제 화면·업무 로직을 제공하는 JavaScript 프로젝트가 분리됩니다. 스토어에서 받은 Expo Go의 패키지 정보만 확인하면 정상 앱 정보만 나오므로, 그것만으로 상대가 열게 한 프로젝트의 동작을 설명할 수 없습니다.
스토어에서 설치되는 Expo Go입니다. 사용 가능한 카메라, 연락처, 미디어 등 네이티브 모듈의 상한선을 결정합니다.
QR·딥링크가 지정한 개발 서버 또는 배포 주소에서 불러오는 매니페스트, JavaScript 번들, 이미지 같은 자산입니다.
카메라·마이크·연락처·사진 접근 여부를 결정합니다. 권한 화면에는 프로젝트명이 아니라 호스트 앱인 Expo Go가 표시될 수 있습니다.
JavaScript는 네트워크 요청을 만들 수 있습니다. 하지만 통신 기능이 있다는 사실과 민감 데이터가 실제 전송됐다는 사실은 별개의 판단입니다.
중요한 오해 “Expo Go가 정상 앱이므로 그 안에서 연 프로젝트도 안전하다”는 결론도, “상대가 Expo Go를 설치시켰으므로 휴대폰 전체가 장악됐다”는 결론도 모두 빠릅니다. 정상 컨테이너와 원격 코드를 분리하고, 원격 코드가 사용할 수 있는 네이티브 기능의 경계를 확인해야 합니다.
네이티브 호스트부터 JavaScript 번들까지의 실행 계층
Expo 공식 문서는 Expo Go를 고정된 네이티브 라이브러리를 포함한 개발용 샌드박스로 설명합니다. 프로젝트의 화면과 로직은 JavaScript 번들에 들어가지만, 그 번들이 새로운 네이티브 코드를 휴대폰에 마음대로 추가하는 것은 아닙니다. 호출하려는 기능이 Expo Go 바이너리에 이미 포함되어 있어야 하며, 민감 기능은 운영체제 권한도 통과해야 합니다.
- 딥링크 수신
QR 또는 메신저 링크가 exp://·exps:// 형태의 주소를 Expo Go로 전달합니다. - 매니페스트 확인
Expo Go는 프로젝트 실행에 필요한 구성 정보와 JavaScript 번들 위치를 확인합니다. 프로젝트명·slug·host 정보는 분석 단서가 될 수 있지만, 화면에 표시된 이름만으로 운영자를 식별할 수는 없습니다. - JavaScript 번들 실행
번들은 React Native 화면을 그리고 네트워크 요청을 만들며, Expo Go에 포함된 네이티브 모듈을 호출할 수 있습니다. - 권한 경계 통과
카메라, 마이크, 연락처, 미디어 라이브러리처럼 민감한 기능은 운영체제의 허용 상태에 영향을 받습니다. - 데이터 처리와 통신
권한과 기능이 모두 충족되면 프로젝트가 데이터를 읽거나 생성할 수 있습니다. 이후 외부 주소로 전송됐는지는 별도의 네트워크·화면·상대 메시지 정황으로 확인해야 합니다.
분석 문장 예시 “Expo Go가 설치되어 있으므로 연락처가 유출됐다”가 아니라, “출처 불명의 Expo 프로젝트가 실행되었고, Expo Go의 연락처 권한이 허용된 상태였으며, 프로젝트 화면에서 연락처 동기화 동작과 외부 전송 정황이 추가로 확인되는지 검토가 필요하다”처럼 조건을 나눠 표현하는 것이 정확합니다.
exp:// 링크와 매니페스트에서 읽어야 할 단서
Expo Go는 개발 환경에서 exp://호스트:포트 형태의 주소를 사용할 수 있고, exps://는 HTTPS 연결에 대응합니다. 경로 중 /--/ 뒤는 프로젝트 내부 딥링크 경로로 사용될 수 있습니다. 이 문자열이 있다는 사실은 Expo 개발 링크라는 의미이지 악성 판정값은 아닙니다.
| 확인 항목 | 분석 가치 | 주의할 해석 |
|---|---|---|
| exp:// 또는 exps:// | Expo Go로 프로젝트를 여는 개발용 링크인지 구분하는 1차 단서 | 프로토콜만으로 정상·악성을 판정하지 않음 |
| 호스트명·IP·포트 | 프로젝트를 제공한 서버의 출처와 실행 시점 연결에 필요 | 사설 IP, 터널 주소, 클라우드 주소는 운영자 신원과 동일하지 않음 |
| /--/ 뒤 경로와 쿼리 | 초대코드, 세션값, 특정 화면 이동 값이 포함됐는지 확인 | 화면에 보이는 값과 인증 토큰을 공개 게시물에 그대로 노출하지 않음 |
| 프로젝트명·slug·아이콘 | 같은 링크나 화면을 분류하고 대화 기록과 대조하는 보조 단서 | 표시명과 아이콘은 쉽게 바뀔 수 있어 신뢰 근거로 단독 사용하지 않음 |
| SDK·runtime 호환 정보 | 어떤 Expo Go 버전에서 번들이 실행될 수 있었는지 판단하는 기술 단서 | 호환된다는 사실은 안전하다는 의미가 아님 |
| 번들·자산 URL | 실행 코드와 화면 자산이 내려온 위치를 연결하는 핵심 단서 | 휴대폰 화면만으로 보이지 않을 수 있으므로 원본 링크와 실행 시각 보존이 중요 |
링크 전체에는 세션값이나 개인 식별용 쿼리가 포함될 수 있습니다. 상담 자료로 보존할 때는 원본을 따로 유지하되, 외부 공유본에서는 민감한 값을 가리는 편이 안전합니다.
Expo Go에서 가능한 기능과 어려운 기능
Expo Go 악성 프로젝트 분석에서 가장 중요한 작업은 과장된 기능 목록을 걷어내는 것입니다. JavaScript가 호출할 수 있는 기능은 Expo Go 바이너리에 미리 포함된 네이티브 모듈로 제한됩니다. 공식 문서상 카메라, 연락처, 미디어 라이브러리 같은 모듈은 Expo Go에 포함되어 있으므로 권한을 허용한 경우 접근 가능성을 검토해야 합니다. 그러나 별도 네이티브 코드가 필요한 기능은 같은 방식으로 추가할 수 없습니다.
| 기능 | 일반 Expo Go 프로젝트 | 판단 조건 | 분석 시 확인할 기록 |
|---|---|---|---|
| 카메라 촬영·영상 생성 | 가능 범위 | 카메라 권한, 영상 음성은 마이크 권한, 관련 모듈 호출 필요 | 권한 상태, 카메라·마이크 사용 표시, 개인정보 보호 대시보드 시각 |
| 연락처 읽기 | 가능 범위 | 연락처 모듈과 운영체제 권한 필요 | Expo Go 연락처 권한, 요청 화면, 상대가 제시한 연락처 표본 |
| 사진·영상 목록 접근 | 가능 범위 | 미디어 권한 범위에 따라 전체·선택 항목·거부로 달라짐 | 전체 허용인지 선택 허용인지, 선택한 항목, 프로젝트 실행 시각 |
| 외부 서버와 HTTP(S) 통신 | 가능 범위 | JavaScript 네트워크 요청으로 가능 | 링크 출처, 통신 시각, 오류 화면, 데이터 사용량 변화 등 보조 정황 |
| 임의 네이티브 라이브러리 추가 | 일반적으로 불가 | Expo Go에 없는 네이티브 코드는 별도 개발 빌드 또는 APK 필요 | Expo Go 외 별도 앱·설치 파일·개발 빌드가 있었는지 |
| 접근성 서비스·기기 관리자·기본 SMS 역할 장악 | 일반 프로젝트만으로 보기 어려움 | 네이티브 선언과 별도 사용자 설정이 필요한 고위험 기능 | 특수 접근 메뉴, 기본 앱 변경, 별도 패키지 설치 기록 |
| Expo Go 삭제 뒤 독립 실행 | 일반적인 구조가 아님 | JavaScript 프로젝트는 호스트 런타임에 의존 | 같은 시각에 설치된 다른 앱, 홈 화면 아이콘, 설치 출처 |
권한 허용은 전송 증거가 아닙니다. 연락처 권한이 허용되어 있으면 읽을 가능성은 생기지만, 특정 프로젝트가 실제로 주소록을 조회하고 특정 서버에 보냈다는 결론에는 실행 시각, 화면 동작, 상대가 가진 표본, 통신 정황 같은 추가 자료가 필요합니다.
몸캠피싱 악용 흐름을 기술적으로 재구성하는 법
이 방식의 특징은 “출처를 알 수 없는 APK를 설치하라”는 경계심을 피하면서 정상 스토어 앱을 먼저 설치하게 할 수 있다는 점입니다. 그러나 분석에서는 상대의 안내 문구보다 실제 이벤트 순서를 우선합니다.
- 신뢰 형성
영상통화 품질 개선, 전용 채팅방 입장, 본인 확인, 오류 복구 같은 이유로 정상 스토어의 Expo Go 설치를 안내합니다. - 프로젝트 주입
QR, 짧은 링크 또는 exp:// 주소를 보내 특정 프로젝트를 Expo Go 안에서 열게 합니다. 이 시점부터 설치된 앱의 출처와 열린 코드의 출처가 갈라집니다. - 정상 화면 위장
영상 연결, 초대코드, 업데이트, 권한 점검처럼 보이는 화면을 JavaScript로 구성해 사용자의 다음 행동을 유도할 수 있습니다. - 런타임 권한 요청
카메라, 마이크, 연락처, 사진 접근 요청을 기능 수행에 필요한 절차처럼 제시합니다. 운영체제 창에는 Expo Go가 요청 주체로 표시될 수 있습니다. - 데이터 처리·외부 통신 가능 구간
허용된 권한과 포함된 모듈 범위에서 데이터를 읽거나 생성하고 네트워크 요청으로 전송할 가능성이 생깁니다. 실제 실행 여부는 별도 자료로 검증합니다. - 압박 단계
상대가 연락처 일부, 캡처 화면, 영상 장면을 제시하며 즉시 행동을 요구할 수 있습니다. 이때 제시 자료가 실제 기기에서 얻은 것인지, 공개 정보·기존 대화·조작 화면인지 분리해 봐야 합니다.
별도 APK 여부가 분기점입니다. Expo Go 설치 이후 다시 APK, 개발 빌드, 프로파일, 접근성 설정, 기본 앱 변경을 요구했다면 Expo Go 프로젝트 분석만으로 끝내면 안 됩니다. 그때는 별도 설치 파일과 패키지를 독립된 분석 대상으로 잡아야 합니다.
삭제 전에 보존할 자료와 증거 수준
불안하다고 Expo Go와 대화방을 먼저 지우면 프로젝트 주소, 실행 화면, 권한 요청 시각을 다시 확인하기 어려울 수 있습니다. 추가 실행은 멈추되, 현재 보이는 기록을 순서대로 남기는 편이 분석에 유리합니다.
- 원본 유도 메시지
Expo Go 설치 안내, QR 원본, 링크 전체, 초대코드, 상대 계정과 전달 시각을 함께 보존합니다. - 프로젝트 식별 화면
최근 프로젝트 목록, 표시명, 아이콘, 오류 문구, 연결 주소가 보이면 화면을 남깁니다. 다시 열기 위해 링크를 누르지는 않습니다. - Expo Go 앱 권한
휴대폰 설정의 Expo Go 앱 정보에서 카메라, 마이크, 연락처, 사진·동영상, 위치 권한 상태를 확인합니다. 허용·거부뿐 아니라 선택 항목만 허용했는지도 구분합니다. - 민감 기능 사용 시각
안드로이드 12 이상이라면 개인정보 보호 대시보드에서 카메라·마이크·위치 접근 시각을 대화 및 실행 시간과 대조합니다. - 추가 설치 흔적
같은 시간대의 다운로드 목록, 설치 기록, 별도 아이콘, 접근성·알림 접근·기기 관리자·기본 앱 변경을 확인합니다. - 상대가 제시한 자료
연락처 캡처, 영상 일부, 파일 목록을 각각 보존해 실제 기기 데이터와 일치하는 범위와 공개 정보로 만들 수 있는 범위를 나눕니다.
| 증거 수준 | 확인된 사실 | 말할 수 있는 범위 | 아직 단정할 수 없는 것 |
|---|---|---|---|
| 1단계 | Expo Go만 설치 | 정상 호스트 앱 설치 | 프로젝트 실행, 권한 사용, 데이터 접근 |
| 2단계 | QR·딥링크로 프로젝트 실행 | 원격 JavaScript 프로젝트가 열린 정황 | 민감 데이터 접근과 외부 전송 |
| 3단계 | 민감 권한 허용 | 해당 기능을 사용할 수 있는 조건 형성 | 실제 조회·촬영·업로드 |
| 4단계 | 대시보드 사용 시각·프로젝트 화면 동작 확인 | 특정 시간대 기능 사용 정황 | 어떤 데이터가 어느 서버로 갔는지 |
| 5단계 | 상대가 비공개 데이터 표본을 제시하거나 통신 자료가 일치 | 접근 또는 전송 가능성을 뒷받침하는 강한 정황 | 전체 데이터 범위와 이후 보관 상태 |
안드로이드와 아이폰의 확인 포인트는 다릅니다
| 구분 | 안드로이드 | 아이폰 |
|---|---|---|
| 권한 확인 | 설정의 Expo Go 앱 정보에서 권한별 허용 상태 확인 | 설정의 개인정보 보호 및 보안 또는 Expo Go 항목에서 접근 상태 확인 |
| 사용 시각 | 지원 버전에서 개인정보 보호 대시보드로 카메라·마이크·위치 시간대 확인 가능 | 앱 개인정보 보호 리포트가 미리 켜져 있었다면 네트워크·데이터 접근 기록이 보조 단서가 될 수 있음 |
| 사진 접근 범위 | OS 버전에 따라 사진·동영상 세부 권한 또는 선택 항목 접근을 구분 | 전체 사진과 선택한 사진 접근을 구분 |
| 별도 설치 분기 | APK나 개발 빌드가 추가로 설치됐는지 확인 | 별도 앱, 개발자 모드 기반 설치, 구성 프로파일이 있었는지 별도 확인 |
메뉴 이름과 기록 보존 기간은 운영체제 버전과 제조사 설정에 따라 달라질 수 있습니다. 현재 화면을 먼저 남긴 뒤 권한을 조정하는 것이 좋습니다.
자주 묻는 질문
Q1. Expo Go 자체가 악성 앱인가요?
아닙니다. Expo Go는 React Native 프로젝트를 시험하는 정상 개발용 앱입니다. 분석 대상은 상대가 보낸 링크가 연 프로젝트, 그 프로젝트가 요청한 권한, 실제로 나타난 동작입니다.
Q2. Expo Go만 설치하고 QR이나 링크는 열지 않았습니다.
그렇다면 원격 프로젝트 실행 정황은 약합니다. 다만 같은 대화 흐름에서 다른 링크, 웹 로그인, 별도 파일 설치가 있었는지는 분리해 확인해야 합니다.
Q3. 링크를 열었지만 모든 권한을 거부했습니다.
카메라·연락처·미디어 같은 권한 기반 접근 가능성은 크게 낮아집니다. 그래도 화면 입력값, 웹 로그인, 공개 프로필 정보, JavaScript 네트워크 통신처럼 별도 권한이 필요하지 않은 경로는 확인 대상입니다.
Q4. 연락처 권한을 허용했으면 주소록 전체가 전송된 건가요?
권한 허용만으로 전체 전송을 단정할 수 없습니다. 프로젝트가 연락처 API를 실제 호출했는지, 어떤 범위를 읽었는지, 외부 요청이 있었는지를 추가로 확인해야 합니다.
Q5. Expo Go 프로젝트가 접근성 서비스를 켤 수 있나요?
일반적인 Expo Go 프로젝트가 임의 네이티브 코드를 추가해 접근성 서비스를 등록하는 구조는 아닙니다. 그런 설정이 실제로 켜졌다면 Expo Go 외 별도 APK나 개발 빌드가 함께 설치됐는지 확인해야 합니다.
Q6. Expo Go를 삭제하면 프로젝트도 멈추나요?
일반적인 Expo Go 프로젝트는 호스트 앱에 의존하므로 Expo Go가 제거되면 그 안에서 독립 실행되지는 않습니다. 다만 함께 설치된 별도 앱, 브라우저 로그인 세션, 이미 외부로 전달된 데이터까지 자동으로 사라지는 것은 아닙니다.
Q7. 상대가 보낸 exp:// 링크가 지금 열리지 않으면 안전한가요?
서버가 중단됐거나 주소가 만료됐을 수 있습니다. 현재 열리지 않는다는 사실만으로 과거 실행 여부와 당시 권한 사용을 판단할 수 없으므로 원본 링크, 전달 시각, 권한 기록을 함께 봐야 합니다.
함께 보면 좋은 콘텐츠
분석 기준으로 참고한 공식 문서
이 글은 특정 프로젝트 샘플의 정적·동적 분석 결과가 아니라 Expo Go의 공식 실행 구조와 권한 경계를 기준으로 작성한 방어적 분석 가이드입니다. Expo SDK 버전과 운영체제 정책에 따라 세부 지원 범위는 달라질 수 있습니다.
(주)사이버헬퍼 상담 안내
Expo Go 설치 뒤 어떤 QR을 열었는지 기억이 흐릿하거나, 연락처·사진·카메라 권한과 상대가 제시한 자료의 관계를 혼자 구분하기 어렵다면 현재 기록을 먼저 정리해 보시기 바랍니다. 대화방이나 앱을 바로 삭제하기 전에 링크, 프로젝트 화면, 권한 상태, 실행 시각을 남기면 상황 판단에 도움이 됩니다.