Certificate Pinning

Indice dei contenuti

    Il certificate pinning (o public key pinning) è una tecnica di sicurezza che associa («fissa») un’applicazione a uno specifico certificato o chiave pubblica attesi dal server con cui comunica. Invece di accettare qualsiasi certificato valido firmato da una CA nel trust store del sistema operativo, l’applicazione verifica che il certificato ricevuto corrisponda esattamente al pin memorizzato — e rifiuta la connessione se non corrisponde, anche se il certificato è tecnicamente valido.

    Il problema che risolve

    Il normale processo di verifica TLS si fida di centinaia di CA root preinstallate nel sistema operativo. Qualsiasi CA può emettere un certificato per qualsiasi dominio — e alcune CA sono state compromesse o hanno emesso certificati fraudolenti (DigiNotar, 2011: certificati falsi per Google, usati per sorveglianza di massa in Iran). Inoltre, in ambienti aziendali o su dispositivi gestiti, le organizzazioni installano CA root aggiuntive per la TLS inspection — permettendo l’intercettazione di tutto il traffico HTTPS del dispositivo.

    Il certificate pinning elimina questo vettore: anche con una CA root aggiuntiva controllata dall’attaccante, il pin non corrisponde e la connessione viene rifiutata.

    Tipi di pin

    Certificate pinning: il pin è il hash dell’intero certificato DER. Semplice da implementare ma rigido — ogni rinnovo del certificato richiede un aggiornamento dell’app prima della scadenza, pena interruzione del servizio.

    Public key pinning (SPKI pinning): il pin è l’hash della Subject Public Key Info del certificato — la chiave pubblica e il suo algoritmo. Più flessibile: il certificato può essere rinnovato (cambiando validità e metadati) mantenendo la stessa coppia di chiavi, senza aggiornare l’app. È il tipo raccomandato.

    Implementazione su mobile

    iOS (NSURLSession / AlamoFire): implementare il delegate URLSession(_:didReceive:completionHandler:) e verificare manualmente i certificati della challenge di autenticazione confrontandoli con il pin.

    Android (OkHttp): CertificatePinner.Builder permette di configurare pin per hostname direttamente nel client HTTP.

    HTTP Public Key Pinning (HPKP): header HTTP che permetteva ai browser di memorizzare i pin lato client. Deprecato da Chrome nel 2018 — troppo rischioso: un errore di configurazione poteva rendere un sito irraggiungibile per tutti i client che avevano memorizzato il pin errato.

    Backup pins

    La pratica corretta richiede sempre almeno due pin: il pin attivo (certificato/chiave corrente) e uno o più backup pin (chiavi generate ma non ancora in uso). In caso di compromissione della chiave primaria o necessità di rotazione, il backup pin permette di ruotare senza downtime per gli utenti che hanno già l’app installata.

    Bypass del certificate pinning

    Il certificate pinning è una delle prime difese che i ricercatori di sicurezza aggiranonel penetration testing delle app mobile, per analizzare il traffico con un proxy (Burp Suite, mitmproxy):

    • Frida: framework di dynamic instrumentation che inietta codice JavaScript nel processo dell’app a runtime, aggancioando le funzioni di verifica del certificato per far restituire sempre true. Su dispositivi non rooted/jailbroken richiede un IPA repackaged.
    • SSL Kill Switch 2 (iOS jailbreak): tweak che disabilita globalmente la verifica del certificato su iOS.
    • Objection: tool basato su Frida che automatizza il bypass del pinning su Android e iOS con un singolo comando.

    La resistenza al bypass dipende dall’implementazione: un pinning implementato in Objective-C/Java è facilmente aggirabile con Frida; un pinning implementato in codice nativo (C/C++ via NDK) o con tecniche di anti-tampering e obfuscation è significativamente più difficile.

    Quando usarlo

    Il certificate pinning è raccomandato per app mobile che gestiscono dati altamente sensibili (banking, healthcare, autenticazione) e per le comunicazioni delle app con i propri backend. È invece sconsigliato — o comunque richiede estrema cura — in contesti dove gli utenti legittimi hanno bisogno di usare proxy aziendali o di ispezione TLS, poiché il pinning li bloccherebbe.

    Ultimo aggiornamento: