앱을 테스트하는 동안, 우리는 위치 정보 확인 기능을 “우회”해야만 했습니다.
안드로이드에서는 단 하나의 앱(가상 위치 정보 앱)을 설치하는 것을 포함해 위치 정보를 위조할 수 있는 쉬운 방법이 많지만, 이러한 위조를 탐지하는 방법도 그만큼 많습니다. 안드로이드에서 위치 정보 자체는 개발자들에게 그다지 신뢰할 만한 인증 요소로 간주되지 않습니다.
반면 iOS에서는 위치 정보가 더 신뢰할 수 있는 것으로 간주됩니다. 적어도 일반 iOS 사용자는 개발자 계정을 만들고 9GB나 되는 Xcode를 설치하지는 않을 테니까요. 하지만 만약 이것이 겉보기에 그렇게 어렵지 않고, 오히려 안드로이드보다 더 쉽다면 어떨까요?
비교
먼저 iOS와 안드로이드에서 사용할 수 있는 보안 방법 간의 차이점을 살펴보겠습니다:
| 이름 | Android | iOS | 설명 |
|---|---|---|---|
| 현재 SSID/BSSID 확인 | + | ± | Android의 경우, 접근 여부는 권한 및 위치 제한에 따라 달라집니다. iOS에서는 Apple의 요구 사항을 충족해야만 현재 Wi-Fi 네트워크를 조회할 수 있습니다 NEHotspotNetwork.fetchCurrent, 주변 네트워크 목록은 조회할 수 없습니다. |
| 주변 Wi-Fi SSID 스캔 | + | - | 안드로이드는 역사적으로 권한, 대역폭 제한, 위치 정보에 대한 제약 조건 하에 Wi-Fi 스캔을 허용해 왔습니다. iOS에서는 일반 앱이 주변 SSID 목록을 가져올 수 없으며, 애플은 주변 Wi-Fi 목록을 위한 일반적인 API가 없다고 명시하고 있습니다. |
| 기지국 | + | - | 안드로이드는 TelephonyManager.getAllCellInfo()를 통해 등록/서비스 중인 셀 및 인접 셀을 포함한 셀 타워 정보를 가져올 수 있으며, ACCESS_FINE_LOCATION 통화 무선 기능을 지원합니다. 결과는 기기, 통신사, OS 버전 및 권한에 따라 캐시되거나, 전송 속도가 제한되거나, 이용 불가하거나, 부분적으로 이용 불가능할 수 있습니다. iOS는 서비스 중인/인접 기지국 ID, LAC/TAC, 신호 강도 또는 인근 기지국 목록을 조회할 수 있는 App Store 안전 기준을 충족하는 공개 API를 제공하지 않습니다. CoreTelephony는 기지국 수준의 무선 스캔 데이터가 아닌, 제한된 통신사/서비스 제공자 정보만 제공합니다. |
이에 따라 사실상 모든 Android 앱은 타사 서비스를 통해 인근 네트워크를 추가로 요청하고 이를 내부 위치 파악에 활용할 수 있습니다. 이 데이터는 위조될 수 있으며 신뢰할 만한 지표가 아닙니다.
iOS의 경우 상황이 약간 다르며, 앱에 대한 요구 사항도 다소 다릅니다. 또한 iOS는 위치 파악을 위해 이 데이터를 사용하는 것을 명시적으로 금지하고 있습니다. 어쨌든, 이 데이터는 네트워크 액세스 포인트 역할을 하는 기기를 사용하여 위조될 수 있습니다.
두 플랫폼 모두 개발자 모드를 직접 감지할 수 있는 방법은 없지만, 안드로이드에서는 ‘가상 위치(Mock Location)’를 감지하는 도구가 있습니다.
Location.isMock() — 안드로이드에서.
CLLocation.sourceInformation?.isSimulatedBySoftware — iOS의 경우.
안드로이드에서는 모의 위치 기능을 위해 선택한 모든 앱에 location.isMock=true 플래그가 설정됩니다. 하지만 deviceIntegrity와 함께 사용하면 이론적으로 이를 방지하거나 훨씬 더 어렵게 만들 수 있습니다.
반면 iOS에서는 상황이 다릅니다. CLLocation 앱 자체에서 생성할 수 있습니다. 즉, Xcode 이외의 타사 툴킷을 사용하는 경우, 다음을 제거할 수 있습니다. isSimulatedBySoftware=true
이 점을 활용하겠습니다. 또한 독점 소프트웨어는 전혀 사용하지 않고 오픈소스 도구만 사용할 것입니다. 따라서 Xcode, iTools, 3uTools는 사용하지 않습니다.
해결책: pymobiledevice3
설치
Python 버전 3.9 이상이 설치되어 있어야 합니다.
0. 터미널에서 다음 명령을 실행합니다: python3 -m pip install -U pymobiledevice3
1. 기기의 잠금을 해제하세요
2. USB를 통해 기기를 컴퓨터에 연결하고 접근 권한을 승인하세요
3. 이 PC에 대해 “신뢰”를 탭하세요
4. 개발자 모드를 활성화하세요: pymobiledevice3 amfi enable-developer-mode
처음에 작동하지 않으면 기기를 재시작하고 1~4단계를 다시 반복해야 할 수도 있습니다.
5. 설정 -> 보안 및 개인정보 보호 -> 보안 -> 개발자 모드를 확인하세요
6. 기기가 인식되는지 확인해 봅시다: pymobiledevice3 usbmux list
다음과 같은 응답이 표시되어야 합니다:
[
{
"BuildVersion": "23F84",
"ConnectionType": "USB",
"DeviceClass": "iPhone",
"DeviceName": "******",
"Identifier": "0000000-00000000000000",
"ProductType": "iPhone17",
"ProductVersion": "26.5.2",
"UniqueDeviceID": "0000000-00000000000000"
}
]기기가 감지되었습니다.
7. iPhone 개발자 디스크 이미지를 선택하고 마운트해 봅시다
pymobiledevice3 mounter auto-mount
마운트가 성공적으로 완료되면 다음 명령을 실행할 수 있습니다:
pymobiledevice3 developer dvt simulate-location set --userspace -- <LAT> <LONG>
이제 어떤 앱을 열어도 선택한 지점에서 사용자의 위치 정보가 표시됩니다.
마무리
보안 조치를 우회하여 이 기기에서는 사용할 수 없어야 할 기능에 접근했습니다. 보안을 강화하고 특정 시나리오를 방지하는 방법에 대한 권장 사항을 정리했습니다.
읽어 주셔서 감사합니다. 마지막으로 한 가지 덧붙이자면, 사용자 환경에 의존하지 마십시오. 사용자 환경은 언제든지 위조될 수 있습니다.