Public key encryption.svg

Image credits: Davidgothberg – Own work, Public Domain, Link

Symantec colta in fallo

La Certification Authority Symantec, ingannata da una private key falsa, revoca un certificato digitale valido.

Recentemente è stato riscontrato un comportamento scorretto nella gestione dei certificati di sicurezza; spesso, infatti, vengono accidentalmente rese pubbliche le chiavi private corrispondenti ai Certificati (ad es. vengono inserite all’interno delle applicazioni in fase di rilascio, oppure sono rese accessibili all’interno dei web server).

In conseguenza di un tale comportamento negligente nella gestione dei certificati digitali, le Certification Authority che hanno emesso i certificati “compromessi” dalla pubblicazione delle corrispondenti chiavi private, sono obbligate a revocare i certificati stessi.

Il security researcher Hanno Böck ha quindi provato a verificare se la Symantec avrebbe revocato il suo certificato (valido e legittimo) creando ad arte delle chiavi private false;
come previsto dal ricercatore, la Symantec ha provveduto a revocargli il certificato però sulla base di prove false (le chiavi private contraffatte dallo stesso ricercatore).

Secondo Hanno Böck, il comportamento della Symantec sarebbe imperdonabile, e dimostrerebbe (sempre a detta del ricercatore) che la società in oggetto ricopre la funzione di Certification Authority senza tuttavia avere un’adeguata comprensione delle dinamiche sottostanti alla crittografia.

Come verificare se una chiave privata è valida

Ci sono sostanzialmente due metodi per verificare in maniera affidabile se una determinata chiave privata appartiene ad un determinato certificato.

Primo Metodo di verifica

Il primo metodo consiste nel verificare se i valori “p” e “q” contenuti nella private key costituiscono fattori primi per la public key (in modulo N).

Moltiplicando questi valori e confrontandoli con N è possibile verificare la legittima proprietà della chiave privata (ricordiamo che una delle caratteristiche fondamentali su cui si basa l’algoritmo RSA e la sicurezza della PKI che su esso si basa, è che non è praticamente possibile risalire ai valori “p” e “q” conoscendo il valore noto “N”).

Per verificare la consistenza della private key utilizzando il primo metodo possiamo far ricorso al tool OpenSSL:

openssl rsa -in [privatekey] -check

Una semplice verifica condotta con OpenSSL sulla chiave privata fasulla creata ad arte da Hanno Böck avrebbe prodotto il seguente esito:

RSA key error: n does not equal p q

Verificando di conseguenza che i valori “p” e “q” contenuti nella private key non erano associabili alla corrispondente public key del certificato digitale.

Allo stesso modo, era possibile confrontare la public key calcolando l’impronta hash SPKI SHA256:

openssl pkey -in [privatekey] -pubout -outform der | sha256sum
openssl x509 -in [certificate] -pubkey |openssl pkey -pubin -pubout -outform der | sha256sum

Secondo Metodo di verifica

Un altro metodo consiste nel firmare un messaggio utilizzando la chiave privata e poi verificarne la validità con la chiave pubblica corrispondente.

Sempre utilizzando OpenSSL possiamo eseguire i seguenti comandi:

openssl x509 -in [certificate] -noout -pubkey > pubkey.pem
dd if=/dev/urandom of=rnd bs=32 count=1
openssl rsautl -sign -pkcs -inkey [privatekey] -in rnd -out sig
openssl rsautl -verify -pkcs -pubin -inkey pubkey.pem -in sig -out check
cmp rnd check
rm rnd check sig pubkey.pem

Se l’esecuzione del comando “cmp” non produce alcun esito la firma è verificata; in caso contrario, la chiave privata utilizzata verrebbe riconosciuta come falsa, in quanto non abbinata alla corrispondente chiave pubblica.

Script di Verifica completo

Per automatizzare la verifica della corrispondenza tra chiavi pubbliche/private, è stato predisposto il seguente script di shell, disponibile per il download: