File system · Lezione 7 di 8
APFS: contenitori, volumi, istantanee e crittografia
12 min di lettura
Apple File System (APFS) è il file system di tutti i Mac, iPhone e iPad attuali. La sua struttura differisce da quella di NTFS ed ext4: una partizione contiene un contenitore, che a sua volta contiene diversi volumi che ne condividono lo spazio libero. Questa lezione illustra le strutture su disco che si incontrano in un'immagine disco, perché le evidenze relative all'utente si trovano su un volume specifico, come le istantanee e i checkpoint possono preservare stati precedenti, come APFS memorizza i timestamp e perché la crittografia determina se un'immagine di un Mac sia effettivamente leggibile.
Dalla partizione al contenitore
APFS ha sostituito HFS+ come file system predefinito in iOS 10.3 e in macOS 10.13 High Sierra (entrambi del 2017). Il disco di un Mac è partizionato con GPT (Lezione 1.1). La partizione APFS ha il GUID del tipo di partizione GPT 7C3457EF-0000-11AA-AA11-00306543ECAC e ciascuna di queste partizioni contiene esattamente un contenitore APFS. Un tipico disco di un Mac Intel presenta un MBR protettivo all'LBA 0, l'intestazione GPT all'LBA 1, una piccola partizione di sistema EFI e quindi il contenitore APFS. I Mac con Apple silicon aggiungono piccoli contenitori APFS per il supporto all'avvio e al ripristino; i dati dell'utente si trovano nel contenitore principale.
Il contenitore è suddiviso in blocchi, normalmente di 4.096 byte. Ogni oggetto APFS inizia con un'intestazione di 32 byte (un checksum Fletcher-64, un ID oggetto, un ID transazione, un tipo e un sottotipo), quindi i campi propri dell'oggetto iniziano all'offset 32. Il superblocco del contenitore (nx_superblock_t) si trova nel blocco 0 del contenitore e presenta la firma NXSB all'offset 32, seguita dalla dimensione dei blocchi e dal numero di blocchi.
Esempio svolto: individuazione del superblocco del contenitore
mmls segnala una partizione APFS che inizia al settore 409.640 su un disco con settori da 512 byte.
- Offset in byte del contenitore: 409.640 × 512 = 209.735.680.
- Offset della firma
NXSB: 209.735.680 + 32 = 209.735.712.
A tale offset si dovrebbero leggere i byte 4E 58 53 42 ("NXSB"). Verificare prima la dimensione dei settori: molti SSD interni Apple utilizzano settori logici da 4.096 byte e, in quel caso, moltiplicare per 512 produce un offset errato.
Copy-on-write, checkpoint e mappa degli oggetti
APFS utilizza il copy-on-write: non sovrascrive mai sul posto i metadati in uso. Una modifica viene scritta in nuovi blocchi e il file system consolida quindi un nuovo checkpoint, un'istantanea coerente dei propri metadati identificata da un ID transazione (XID) che aumenta a ogni consolidamento. I descrittori dei checkpoint e le copie dei superblocchi sono conservati in un anello di blocchi chiamato area dei descrittori dei checkpoint. Durante il montaggio, APFS cerca il superblocco valido con l'XID più alto. Non è garantito che la copia nel blocco 0 sia la più recente.
Per un esaminatore questo è importante per due motivi. In primo luogo, i checkpoint meno recenti ancora presenti nell'anello possono descrivere uno stato precedente dei metadati, comprese voci di directory relative a file che nel frattempo sono stati eliminati o rinominati. In secondo luogo, i blocchi rilasciati dal copy-on-write non vengono cancellati; diventano spazio libero e mantengono il proprio contenuto fino al riutilizzo. La Lezione 1.8 illustra come gli strumenti di recupero sfruttano questo comportamento.
La maggior parte degli oggetti dei metadati è virtuale: viene referenziata tramite un ID oggetto, non tramite un indirizzo di blocco. La mappa degli oggetti (omap) è un albero B che traduce un ID oggetto insieme a un XID in un numero di blocco fisico. Il contenitore ha una propria mappa degli oggetti e ogni volume ne ha un'altra. Poiché le voci hanno come chiave l'XID, una mappa degli oggetti meno recente può ancora puntare a una versione precedente dello stesso oggetto.
Volumi e gruppo di volumi di macOS
Un contenitore può contenere molti volumi (il formato ne consente fino a 100). Ogni volume ha un proprio superblocco (apfs_superblock_t, firma APSB all'offset 32), un proprio albero del file system e un proprio stato di crittografia, ma nessuno ha una dimensione fissa: tutti i volumi allocano blocchi dallo spazio libero condiviso del contenitore. Per impostazione predefinita, quindi, ogni volume riporta lo stesso spazio libero.
A partire da macOS 10.15 Catalina, il disco di avvio è suddiviso in volumi con ruoli distinti; i volumi System e Data formano insieme un gruppo di volumi:
| Volume (ruolo) | Nome predefinito | Contenuto | Valore probatorio |
|---|---|---|---|
| System | Macintosh HD | Sistema operativo, di sola lettura | Basso: identico su tutti i Mac con la stessa build |
| Data | Macintosh HD - Data | Cartelle personali degli utenti, app installate dagli utenti, log, database | Alto: quasi tutte le evidenze relative all'utente |
| Preboot | Preboot | File di avvio, dati di sblocco di FileVault | Limitato |
| Recovery | Recovery | recoveryOS | Limitato |
| VM | VM | File di swap, immagine di sospensione | Possibili frammenti di memoria |
A partire da macOS 11 Big Sur, il volume System è un volume di sistema firmato (Signed System Volume, SSV). Ogni file è coperto da un albero di hash SHA-256 e il Mac si avvia da un'_istantanea sigillata_ di tale volume (denominata com.apple.os.update- seguito da un hash), anziché dal volume corrente. Qualsiasi modifica compromette il sigillo. La conclusione pratica è che, su Catalina e versioni successive, i file, le impostazioni, i log e i database delle applicazioni dell'utente si trovano sul volume Data.
Firmlink
L'utente vede un unico albero del file system, non due volumi. Il volume Data è montato in /System/Volumes/Data e i firmlink, collegamenti bidirezionali definiti dal sistema (elencati in /usr/share/firmlinks), fanno apparire directory quali /Users, /Applications e /private (e quindi /private/var) nelle loro posizioni abituali. Quando si analizza direttamente il volume Data di un'immagine, la cartella personale di un utente si trova in /Users/<name> rispetto alla radice di quel volume. Un sistema in esecuzione mostra gli stessi file sia in /Users/<name> sia in /System/Volumes/Data/Users/<name>. Annotare quale forma è stata prodotta dallo strumento e riportare il percorso richiesto dall'attività.
Istantanee
Un'istantanea APFS è una vista di sola lettura di un volume in un determinato momento. Crearne una ha un costo quasi nullo, perché l'istantanea si limita a impedire che i blocchi esistenti in quel momento vengano liberati. Le modifiche successive vengono scritte in nuovi blocchi secondo il modello copy-on-write. Due tipi sono rilevanti nelle indagini:
- Istantanee locali di Time Machine del volume Data, denominate
com.apple.TimeMachine.seguito da una data e un'ora (per esempiocom.apple.TimeMachine.2024-03-05-101512.localnelle versioni recenti di macOS). macOS le crea quando Time Machine è abilitato, in genere circa ogni ora, le conserva per un breve periodo (circa 24 ore) e le rimuove prima quando lo spazio si esaurisce. - Istantanee di aggiornamento del sistema del volume System, create quando macOS installa aggiornamenti, compresa l'istantanea sigillata da cui si avvia il Mac.
Un'istantanea può contenere una versione precedente di un database, un documento successivamente eliminato dall'utente o un log che nel frattempo è stato sottoposto a rotazione. Su un Mac in esecuzione, tmutil listlocalsnapshots / o diskutil apfs listSnapshots <volume> ne visualizza l'elenco. In un'immagine, uno strumento che supporta APFS può montare o analizzare un'istantanea in base al nome. Non ricavare un orario UTC dal nome dell'istantanea: il record dei metadati dell'istantanea contiene l'ora di creazione sotto forma di timestamp APFS ed è questo il valore da riportare. Specificare sempre da quale istantanea proviene un artefatto: un valore letto da un'istantanea descrive il volume al momento dell'istantanea, non al momento del sequestro.
Timestamp e metadati dei file
APFS memorizza i timestamp come interi senza segno a 64 bit che contano i nanosecondi trascorsi dal 1970-01-01 00:00:00 UTC, in formato little-endian su disco. Ogni record inode ne contiene quattro:
| Campo | Significato |
|---|---|
create_time | Ora di creazione (nascita) |
mod_time | Ultima modifica del contenuto del file |
change_time | Ultima modifica dei metadati dell'inode (autorizzazioni, proprietario, ridenominazione) |
access_time | Ultimo accesso; non viene aggiornato a ogni lettura, quindi va interpretato con cautela |
APFS conserva anche una data di aggiunta nella voce di directory, che il Finder mostra come "Data di aggiunta" e che registra quando un elemento è arrivato nella cartella corrente. Altri formati temporali Apple hanno un aspetto diverso e non devono essere confusi con i timestamp APFS:
| Formato | Epoca | Unità | Posizione tipica |
|---|---|---|---|
| APFS | 1970-01-01 UTC | nanosecondi, 64 bit | Metadati del file system |
| HFS+ | 1904-01-01 | secondi, 32 bit senza segno | Volumi Mac meno recenti, alcune immagini disco |
| Mac Absolute Time ("Cocoa") | 2001-01-01 UTC | secondi, spesso un valore in virgola mobile | Molti file plist e database SQLite (Modulo 6) |
Esempio svolto: decodifica di un timestamp APFS
Gli otto byte di un campo create_time sono 15 CD 85 3D FE 9C 97 17.
- Invertire i byte little-endian:
0x17979CFE3D85CD15= 1.700.000.000.123.456.789 ns. - Dividere per 1.000.000.000: 1.700.000.000 s più 0,123456789 s.
- 1.700.000.000 di secondi Unix = 2023-11-14T22:13:20.123456789Z.
Lo stesso istante in Mac Absolute Time è 1.700.000.000 − 978.307.200 = 721.692.800 (978.307.200 è il numero di secondi dal 1970 al 2001). Nel formato HFS+ sarebbe 1.700.000.000 + 2.082.844.800 = 3.782.844.800. L'ordine di grandezza di un numero (qui circa 10^18, 10^9 o 10^8) ne rivela rapidamente l'epoca e l'unità. Quando un'attività richiede una precisione al secondo, troncare i nanosecondi anziché arrotondarli.
Cloni
Su APFS, cp -c e il comando Duplica del Finder creano un clone: un nuovo file con un proprio inode e propri timestamp, i cui extent puntano agli stessi blocchi fisici dell'originale. Solo i blocchi modificati successivamente vengono scritti separatamente. Ne derivano due conseguenze. Hash identici per due file non significano che i dati siano presenti due volte sul disco. L'eliminazione dell'originale non libera i suoi blocchi finché un clone continua a farvi riferimento. Non dedurre un'operazione di copia dai soli timestamp: un clone riceve una propria ora di creazione anche se non è stato copiato alcun dato.
Crittografia
APFS applica la crittografia a livello di volume o di singolo file. Un volume può non essere cifrato, essere cifrato con un'unica chiave per l'intero volume oppure essere cifrato con più chiavi, nel qual caso ogni file dispone di una propria chiave protetta mediante una chiave di classe. La crittografia per file con più chiavi è il modello di iOS. Su un Mac, FileVault protegge la chiave del volume Data con la password di accesso dell'utente e una chiave di recupero.
L'hardware determina l'utilità di un'immagine:
- Mac Intel senza chip T2: senza FileVault, il volume Data non è cifrato. Con FileVault, è cifrato via software e un'immagine completa può essere decifrata offline con la password di un utente o la chiave di recupero.
- Mac con chip Apple T2 o Apple silicon: l'archiviazione interna è sempre cifrata da un motore AES hardware con chiavi legate alla Secure Enclave del chip, anche quando FileVault è disattivato. FileVault aggiunge il requisito che le credenziali dell'utente sblocchino la chiave.
Sui Mac T2 e Apple silicon, un'acquisizione chip-off o un'immagine fisica grezza ottenuta senza le chiavi o senza un sistema sbloccato non fornisce dati leggibili. L'acquisizione dipende quindi dall'hardware originale: solitamente il sistema in esecuzione e sbloccato (una raccolta logica o di triage), oltre, quando FileVault è attivo, alla password dell'utente o alla chiave di recupero di FileVault per sbloccarlo. Il Modulo 7 tratta in dettaglio i volumi cifrati.
Strumenti e contesto dell'esame
Esempi di strumenti gratuiti: apfs-fuse monta immagini APFS su Linux in sola lettura, con un'opzione per selezionare un volume e il supporto di una password per i volumi cifrati. The Sleuth Kit supporta APFS: pstat descrive il contenitore (il "pool") ed elenca i suoi volumi con i numeri di blocco dei rispettivi superblocchi APSB, mentre fsstat, fls e icat accettano -P apfs insieme a -B <block> per selezionare un volume. mac_apt analizza gli artefatti macOS da immagini o da cartelle raccolte. Le suite commerciali offrono funzionalità di analisi simili. Qualunque sia lo strumento, verificare quale volume e quale istantanea abbia letto.
L'esame CFX è a scelta multipla, quindi le domande su APFS verificano i concetti e i calcoli di questa lezione, anziché l'analisi pratica di un'immagine di un Mac. La conoscenza dei contenitori spiega da dove provengono i file di macOS; la decodifica dei timestamp e la segnalazione precisa dei percorsi sono applicabili a qualsiasi piattaforma.
Focus sull'esame: Sono previste domande sulla gerarchia APFS (partizione, contenitore, volume, istantanea), sulle firmeNXSBeAPSBe sul volume che contiene i dati dell'utente su Catalina e versioni successive. Occorre saper convertire un valore APFS a 64 bit in nanosecondi nel formato ISO 8601 UTC e distinguerlo dai valori HFS+ e Mac Absolute Time. È necessario sapere perché un'immagine grezza di un Mac T2 o Apple silicon risulta illeggibile senza l'hardware originale e la sua Secure Enclave.
Punti chiave
- Un contenitore APFS per partizione GPT (tipo
7C3457EF-0000-11AA-AA11-00306543ECAC); il superblocco del contenitore presenta la firmaNXSB, ogni superblocco di volume la firmaAPSB, entrambe all'offset 32. - Il copy-on-write, i checkpoint e la mappa degli oggetti con chiavi basate sull'XID consentono agli stati precedenti dei metadati di sopravvivere fino al riutilizzo dei blocchi.
- Da Catalina, il volume System di sola lettura e il volume Data formano un gruppo di volumi; da Big Sur, il sistema si avvia da un'istantanea sigillata. Le evidenze relative all'utente si trovano sul volume Data, collegato all'albero visibile tramite firmlink.
- Le istantanee locali di Time Machine (
com.apple.TimeMachine.*) e le istantanee di aggiornamento del sistema preservano gli stati precedenti dei volumi. Annotare sempre da quale istantanea proviene un artefatto. - I timestamp APFS sono valori a 64 bit che esprimono nanosecondi dal 1970-01-01 UTC. HFS+ utilizza secondi dal 1904 e Mac Absolute Time utilizza secondi dal 2001-01-01.
- I Mac T2 e Apple silicon cifrano l'archiviazione interna via hardware, quindi l'acquisizione richiede l'hardware originale, solitamente il sistema in esecuzione e sbloccato, oltre alle credenziali dell'utente o alla chiave di recupero quando FileVault è attivo.