<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Giordano Sconti</title>
    <description>The latest articles on DEV Community by Giordano Sconti (@giordanosconti).</description>
    <link>https://dev.to/giordanosconti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4216378%2Fd49ec63d-746b-4dfc-8f4f-462379cb5cb7.jpg</url>
      <title>DEV Community: Giordano Sconti</title>
      <link>https://dev.to/giordanosconti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/giordanosconti"/>
    <language>en</language>
    <item>
      <title>Building an Open Forensic Tool for iCloud Backups When Commercial Extractors Say “Access Denied”</title>
      <dc:creator>Giordano Sconti</dc:creator>
      <pubDate>Fri, 30 Oct 2026 04:35:19 +0000</pubDate>
      <link>https://dev.to/giordanosconti/building-an-open-forensic-tool-for-icloud-backups-when-commercial-extractors-say-access-denied-3e68</link>
      <guid>https://dev.to/giordanosconti/building-an-open-forensic-tool-for-icloud-backups-when-commercial-extractors-say-access-denied-3e68</guid>
      <description>&lt;p&gt;Commercial iCloud extractors often hit a wall when &lt;strong&gt;iCloud.com is disabled&lt;/strong&gt;, &lt;strong&gt;Advanced Data Protection (ADP)&lt;/strong&gt; is on, or &lt;strong&gt;Lockdown Mode&lt;/strong&gt; is enabled. In those conditions I have seen solid products return a blunt &lt;em&gt;Access Denied&lt;/em&gt;—even when the account owner still holds a Recovery Key or Octagon PIN.&lt;/p&gt;

&lt;p&gt;That gap is why I built &lt;strong&gt;iCloudKit Extractor&lt;/strong&gt; (IKE): an experimental Windows forensic lab tool, written in &lt;strong&gt;.NET 10&lt;/strong&gt;, that walks the undocumented Apple auth → Escrow/PCS → CloudKit/MMCS path instead of relying only on the “easy” web-facing APIs.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;research software&lt;/strong&gt;, not a polished product. Undocumented protocols change. Accounts can be banned. There is no warranty. Use it only with &lt;strong&gt;your own&lt;/strong&gt; Apple ID, for ethical / forensic work, and at your own risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I released it
&lt;/h2&gt;

&lt;p&gt;Over roughly &lt;strong&gt;seven months&lt;/strong&gt; of protocol work with &lt;a href="https://giordanosconti.github.io/iCloudKitExtractor/" rel="noopener noreferrer"&gt;Forensis-Lab&lt;/a&gt;, I got &lt;strong&gt;stable, full downloads&lt;/strong&gt; of personal device backups with ADP both on and off—when the Octagon PIN or Recovery Key was available.&lt;/p&gt;

&lt;p&gt;Extreme recoveries of backups and CloudKit data should still be possible when the only alternative is the physical device. Shipping the tool as &lt;strong&gt;MIT open source&lt;/strong&gt; was the cleanest way to keep that path alive for labs that need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it can do today
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apple ID login, HSA2 / trusted devices, Anisette OTP (Frida → AuthKit/&lt;code&gt;akd&lt;/code&gt; preferred)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Escrow &amp;amp; PCS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keybag / bottle unlock, Recovery Key → TLKShares, Manatee keysets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;List device backups, MMCS download, iTunes-style materialization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WhatsApp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CloudKit / CloudDocs document crypto path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iCloud Drive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Drive probe and file pull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IMAP export&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sync Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Photos / Notes CloudKit paths + a PhotosViewer payload&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Several UI tabs are still marked &lt;em&gt;Work in progress&lt;/em&gt;. The demos below show the flows that already run end-to-end in the lab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo: Recovery Key → login → backup
&lt;/h2&gt;

&lt;p&gt;Sign in, unlock Escrow with a Recovery Key, then start a device backup pull.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgox40ga3qth74pzmefu.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgox40ga3qth74pzmefu.gif" alt="Recovery Key flow — login and backup download" width="640" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GiordanoSconti/iCloudKitExtractor/blob/main/video/07-backup-login-download.mp4" rel="noopener noreferrer"&gt;Highlight MP4&lt;/a&gt; · &lt;a href="https://github.com/GiordanoSconti/iCloudKitExtractor/blob/main/video/2026-10-28%2006-25-12.mp4" rel="noopener noreferrer"&gt;Full recording (~32 MB)&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When commercial tools stop
&lt;/h2&gt;

&lt;p&gt;Same account conditions where &lt;strong&gt;Elcomsoft 11.0.5&lt;/strong&gt; returned &lt;em&gt;Access Denied&lt;/em&gt; with &lt;strong&gt;iCloud.com off&lt;/strong&gt; and &lt;strong&gt;ADP enabled&lt;/strong&gt;—IKE continued along the Escrow / Octagon path:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbo1stzphmfeguo34a7my.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbo1stzphmfeguo34a7my.png" alt="Elcomsoft Access Denied vs IKE path" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live personal backup download (progress → completion):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frr70kfm49qcp6qwzw2gs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frr70kfm49qcp6qwzw2gs.png" alt="Backup download progress" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxa97jqntbrs72gxjz1gc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxa97jqntbrs72gxjz1gc.png" alt="Backup download completion" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery Key &amp;amp; Octagon (short version)
&lt;/h2&gt;

&lt;p&gt;Recovery Key unlock hits an &lt;strong&gt;Octagon&lt;/strong&gt; endpoint that can surface the encrypted &lt;strong&gt;TLKShares&lt;/strong&gt;. From those shares you can recover the ones tied to Recovery Key peers, verify whether a given Recovery Key is present, and—if it is—recover the Manatee / PCS KeySet for CloudKit zones, including &lt;strong&gt;ADP-protected backups&lt;/strong&gt; and &lt;strong&gt;Keychain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is the piece commercial “web API” paths often cannot take when ADP and iCloud.com restrictions are in play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anisette: why a real device still matters
&lt;/h2&gt;

&lt;p&gt;Apple’s Anisette / device attestation story has made pure software emulation fragile. IKE prefers &lt;strong&gt;OTP minted on a jailbroken iPhone via Frida&lt;/strong&gt; (AuthKit / &lt;code&gt;akd&lt;/code&gt;), then served by a small &lt;strong&gt;AnisetteServer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is a temporary public preview endpoint for labs that want to try before hosting their own stack:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.icloudkitextractor.eu:27042" rel="noopener noreferrer"&gt;https://www.icloudkitextractor.eu:27042&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Leave the License field empty on first connect to receive a one-shot Package-C license. The preview server binds licenses to connection / fingerprint metadata so abuse can be revoked. If that endpoint is used for unauthorized attacks, I will shut the preview down. Self-host docs live in the repo under &lt;code&gt;docs/ANISETTE_LICENSED.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Needs:&lt;/strong&gt; Windows · &lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;.NET 10 SDK&lt;/a&gt; · a physical Anisette source · an Apple ID &lt;strong&gt;you&lt;/strong&gt; control.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
powershell
dotnet build src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
dotnet run --project src/iCloudKitExtractor/iCloudKitExtractor.csproj -c Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>dotnet</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
