원문 캡처 · github.com
원문 캡처 · github.com

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 서버는 더 이상 작동하지 않는다고 명시했다. 기본 앱은 다음 명령으로 빌드하거나 실행할 수 있다.

text
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
coreadiWindows CoreADI/AuthKitWin 하이브리드docs/MAC_ANISETTE.md
Mac Docker + bridgeCGNAT 또는 원격 Mac Anisettedocs/ANISETTE_BRIDGE.md

에뮬레이트된 akd 예시는 다음 스크립트로 설정한다.

text
.\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예coreadifrida여야 한다. 별칭은 iphone-frida, jb-frida다.
ANISETTE_SERVER_URL / ANISETTE_SERVER_URLS아니요http://127.0.0.1:6969AnisetteServer가 수신하는 URL 또는 URL 목록이다.
ANISETTE_SERVER_PORT아니요6969URL을 지정하지 않았을 때 사용할 포트다.
ICLOUD_AUTH_MODE권장설정을 통한 iphone완전한 AuthKit iPhone SRP를 사용하려면 iphone을 지정한다.
FRIDA_ANISETTE_HOST아니요127.0.0.1:27042frida-server의 호스트와 포트다. USB 연결에서는 보통 iproxy 27042 27042를 사용한다.
FRIDA_ANISETTE_PROCESS아니요akd연결할 프로세스다.
FRIDA_ANISETTE_FETCH_PY예*경로 추정fetch_anisette.py의 절대 경로다.
FRIDA_ANISETTE_PYTHON아니요pythonPython 실행 파일이다.
FRIDA_ANISETTE_LITE아니요1 / true간소화된 연결 모드다.
FRIDA_ANISETTE_TIMEOUT아니요60OTP 생성이 중단되기 전까지 기다릴 초 단위 시간이다.

FRIDA_ANISETTE_FETCH_PY를 지정하지 않으면 앱은 몇 개의 이전 형제 경로만 검색하므로, 환경 변수를 명시적으로 설정해야 한다. 선택적으로 %AppData%\iCloudKitExtractor\anisette.json 설정 파일을 사용할 수 있으며, authMode와 serverUrl을 설정한다. 환경 변수는 설정 파일보다 우선한다.

Frida 백엔드의 AnisetteServer를 시작하는 예시는 다음과 같다.

powershell
$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는 환경 변수보다 우선한다. 서버 상태를 확인하는 테스트 명령은 다음과 같다.

text
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가 해당 서버를 사용하도록 설정하고 실행하는 명령은 다음과 같다.

powershell
$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 서버 파일을 확인한다.

sh
ls -l /var/jb/usr/sbin/frida-server

편집기 없이 LaunchDaemon plist를 다시 만든다. 파일은 LF 줄바꿈을 사용하며 루트리스 경로를 기준으로 한다.

sh
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를 바이너리 형식으로 변환한 다음 데몬을 다시 불러오거나 시작한다.

sh
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은 엔드포인트를 언제든 변경할 수 있으며, 제작자는 데이터 손실이나 계정 정지 등으로 생기는 피해에 책임을 지지 않는다고 명시했다.