// Il Buio
Sezione 01. L'antefattoLe due e quarantasette di notte. La iena dorme. Russa leggermente, quel ronzio costante a bassa frequenza che dopo 26 anni è diventato il mio rumore bianco preferito. La camera è buia. Buia nel senso che non vedi la mano davanti alla faccia. Persiane chiuse, la porta del bagno chiusa perché il led dello spazzolino elettrico illumina come un faro di Capo Miseno.
Vibra il telefono sul comodino. Una notifica. Qualche idiota su Twitter che risponde a un thread delle undici di sera. Allungo la mano, prendo l'iPhone. Lo alzo davanti alla faccia. Buio pesto. Non vedo lo schermo. Non vedo niente.
Click. Face ID sblocca. Istantaneo. La schermata home appare e mi spara la luce blu direttamente nelle retine dilatate. Bestemmio mentalmente. Ma la domanda è già li, piantata nella corteccia prefrontale come un chiodo arrugginito:
Ma come cazzo fa? È buio pesto.
Rimetto giù il telefono. Riprovo. Buio totale. Alzo il telefono. Sblocca. Di nuovo. Senza un filo di luce. Resto lì, perplesso, a fissare lo schermo acceso nel buio. La iena si sveglia. Mi guarda. "Che c'è?" "Come cazzo fa a sbloccarsi al buio?" Lei ci pensa mezzo secondo. "È l'app torcia. L'ho letto su internet." "Vai a cagare nell'orto che concimi." Si gira dall'altra parte e si riaddormenta in tre secondi. Nessuna luce si accende. La camera resta buia. Il telefono si sblocca lo stesso. E una certezza: quel coso non usa la luce visibile. Scoprirò come fa.
Mi rigiro nel letto per mezz'ora. La iena russa. Il cervello macina. Mi addormento alle tre. Domani mattina smonto tutto.
La risposta, scoprirò la mattina dopo, è infrarosso. Il modulo TrueDepth non ha bisogno della luce che vedi tu. Lavora a 940 nm, ben oltre il visibile umano che si ferma a 700 nm. In pratica ti spara in faccia un proiettore IR invisibile, ci piazza sopra 30.000 punti strutturati, e la camera IR cattura tutto. Per quel modulo sono le due di pomeriggio anche alle tre di notte. Ha la sua luce. Non gliene fotte della tua.
Per la TrueDepth camera, è sempre giorno.
Tradotto: 940 nm è una frequenza furba, invisibile all'occhio ma non assorbita dall'atmosfera. La camera IR ha un filtro che vede solo quella frequenza. Ignora tutto il resto. Nessuna torcia nascosta. Solo fisica.
// La Macchina Fotografica Invisibile
Sezione 02. Come funziona la TrueDepth cameraMattina dopo. Caffè. La iena è già in giro per casa, organizza cose, sposta cose, pulisce cose che non hanno bisogno di essere pulite. Io mi chiudo in ufficio. Apro la documentazione Apple. Apro i paper. Apro il terminale.
Dentro quel notch che tutti odiano ci sono tre pezzi di hardware che lavorano in sequenza. E fanno cose assurde.
I tre componenti
Flood Illuminator. Il primo che parte. Ti spara luce infrarossa uniforme in faccia. Serve per illuminare la scena e fare un check veloce: "c'è una faccia davanti a me?". Se no, il resto non parte nemmeno. Batteria ringrazia.
Dot Projector. Il pezzo forte. Spara 30.000 punti infrarossi sul volto. Non a caso: è un pattern preciso, generato da un VCSEL (Vertical-Cavity Surface-Emitting Laser) attraverso un elemento ottico diffrattivo. Il trucco è che il pattern è fisso, ma quando colpisce la tua faccia i punti si deformano. Il naso li sposta da una parte, le orbite dall'altra. La deformazione dei punti È la tua faccia.
IR Camera. Fotografa il casino di punti deformati. Siccome sa dove dovrebbero stare su una faccia piatta, dalla differenza calcola quanto sporge o rientra ogni punto. Triangolazione a luce strutturata: sai dove sta il proiettore, sai dove sta la camera, sai il pattern originale, e dalla deformazione tiri fuori la geometria 3D.
Quello che esce è una depth map: un'immagine dove ogni pixel non è un colore ma una distanza. Il naso è il punto più vicino, le orecchie più lontane, le orbite incavate. La mappa 3D della tua faccia, fatta in millisecondi, al buio, senza che te ne accorgi.
Otto passaggi. Da un fascio di luce invisibile a "sei tu" o "vaffanculo". Meno di 100 millisecondi. Meno di un battito di palpebre. E io stanotte ci ho messo mezz'ora a capire che non serve la luce. Consolante.
Triangolazione: profondità d dalla disparità tra posizione attesa e osservata del punto IR. f = focale, B = baseline proiettore-camera
// La App da 50 Righe
Sezione 03. FaceDepthDumper, estrarre la mesh 3D dal vivoLa teoria è bella. Ma io i dati li voglio vedere. Non mi fido di quello che dice Apple nei whitepaper. Mi fido di quello che il telefono mi sputa fuori quando lo interrogo direttamente. Quindi mi faccio un'app.
FaceDepthDumper. 50 righe di Swift utile, il resto è merda di SwiftUI. Attivo la ARFaceTrackingConfiguration di ARKit, catturo la depth map dalla TrueDepth, estraggo la mesh 3D del volto e salvo tutto. Zero librerie esterne, zero dipendenze, zero cloud. Solo il framework che Apple ti dà gratis e un iPhone con Face ID.
vedi il codice su GitHub
Compilo. Installo sull'iPhone. Mi punto il telefono in faccia.
E quello che esce è questo:
1220 vertici. 2304 triangoli. 78 KB. La mia faccia pesa meno di un'icona del desktop.
Il file OBJ che esce è testo puro. Ogni riga v è un vertice con coordinate x, y, z in metri. Ogni riga f è un triangolo che collega tre vertici. Puoi aprirlo con Blender, con Xcode, con un editor di testo, con quello che ti pare. La mia faccia in formato leggibile da un umano.
vedi lo script su GitHub
Attenzione però: la mesh di ARKit non è quella che usa Face ID per davvero. Questa è la versione per sviluppatori, 1220 vertici bastano per le Animoji e i filtri di Snapchat, non per l'autenticazione. Quella vera nel Secure Enclave ha una risoluzione molto più alta. Ma il concetto è lo stesso: una nuvola di punti 3D che descrive la tua faccia.
Il punto: ARKit ti espone capturedDepthData e ARFaceAnchor.geometry come API pubbliche. Abbastanza per giocarci, non abbastanza per replicare Face ID. La versione vera del template non esce mai dal SEP. Questa è il fratello minore. Ma per capire il meccanismo, basta e avanza.
// 128 Numeri
Sezione 04. Dal volto a un punto nello spazio a 128 dimensioniOk, ho la mesh. Ho la depth map. Ho la faccia in 3D. Ma Face ID non confronta mesh. Non sovrappone nuvole di punti. Non fa matching pixel per pixel. Sarebbe troppo lento e troppo fragile: ti fai crescere la barba e sei fuori, metti gli occhiali e sei fuori, giri la testa di 5 gradi e sei fuori.
Quello che fa è più elegante: prende la rappresentazione 3D e la passa attraverso una rete neurale che la comprime in 128 numeri. Un embedding. Un punto in uno spazio a 128 dimensioni. Tutta la tua faccia, proporzioni, distanza tra gli occhi, curvatura del naso, profondità delle orbite, ridotta a 128 float.
Ovviamente voglio vederli. Il chip di Apple non me lo fa toccare nessuno, ma posso usare FaceNet e la libreria face_recognition di Python. Stesso principio: foto del volto dentro, 128 numeri fuori.
Ecco. La mia faccia è 128 numeri. Il primo, -0.1530, codifica qualcosa. Il quarto, 0.0649, qualcos'altro. Non puoi dire "il numero 37 è la distanza tra gli occhi" perché la rete non funziona così. Ogni dimensione cattura un mix non lineare di features che nessun umano può interpretare. Ma l'insieme dei 128 numeri è un punto unico nello spazio che rappresenta te.
Ogni persona è un punto diverso in questo spazio a 128 dimensioni. Punti vicini = stessa persona. Punti lontani = persone diverse. Non servono pixel, mesh, depth map. Bastano 128 numeri e una distanza.
Nota nerd: L'embedding di Apple probabilmente non è esattamente 128D, il whitepaper non lo dice. Ma il principio è quello di FaceNet (Google, 2015): una rete addestrata con triplet loss che impara a mettere vicini i volti della stessa persona e lontani quelli di persone diverse. 128 è lo sweet spot trovato da Schroff et al., abbastanza per discriminare, non troppo da sprecare risorse.
// La Distanza tra Due Facce
Sezione 05. Cosine similarity, il cuore del matchingOk, ho due foto. Come decide se è la stessa persona? Con un prodotto scalare e una divisione. Fine.
La similarità coseno misura l'angolo tra due vettori. Stessa direzione = 1. Ortogonali = 0. Opposti = -1. Non importa quanto sono lunghi, conta solo dove puntano.
Due volti sono la stessa persona se il coseno dell'angolo tra i loro vettori è vicino a 1
Prendo due mie foto. Condizioni diverse: una in ufficio con luce artificiale, una fuori col sole. Estraggo entrambi gli embedding. Li confronto.
Stessa persona: distanza coseno 0.016, similarità 98.4%. Due foto in condizioni completamente diverse, ma i vettori puntano quasi nella stessa direzione. La rete se ne fotte dell'illuminazione, dell'angolo, dello sfondo. Ha estratto quello che resta invariante: la geometria del volto.
Persona diversa: la libreria face_recognition usa anche la distanza euclidea come metrica. Con lo sconosciuto: 0.89, ben sopra la soglia di 0.6. Stessa idea, misura diversa. La soglia non è a caso: è il punto in cui il tasso di falsi positivi scende sotto \(10^{-6}\), una possibilità su un milione. Apple dichiara quella come probabilità che un volto casuale sblocchi il tuo telefono. Quel numero è una soglia di distanza travestita da statistica.
Soglia di face_recognition (dlib). Face ID usa una soglia analoga nel Secure Enclave, calibrata per FAR = 10⁻⁶
Tutto qui. La tua identità è una direzione in uno spazio a 128 dimensioni. Ogni sblocco è un prodotto scalare. Ogni acquisto su Apple Pay è una norma euclidea. Quel mezzo secondo in cui alzi il telefono e Face ID ti riconosce? 128 moltiplicazioni, 128 somme, una radice quadrata e un confronto con una soglia. Fine.
// Sotto il Cofano di Apple
Sezione 06. Reverse engineering di BiometricKit.frameworkFin qui ho usato roba pubblica: ARKit, face_recognition, scipy. Quello che fa chiunque. Ma a me non basta. Voglio vedere come Apple ha organizzato il codice che governa Face ID. Non il neural network, quello sta nel Secure Enclave e non esce, ma il framework che fa da interfaccia tra iOS e il chip biometrico.
BiometricKit.framework. Framework privato, vive in /System/Library/PrivateFrameworks/. Non documentato, non nelle API pubbliche, non dovresti nemmeno sapere che esiste. Ma con un bridge Python-ObjC tiro fuori le interfacce delle classi. Non il codice, non l'implementazione: solo i nomi dei metodi. È come leggere l'indice di un libro senza poterne leggere i capitoli. Ma l'indice dice già un sacco di cose.
Cosa ci dicono i nomi dei metodi
matchCount che incrementa. Questo è il dettaglio figo. Ogni volta che Face ID ti riconosce, il contatore sale. E non è solo statistico: Apple usa i match riusciti per aggiornare il template. Il campo updateCount lo conferma. Face ID non è una foto statica della tua faccia: è un modello vivo. Ti fai crescere la barba piano? Il template si aggiorna ogni giorno. Metti gli occhiali nuovi? I primi sblocchi saranno col PIN, ma dopo qualche match riuscito il template incorpora anche la versione con gli occhiali. Il coso impara la tua faccia.
listAccessories_. Aggiunto con iOS 14.5, quando Apple ha messo lo sblocco con mascherina. Il framework distingue tra faccia nuda, faccia con occhiali, faccia con mascherina. Ogni variante ha un sotto-template dedicato.
forceBioLockout. Cinque tentativi falliti = bloccato. Non un timeout, un lockout che vuole il PIN. Protezione brute force banale ma funziona.
BiometricKitXPCClient. Tutto passa via XPC, il meccanismo IPC di Apple. Il framework non tocca mai i dati biometrici. Manda messaggi a un demone (biometrickd), che parla col Secure Enclave. Tre livelli di isolamento tra la tua app e la tua faccia.
Il punto: 11 classi, centinaia di metodi, ma nessuno contiene la logica di matching vera. È tutto interfaccia IPC: messaggi al Secure Enclave e risposte. La computazione biometrica vera gira su un processore separato con il suo OS (sepOS). BiometricKit è il citofono. Il portiere sta altrove.
// Il Muro del Secure Enclave
Sezione 07. Quello che non ho potuto smontareE qui mi fermo. Non perché non so come andare avanti. Perché non si può.
Il Secure Enclave Processor (SEP) è un chip separato dentro il SoC Apple. Non una partizione software. Non un processo isolato. Un processore fisicamente distinto con il suo kernel, la sua memoria, la sua catena di boot. Nemmeno il processore principale, quello su cui gira iOS, ci può parlare direttamente. Comunicano via mailbox hardware con messaggi firmati.
Dentro il SEP vive tutto quello che conta:
- La rete neurale che converte la depth map in embedding
- Il template di enrollment (la tua faccia registrata)
- I pesi del modello (non aggiornabili da remoto)
- La chiave crittografica legata all'UID del dispositivo
- La logica di matching e la soglia di decisione
Il whitepaper Apple lo dice chiaro: "The mathematical representation of your face is encrypted with a key available only to the Secure Enclave. This data is further protected with a class key tangled with the device UID." Tradotto: anche se dissaldi la NAND flash del telefono, senza l'UID di quel dispositivo specifico hai un blob di byte cifrati. Nessun altro dispositivo al mondo li decifra.
Niente API. Niente debug interface. Niente JTAG. Niente dump della memoria. Il SEP ha il suo boot ROM immutabile, la sua chain of trust, e si rifiuta di parlare con chiunque non sia autorizzato. Se rileva una manomissione, non si avvia. Game over.
Il template è cifrato con una chiave derivata dal SEP e intrecciata con l'UID hardware univoco del dispositivo
Ho cercato. Paper, talk al Black Hat, CCC, ogni exploit pubblico. Il SEP è stato bucato una volta nel 2020, team cinese Pangu, vulnerabilità nel boot ROM del T2 dei Mac. Ma era un'altra ROM, un'altra generazione, e Apple ha patchato il silicio. Sui chip serie A (iPhone)? Zero exploit pubblici.
Il Secure Enclave è l'unica cosa che non ho smontato. Apple ha fatto bene il suo lavoro.
Il punto: la mailbox hardware accetta solo comandi predefiniti. Non puoi mandargli codice arbitrario. Non puoi chiedergli di esportare niente. Puoi solo dire "questo volto è il mio?" e ricevere sì o no. Come parlare con un giudice che risponde solo "colpevole" o "innocente" e non ti mostra mai le prove.
// Gli Attacchi
Sezione 08. Cosa funziona, cosa no, e perchéSerena chiama su FaceTime. "Pa', che fai?" "Smonto Face ID." Silenzio. "Cioè il tuo?" "Sì." "Ma perché?" "Perché stanotte si è sbloccato al buio e voglio capire come fa." Altro silenzio. Poi quel sospiro che solo una figlia sa fare, quel misto di rassegnazione e vergogna che dice "mio padre è un caso umano". "Ok pa'. Ciao." Riattacca.
Mentre Serena è a casa sua probabilmente su TikTok, io testo gli attacchi. Quelli dei paper, quelli dei talk al Black Hat. Non ho un laboratorio con stampanti 3D industriali, ma le basi le posso provare.
Risultati
| Attacco | Metodo | Risultato | Perché |
|---|---|---|---|
| Foto A4 | Stampa a colori del volto | RESPINTO | Nessuna profondità. I 30.000 punti IR rimbalzano su un piano. Zero curvatura. |
| Video su iPad | Video frontale su schermo piatto | RESPINTO | Superficie piatta. L'IR non penetra il vetro dell'iPad. Zero geometria 3D. |
| Nastro su occhiali | Nastro adesivo nero sulle lenti | BYPASS attention | Inganna il controllo "occhi aperti". Documentato (CVE). Richiede volto reale addormentato. |
| Maschera 3D | Stampa 3D ad alta risoluzione | POSSIBILE | Brekke & Halseth (2018), VNPT (2017). Funziona se la maschera ha dettaglio submillimetrico e texture IR corretta. |
| Gemelli | Gemello identico | ~30% FAR | Gemelli identici, fratelli molto somiglianti e bambini sotto 13 anni hanno FAR più alto. |
Foto e video falliscono sempre. Subito. Il dot projector vede un piano, non un volto. La profondità non c'è e non puoi fingerla con un LCD. Per questo Apple è passata dal Touch ID (che freghi con un dito in silicone) al Face ID: la tridimensionalità è un canale molto più difficile da falsificare.
Il nastro sugli occhiali è l'attacco più figo. Face ID controlla se i tuoi occhi sono aperti (attention check). Nastro nero opaco sulle lenti simula occhi aperti per la camera IR, perché il nastro assorbe l'IR come la pupilla. Non sblocca il telefono di un estraneo — serve la tua faccia vera — ma sblocca il telefono di uno che dorme. Documentato al Black Hat 2019.
La maschera 3D è l'attacco da laboratorio. Scansione 3D submillimetrica della vittima, stampa 3D con materiale che riflette l'IR come la pelle, texture degli occhi con la giusta risposta IR. I ricercatori di VNPT (Vietnam) ci sono riusciti nel 2017, una settimana dopo il lancio di iPhone X. Costo: 150 dollari e ore di lavoro specializzato. Per rubare un telefono al bar non vale la pena. Per un attacco mirato, è reale.
I gemelli identici sono la kryptonite. Apple stessa lo ammette: probabilità significativamente più alta di sblocco reciproco. ~30% di false acceptance rate da studi indipendenti. La ragione è geometrica: stessa struttura ossea, embedding quasi identici, distanza sotto soglia. Non c'è niente da fare.
Il punto: Face ID non è perfetto. È un trade-off: l'attacco da bar è praticamente impossibile, l'attacco mirato è abbastanza costoso da non valere la pena nel 99.99% dei casi. Ma se qualcuno vuole davvero entrare nel tuo telefono e ha risorse illimitate, la tua faccia non è la barriera più forte. Il PIN a 6 cifre, paradossalmente, è più sicuro — non puoi fotocopiare un PIN.
// 128 Numeri in un Chip che Non Parla
Sezione 09. ConclusioneRicapitolo. Quando alzi il telefono al buio alle tre di notte succede questo:
- Il flood illuminator inonda la tua faccia di luce IR a 940 nm
- Il dot projector spara 30.000 punti infrarossi strutturati
- La camera IR cattura il pattern deformato dalla geometria del volto
- Un algoritmo di triangolazione a luce strutturata calcola la depth map
- La depth map viene convertita in una mesh 3D di migliaia di vertici
- Una rete neurale nel Secure Enclave comprime la mesh in 128 numeri
- L'embedding viene confrontato con il template di enrollment
- Se la distanza coseno è sotto soglia: sbloccato. Se no: locked.
Otto passaggi. 100 millisecondi. Tutto al buio. Tutto invisibile. Tutto su un processore che non puoi toccare, con dati cifrati con una chiave che esiste solo in quel telefono e morirà con lui.
La faccia che vedi nello specchio non è quella che vede Face ID. Lo specchio ti mostra luce visibile. Face ID vede infrarosso, profondità, geometria. Vede le tue ossa zigomatiche, non il colore delle guance. Vede la curvatura del naso, non se ti sei fatto la barba. Riduce tutto a un punto in uno spazio a 128 dimensioni. Ogni mattina, ogni notifica, ogni acquisto: un prodotto scalare e una soglia. Se la distanza è abbastanza piccola, sei tu. Se no, sei fuori.
La mattina dopo. Colazione. La iena è al tavolo con il caffè. Mi guarda.
"Cosa facevi stanotte col telefono?"
"Niente, mi sono sbloccato."
"E ci hai messo tutta la notte?"
Non le rispondo. Ho il telefono in mano. Sto già scrivendo il codice.
30.000 punti infrarossi. 1220 vertici. 128 dimensioni. Una soglia. Un prodotto scalare. Zero luce visibile. La TrueDepth camera ha trasformato la tua faccia in un vettore e il tuo vettore in una chiave. Non in senso metaforico: in senso matematico. Un punto nello spazio, una distanza, un sì o un no. L'unica cosa tra te e il tuo telefono è un angolo in uno spazio che non puoi immaginare. E l'unica cosa che protegge quel vettore è un chip che si rifiuta di parlare con il mondo esterno. Se il tuo volto è un vettore, il Secure Enclave è la cassaforte. E io, alle tre di notte, nel buio della camera, con la iena che russa, ho scoperto che la cassaforte fa bene il suo lavoro.
Signal Pirate