
iCloudKit Extractor는 iCloud 로그인, 기기 백업 목록 확인, CloudKit/MMCS를 통한 백업 다운로드를 지원하는 WPF(.NET 10) 앱이다. 현재 공개 실험 단계이며, 제작자 조르다노 스콘티(Giordano Sconti)는 법의학 연구용으로 개발했다고 밝혔다.
이 소프트웨어는 연구·실험실용이며 완제품이 아니다. 문서화되지 않은 Apple API를 사용하고, 계정이 정지될 위험이 있으며, 보증도 제공하지 않는다. 본인 Apple ID로만, 위험을 감수하고 사용해야 한다.
스콘티는 Forensis-Lab 법의학 연구소와 협력하며 소프트웨어 연구자이자 기술 컨설턴트(Consulente Tecnico)로 일한다. 소프트웨어는 MIT 라이선스로 공개됐지만 소유권은 Forensis-Lab에 있다. Apple 내부 API는 예고 없이 바뀔 수 있어 프로젝트는 매우 실험적인 단계라고 설명했다.
그는 극단적인 상황에서 기기 자체로만 접근할 수 있는 백업과 CloudKit 데이터를 복구해야 하는 법의학 업무에 이 도구가 유용하다고 밝혔다. 상용 도구와 달리 ADP(고급 데이터 보호)를 켜거나 끈 상태 모두에서 본인의 백업을 안정적으로 완전히 내려받았다고 설명했다. 단, ADP가 활성화된 경우에는 기기의 Octagon PIN이나 복구 키를 알고 있어야 한다. 잠금 모드(Lockdown Mode)가 켜져 있고 iCloud.com을 사용할 수 없는 경우에도 작동한다고 밝혔다.
개발에는 약 7개월이 걸렸다. 스콘티는 Cursor 코딩 에이전트 모델이 없었다면 더 오래 걸렸을 것이라며, 작업은 가능한 근무 시간이나 늦은 밤에 진행했다고 말했다. 코드도 모듈식으로 구성하려 했다고 덧붙였다.
구성과 이용 조건
저장소에는 기본 앱 src/iCloudKitExtractor, 사진 라이브러리 뷰어 src/PhotosViewer(IKE 빌드 때 viewer-payload에 복사됨), OTP/ADI용 AnisetteServer와 선택적 브리지 프로젝트, 에뮬레이트된 akd 및 브리지 설정 스크립트, docs/ 문서가 포함된다. 실험실 빌드 산출물과 프로브, 캡처 데이터 모음은 공개 저장소에서 제외했다.
요구 사항은 Windows, .NET 10 SDK, 물리 Anisette 서버, 본인이 관리하는 테스트용 Apple ID다. 제작자는 에뮬레이트된 Anisette 서버는 더 이상 작동하지 않는다고 명시했다. 기본 앱은 다음 명령으로 빌드하거나 실행할 수 있다.
dotnet build src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
프로젝트 사이트는 docs/의 index.html과 site.css에 있다. GitHub Pages로 게시할 때는 main 브랜치를 푸시한 뒤 저장소 설정에서 Pages를 열고, 게시 방식을 ‘Deploy from a branch’로 설정해 브랜치 main과 폴더 /docs를 선택한 다음 저장한다. 사이트 URL은 https://giordanosconti.github.io/iCloudKitExtractor/와 비슷한 형태가 된다. 공개된 프로젝트 사이트에서도 내용을 확인할 수 있다.
복구 키와 Anisette 설정
Recovery Key로 잠금을 해제할 때는 Octagon 엔드포인트를 사용해 암호화된 TLKShares 전체를 덤프할 수 있다. 이 공유 데이터에서 Recovery Key 피어에 연결된 항목도 복구할 수 있다. 해당 피어는 Recovery Key에 서명하는 공개 키의 SHA-384 값으로 식별한다. 이를 통해 주어진 Recovery Key가 목록에 있는지 확인하고, 포함된 경우 CloudKit 영역의 Manatee/PCS KeySet을 복구할 수 있다. 여기에는 ADP로 보호되는 백업과 키체인도 포함된다.
저장소에는 여러 Anisette 백엔드가 제시돼 있다.
| 백엔드 | 용도 | 문서 |
|---|---|---|
frida | 실제 iPhone/akd OTP. 사용 가능할 때 권장 | 이 README |
akd-emulated | 소프트웨어 ADI 작업자. 현재 Android 라이브러리를 사용하며 iOS 대상은 개발 중 | docs/EMULATED_AKD.md |
coreadi | Windows CoreADI/AuthKitWin 하이브리드 | docs/MAC_ANISETTE.md |
| Mac Docker + bridge | CGNAT 또는 원격 Mac Anisette | docs/ANISETTE_BRIDGE.md |
에뮬레이트된 akd 예시는 다음 스크립트로 설정한다.
.\scripts\setup-emulated-akd.ps1
추가 문서는 iPhone 내부 흐름과 Apple MIDService 프로비저닝을 참고할 수 있다.
Frida 백엔드는 일관된 iPhone/akd ID를 위한 권장 경로다. OTP를 Frida를 통해 기기에서 AuthKit/akd로 생성한 다음 AnisetteServer가 제공한다. 준비물은 frida-server가 실행 중인 탈옥 iPhone(USB 또는 Wi-Fi 연결), PC에 설치한 같은 버전의 frida-tools(pip install frida-tools), python으로 실행할 수 있는 Python 3(또는 FRIDA_ANISETTE_PYTHON으로 지정), Frida 연결 스크립트 fetch_anisette.py다. 스크립트 경로는 FRIDA_ANISETTE_FETCH_PY로 지정한다. 탈옥 기기 준비에 관한 안내는 저장소의 관련 절을 참조한다. 세부 내용은 아직 제공되지 않았다.
환경 변수는 다음과 같다.
| 변수 | 필수 여부 | 기본값 | 의미 |
|---|---|---|---|
ANISETTE_SERVER_BACKEND | 예 | coreadi | frida여야 한다. 별칭은 iphone-frida, jb-frida다. |
ANISETTE_SERVER_URL / ANISETTE_SERVER_URLS | 아니요 | http://127.0.0.1:6969 | AnisetteServer가 수신하는 URL 또는 URL 목록이다. |
ANISETTE_SERVER_PORT | 아니요 | 6969 | URL을 지정하지 않았을 때 사용할 포트다. |
ICLOUD_AUTH_MODE | 권장 | 설정을 통한 iphone | 완전한 AuthKit iPhone SRP를 사용하려면 iphone을 지정한다. |
FRIDA_ANISETTE_HOST | 아니요 | 127.0.0.1:27042 | frida-server의 호스트와 포트다. USB 연결에서는 보통 iproxy 27042 27042를 사용한다. |
FRIDA_ANISETTE_PROCESS | 아니요 | akd | 연결할 프로세스다. |
FRIDA_ANISETTE_FETCH_PY | 예* | 경로 추정 | fetch_anisette.py의 절대 경로다. |
FRIDA_ANISETTE_PYTHON | 아니요 | python | Python 실행 파일이다. |
FRIDA_ANISETTE_LITE | 아니요 | 1 / true | 간소화된 연결 모드다. |
FRIDA_ANISETTE_TIMEOUT | 아니요 | 60 | OTP 생성이 중단되기 전까지 기다릴 초 단위 시간이다. |
FRIDA_ANISETTE_FETCH_PY를 지정하지 않으면 앱은 몇 개의 이전 형제 경로만 검색하므로, 환경 변수를 명시적으로 설정해야 한다. 선택적으로 %AppData%\iCloudKitExtractor\anisette.json 설정 파일을 사용할 수 있으며, authMode와 serverUrl을 설정한다. 환경 변수는 설정 파일보다 우선한다.
Frida 백엔드의 AnisetteServer를 시작하는 예시는 다음과 같다.
$env:ANISETTE_SERVER_BACKEND = "frida"
$env:ANISETTE_SERVER_PORT = "6971"
$env:FRIDA_ANISETTE_HOST = "127.0.0.1:27042"
$env:FRIDA_ANISETTE_PROCESS = "akd"
$env:FRIDA_ANISETTE_FETCH_PY = "C:\path\to\fetch_anisette.py"
$env:FRIDA_ANISETTE_PYTHON = "python"
$env:FRIDA_ANISETTE_LITE = "1"
$env:FRIDA_ANISETTE_TIMEOUT = "60"
dotnet run --project src/AnisetteServer/AnisetteServer.csproj -c Release -- --backend frida --port 6971
명령줄의 --backend와 --port는 환경 변수보다 우선한다. 서버 상태를 확인하는 테스트 명령은 다음과 같다.
curl http://127.0.0.1:6971/health
curl http://127.0.0.1:6971/
응답에는 기기 정보가 담긴 JSON이 반환되어야 한다. 여기에는 X-Apple-I-MD-M과 com.apple.akd를 포함하는 X-MMe-Client-Info가 들어간다.
IKE가 해당 서버를 사용하도록 설정하고 실행하는 명령은 다음과 같다.
$env:ANISETTE_SERVER_URL = "http://127.0.0.1:6971/"
$env:ICLOUD_AUTH_MODE = "iphone"
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
탈옥 iPhone에서 Frida 준비하기
먼저 기기에 Sileo를 통해 Frida(frida-server)와 OpenSSH를 설치한다. 아래 절차는 루트리스 탈옥(/var/jb/...)을 가정한다. root 계정으로 SSH 접속한 뒤 Frida 서버 파일을 확인한다.
ls -l /var/jb/usr/sbin/frida-server
편집기 없이 LaunchDaemon plist를 다시 만든다. 파일은 LF 줄바꿈을 사용하며 루트리스 경로를 기준으로 한다.
cat > /var/jb/Library/LaunchDaemons/re.frida.server.plist <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>re.frida.server</string>
<key>ProgramArguments</key>
<array>
<string>/var/jb/usr/sbin/frida-server</string>
<string>-l</string>
<string>0.0.0.0:27042</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ThrottleInterval</key>
<integer>3</integer>
</dict>
</plist>
EOF
줄바꿈을 정리하고 plist를 바이너리 형식으로 변환한 다음 데몬을 다시 불러오거나 시작한다.
tr -d '\r' < /var/jb/Library/LaunchDaemons/re.frida.server.plist > /tmp/frida.plist
mv /tmp/frida.plist /var/jb/Library/LaunchDaemons/re.frida.server.plist
plutil -convert binary1 /var/jb/Library/LaunchDaemons/re.frida.server.plist
killall frida-server 2>/dev/null
launchctl bootout system /var/jb/Library/LaunchDaemons/re.frida.server.plist 2>/dev/null
launchctl bootstrap system /var/jb/Library/LaunchDaemons/re.frida.server.plist
launchctl enable system/re.frida.server
launchctl kickstart -k system/re.frida.server
ps aux | grep '[f]rida-server'
이 설정은 frida-server가 모든 인터페이스의 0.0.0.0:27042에서 연결을 받고, 부팅 시 시작해 계속 실행되도록 한다. PC에서 USB 포트 포워딩(iproxy 27042 27042)을 사용한 뒤 FRIDA_ANISETTE_HOST=127.0.0.1:27042로 지정하거나, 기기의 LAN IP를 사용한다.
라이선스와 주의 사항
이 프로젝트는 MIT 라이선스로 공개됐다(저장소의 LICENSE 참조). 소유권과 출처 표시는 Forensis-Lab(조르다노 스콘티)에 남는다. 파생 사용이나 수정 시에도 Forensis-Lab을 명확히 표시해야 한다. 스콘티는 프로젝트의 모든 코드가 자신의 직접 허가 아래 Forensis-Lab에 속한다고 밝혔으며, 사용과 수정에는 Forensis-Lab 출처 표시가 계속 따라야 한다고 설명했다.
소프트웨어를 시험하거나 개선점을 제안하고, 남은 기능을 완성하는 데 기여할 사람을 환영한다고 프로젝트는 안내한다. 유료 코딩 에이전트 모델을 사용할 수 있지만, 무료 모델은 코드 정확성이 불안정한 경우가 많으므로 피하라고 권고한다. 생성된 코드는 항상 검토해야 하며, 동의 없이 제3자 코드를 무단으로 가져와서는 안 된다. 풀 리퀘스트는 매우 신중하게 검토한다.
Anisette 스택을 직접 실행하기 전에 시험하려면 스콘티에게 비공개로 연락해 Anisette Server 접근을 요청할 수 있다. 연락처는 giordano.sconti@gruppoinformaticiforensi.it다.
이 소프트웨어는 비공식 방식으로 Apple 서비스에 접속한다. Apple은 엔드포인트를 언제든 변경할 수 있으며, 제작자는 데이터 손실이나 계정 정지 등으로 생기는 피해에 책임을 지지 않는다고 명시했다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요