동적 바이너리 계측은 실행 중인 프로그램에 프로브를 삽입합니다. 데스크톱 프레임워크는 명령어를 해석하고 수정한 기계어를 쓰기·실행 가능한 메모리에 내보낸 뒤 번역 블록으로 이동합니다. iOS는 서명하지 않은 실행 코드와 쓰기·실행 페이지를 제한해 일반 JIT 경로를 막습니다.
탈옥 기반 주입은 샌드박스를 우회하지만 최신 운영체제보다 늦고 분석 환경을 바꿉니다. 앱 재패키징은 재서명 뒤 라이브러리를 넣을 수 있으나 보통 임의 명령어가 아니라 API를 후킹하며, 소프트웨어가 바이너리 변경을 감지할 수 있습니다. 전체 에뮬레이션은 이 제약을 피하지만 메모리가 제한된 장치에 수 GB iOS 동적 라이브러리 공유 캐시를 두 번째로 올립니다.
iLand는 정상적으로 서명한 샌드박스 앱으로 실행되며 다른 앱을 명령어 단위로 에뮬레이션합니다. 실행 코드를 새로 만들지 않습니다. 게스트 애플리케이션 명령어를 미리 컴파일하고 서명한 실행 단위의 고정 어휘로 해석하며, 시스템 프레임워크는 호스트 CPU에서 실행합니다.
JIT 캐시를 대신하는 사전 컴파일 마이크로 연산
iLand는 Arm64 게스트 명령어를 해독하고 같은 의미의 하나 이상 마이크로 연산으로 바꿉니다. 각 마이크로 연산은 서명 전에 iLand 바이너리에 컴파일한 원자 실행 단위를 호출합니다. 피연산자와 게스트 상태는 데이터이므로 런타임이 새 코드를 쓰거나 RWX 매핑을 요청하지 않습니다.
인터프리터는 게스트 명령어, 라이브러리 호출, 시스템 호출 앞뒤의 임의 위치에 프로브를 놓을 수 있습니다. 플러그인은 프레임워크를 통해 레지스터와 메모리를 읽거나 바꿉니다. 정적 재작성과 달리 원래 위치에 남은 바이트 수의 제한을 받지 않고 실행 상태로 판단할 수 있습니다.
각 게스트 명령어가 해독, 디스패치, 상태 갱신으로 바뀌므로 네이티브 실행보다 계산 비용이 큽니다. iLand는 번역 메타데이터와 짧은 디스패치 루프로 반복 작업을 줄이지만 JIT가 캐시 블록을 직접 실행하는 속도에는 접근할 수 없습니다. 처리량을 샌드박스 준수와 맞바꾸는 설계입니다.

공유 캐시를 네이티브로 유지하는 앱 전용 에뮬레이션
iPhone 15급 시스템은 약 3.3GB 시스템 라이브러리를 매핑하면서 RAM은 6GB일 수 있습니다. 두 번째 사본을 에뮬레이션하면 iOS 메모리 부족 종료 기능인 Jetsam을 촉발할 수 있습니다. iLand는 게스트 앱에 속한 명령어만 해석합니다. UIKit, 네트워크, 코덱, 다른 시스템 라이브러리 호출은 호스트 프로세스의 기존 공유 캐시에서 네이티브로 실행합니다.
잦은 앱·라이브러리 경계에는 상태 전달이 필요합니다. 일반 에뮬레이터는 영속 그림자 호출 스택을 유지할 수 있지만 콜백, Objective-C 메시지, 예외, 비동기 반환은 완전한 중첩 가정을 깨뜨립니다. iLand의 상태 없는 제어 흐름 관리자는 주소와 저장한 게스트 문맥으로 다음 실행 영역을 복원합니다.
네이티브 실행은 대화형 호환성을 설명합니다. 스크롤, 텍스트 입력, UI 합성, 비디오 해독, 많은 네트워크 작업이 최적화한 시스템 프레임워크에서 진행됩니다. 앱 논리가 수십 배 느려도 라이브러리 중심 작업에서는 같은 체감 지연이 나타나지 않을 수 있습니다. 앱 내부의 CPU 집약 코드는 전체 비용을 냅니다.
경계는 적용 범위 한계이기도 합니다. 데이터로 받은 코드는 샌드박스에서 실행할 수 없습니다. 비공개 프레임워크, 특이한 Objective-C 런타임 동작, 수작업 어셈블리, 신호, 자체 검사가 의미 차이를 드러낼 수 있습니다. 분석은 어느 명령어가 해석됐고 어느 코드가 네이티브로 남았는지 밝혀야 합니다.
넓지만 보편적이지 않은 호환성
연구진은 iOS 16.7.7에서 미국 App Store 인기 무료 앱 64개를 시험했습니다. 49개가 로그인, 탐색, 검색, 비디오, 앱별 흐름 같은 핵심 기능을 완료했습니다. Gmail은 로그인과 메일 탐색, YouTube는 비디오 재생, X·Threads·Discord는 일반 상호작용을 지원했습니다.
앱 11개는 기능 이상을 보였고 네 개는 스스로 종료했습니다. 일부는 환경 차이를 감지하거나 의존했고, 실제 iOS에서 금지된 작업이 가상화 모델에서 성공해 동작이 달라진 경우도 있었습니다. 호환성은 선택한 수동 흐름이 작동했다는 뜻이며 모든 앱 경로나 보안 속성이 같다는 뜻은 아닙니다.
메모리 오버헤드는 바이너리 크기와 번역 메타데이터에 따라 달랐지만 앱 전용 설계는 두 번째 공유 캐시를 피했습니다. 수동 시험자는 작동 앱이 반응성이 있다고 판단했으나 통제된 사용자 지연 시험으로 구별 불가능함을 증명하지는 않았습니다. 재현성은 빠르게 바뀌고 스토어에서 다시 받지 못할 수 있는 앱 버전에도 좌우됩니다.
명령어 가시성의 가격을 보여 준 계산 벤치마크
iPhone X의 SPEC CPU 2017에서 네이티브, 지원 환경의 Valgrind, QEMU 변형, iLand를 비교했습니다. Valgrind는 네이티브 시간의 약 5배에서 10배, iLand는 15배에서 90배였습니다. 인용된 비교에서 QEMU TCI 인터프리터는 100배에서 600배 느렸고 JIT QEMU는 iOS 샌드박스를 만족할 수 없습니다.
iLand 범위가 넓은 이유는 명령어 구성, 라이브러리 실행 비율, 디스패치 동작이 다르기 때문이며, 게스트 코드 안에 머무는 벤치마크가 최악 조건입니다. 대부분을 네이티브 프레임워크에서 보내는 앱은 비용이 작습니다. 프로브 밀도와 분석 복잡도에 따라 계측 콜백 비용도 추가됩니다.
이 특성은 지속적인 소비자 배포보다 오프라인 보안 분석, 디버깅, 추적, 앱 검토에 맞습니다. 스토어 운영자는 전용 장치에서 선택 흐름을 실행하고 수분의 분석 시간을 받아들일 수 있습니다. CPU 집약 게임이나 암호화의 상시 성능 감시에는 적합하지 않습니다.
API 후킹이 놓치는 경로를 찾는 명령어 추적
연구진은 동적 추적 플러그인을 만들고 충분히 사용할 수 있는 앱 60개를 평가했습니다. 바이너리 안 SVC 명령어, 시스템 호출 인수, 런타임 dlsym, 동적 공유 캐시의 가져오지 않은 심벌로 향하는 간접 제어 이동을 기록했습니다. 앱이 커널 서비스를 직접 호출하거나 비공개 함수를 실행 중 찾으면 API 후킹을 우회할 수 있습니다.
앱 60개 중 13개가 비공개 API를 호출했고 두 개는 Apple 정책이 명시적으로 거부한 API를 사용했습니다. 바이너리 24개에는 SVC 명령어 2,914개가 들어 있었습니다. 앱 15개는 시스템 디렉터리를 조사하는 파일시스템 관련 시스템 호출을 실행했고, 이 패턴은 장치 지문이나 환경 인증에 기여할 수 있습니다.
이 발견만으로 악성 의도를 증명하지는 못합니다. 비공개 시스템 호출은 변조 방지, 호환성, 성능에 쓰일 수 있고 동적 분석은 실행한 경로만 봅니다. 논문은 모든 호출을 위반으로 선언하지 않고 개인정보와 견고성 위험을 분류해 추가 검토를 요구합니다.
적용 범위는 수동 상호작용에 좌우됐습니다. 가입, 지역 콘텐츠, 유료 기능, 지연 실행, 서버 플래그, 분석 회피 논리가 잠들 수 있습니다. 자동 UI 탐색, 여러 계정, 반복 환경 조건이 경로를 늘리지만 부재를 증명할 수는 없습니다.
신뢰할 수 없는 코드를 다루는 샌드박스 분석기
iLand는 닫힌 소스 앱 바이너리를 자체 프로세스 안에서 읽고 해석합니다. 디코더, 로더, Objective-C 브리지, 시스템 호출 중재, 플러그인 인터페이스가 공격 표면이 됩니다. 게스트 코드를 직접 실행하지 않아도 잘못 만든 Mach-O나 명령어 스트림이 분석기를 노릴 수 있습니다. 퍼징과 메모리 안전 파싱이 필요합니다.
게스트 앱이 iLand 컨테이너 권한이나 호스트 앱 데이터에 접근하지 않도록 네이티브 시스템 호출을 중재해야 합니다. 경로, 키체인 그룹, 권한, 번들 식별자, 개인정보 프롬프트에는 게스트와 맞는 가상 정체성이 필요합니다. 지나치게 허용하면 실제 설치에서 불가능한 동작을 만들고 지나치게 제한하면 잘못된 실패를 만듭니다.
코드 서명과 라이선스도 중요합니다. 운영자는 앱 바이너리를 입수하고 필요하면 복호화하며 분석할 권한이 있어야 합니다. 재패키징은 피하지만 한 앱 안에서 다른 앱을 실행하는 동작이 플랫폼 정책과 충돌할 수 있습니다. 연구 프로토타입은 기술 경로를 보였지만 App Store 승인을 받은 배포 모델은 아닙니다.
버전 변화도 피할 수 없습니다. Arm64 확장, 포인터 인증, 메모리 태깅, Swift 런타임, 새로운 iOS 공유 캐시 배치에는 의미 갱신이 필요합니다. JIT 없는 방법이 정책 의존성 하나를 줄이지만 에뮬레이터를 버전 독립적으로 만들지는 않습니다.
선택적 네이티브 실행이 만드는 실용성
iLand의 계산 오버헤드 15배에서 90배는 실행 분할을 보기 전에는 모바일 상호작용과 맞지 않아 보입니다. 애플리케이션 제어 논리는 해석하지만 비싼 표준 서비스는 네이티브로 남깁니다. 비공개 앱 동작이 있는 지점에서 가시성 비용을 지불하고, 이미 신뢰하거나 분석 대상이 아닌 운영체제 코드는 재사용합니다.
64개 중 49개의 호환성은 넓이를 보여 주고 15개의 실패는 경계가 투명하지 않음을 보여 줍니다. 정책 연구는 일반 API 후킹이 얻지 못하는 직접 SVC와 가져오지 않은 비공개 호출을 찾았습니다. 배포 결과는 안전·위험 이진 라벨이 아니라 경로 적용 범위와 호환성 상태를 함께 제시해야 합니다.
더 넓은 시스템 교훈은 동적 코드 생성 금지가 동적 분석 금지는 아니라는 점입니다. 사전 컴파일한 의미 단위는 코드를 데이터로 바꾸고 인터프리터 성능 비용으로 명령어 수준 제어를 회복합니다. 앱 전용 에뮬레이션은 메모리와 사용자 경험을 지배하는 시스템 코드를 피함으로써 분석 목적에 이 비용을 수용 가능하게 만듭니다.
출처와 저작권 안내
이 글은 Silicon & Systems의 편집 분석입니다. 구조, 평가, 발견, 한계를 자체 문장으로 재구성했습니다. 원문의 문장, 표, 도판을 복제하지 않았으며 본문 도판은 이 글을 위해 새로 만들었습니다. 논문은 USENIX OSDI 2026 발표 페이지에서 확인할 수 있습니다. 저작권은 저자에게 있으며 연도는 2026년입니다.