
ROCA: vulnerabilità della chiave RSA di Infineon
Questo strumento è correlato all'articolo della conferenza ACM CCS 2017 n.124 Return of the Coppersmith’s Attack: Practical Factorization of Widely Used RSA Moduli.
Permette di testare le chiavi RSA pubbliche per la presenza della vulnerabilità descritta.
Aggiornamento 4.11.2017: supporto Python 2.7, 3.4+.
Aggiornamento 30.10.2017: L'articolo dell'attacco è già online, versione ACM.
Aggiornamento 30.10.2017: Il rilevatore di logaritmo discreto è ora implementato in Python e utilizzato come predefinito. Rileva la struttura nei primi sfruttata dall'algoritmo di fattorizzazione.
Attualmente lo strumento supporta i seguenti formati di chiave:
*.der, *.crt*.pem*.pem*.pem (deve avere l'intestazione corretta -----BEGIN RSA...)*.pub, che inizia con "ssh-rsa", una per riga*.pgp, *.asc. Più per file, deve avere l'intestazione corretta -----BEGIN PGP...*.apk*.txt, il modulo può essere
a) numero codificato in base64, b) numero codificato in hex, c) numero codificato in decimale;binary:: viene tentato di decodificare come certificato X509--jks-pass-fileLo strumento di rilevamento è volutamente implementato in un unico file per una facile integrazione/manipolazione.
Tassi di rilevamento falsi positivi:
Il rilevatore di logaritmo discreto è implementato solo nel codice Python, utilizzato come metodo di rilevamento predefinito.
I porting in Java e C# non sono più mantenuti dalla pubblicazione originale e non prevediamo di aggiornare questi rilevatori al metodo più preciso. Tuttavia, le pull request sono benvenute!
Il controllo online utilizza l'algoritmo del rilevatore di logaritmo discreto.
Installa la libreria di rilevamento + strumento con pip (installa tutte le dipendenze):
pip install roca-detect
Esegui nella cartella principale del pacchetto:
pip install --upgrade --find-links=. .
Potrebbe essere necessario installare dipendenze aggiuntive affinché pip possa installare ad esempio il pacchetto cryptography.
CentOS / RHEL:
sudo yum install python-devel python-pip gcc gcc-c++ make automake autoreconf libtool openssl-devel libffi-devel dialog
Ubuntu:
sudo apt-get install python-pip python-dev build-essential libssl-dev libffi-dev swig
Per stampare l'utilizzo di base:
# Se installato con pip / manualmente
roca-detect --help
# Senza installazione (potrebbero mancare dipendenze)
python roca/detect.py
Lo strumento di test accetta più nomi di file / directory come argomento di input. Restituisce il report che mostra quanti file sono stati identificati (e quali sono).
Esempio (nessuna vulnerabilità trovata):
Esecuzione ricorsiva su tutte le mie chiavi SSH e known_hosts:
$> roca-detect ~/.ssh
2017-10-16 13:39:21 [51272] INFO ### SUMMARY ####################
2017-10-16 13:39:21 [51272] INFO Records tested: 92
2017-10-16 13:39:21 [51272] INFO .. PEM certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. DER certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. RSA key files: . 16
2017-10-16 13:39:21 [51272] INFO .. PGP master keys: 0
2017-10-16 13:39:21 [51272] INFO .. PGP total keys: 0
2017-10-16 13:39:21 [51272] INFO .. SSH keys: . . . 76
2017-10-16 13:39:21 [51272] INFO .. APK keys: . . . 0
2017-10-16 13:39:21 [51272] INFO .. JSON keys: . . . 0
2017-10-16 13:39:21 [51272] INFO .. LDIFF certs: . . 0
2017-10-16 13:39:21 [51272] INFO .. JKS certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7: . . . . . 0
2017-10-16 13:39:21 [51272] INFO No fingerprinted keys found (OK)
2017-10-16 13:39:21 [51272] INFO ################################
Esempio (vulnerabilità trovate):
Esecuzione ricorsiva su tutte le mie chiavi SSH e known_hosts:
$> roca-detect ~/.ssh
<b>2017-10-16 13:39:21 [51272] WARNING Fingerprint found in the Certificate</b>
...
2017-10-16 13:39:21 [51272] INFO ### SUMMARY ####################
2017-10-16 13:39:21 [51272] INFO Records tested: 92
2017-10-16 13:39:21 [51272] INFO .. PEM certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. DER certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. RSA key files: . 16
2017-10-16 13:39:21 [51272] INFO .. PGP master keys: 0
2017-10-16 13:39:21 [51272] INFO .. PGP total keys: 0
2017-10-16 13:39:21 [51272] INFO .. SSH keys: . . . 76
2017-10-16 13:39:21 [51272] INFO .. APK keys: . . . 0
2017-10-16 13:39:21 [51272] INFO .. JSON keys: . . . 0
2017-10-16 13:39:21 [51272] INFO .. LDIFF certs: . . 0
2017-10-16 13:39:21 [51272] INFO .. JKS certs: . . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7: . . . . . 0
2017-10-16 13:39:21 [51272] INFO Fingerprinted keys found: 1
2017-10-16 13:39:21 [51272] INFO WARNING: Potential vulnerability
2017-10-16 13:39:21 [51272] INFO ################################
Per testare la tua chiave PGP puoi esportarla dal tuo client di posta o scaricarla da un server di chiavi PGP come https://pgp.mit.edu/
Puoi anche usare l'utilità a riga di comando gpg per esportare la tua chiave pubblica:
gpg --armor --export [email protected] > mykey.asc
Lo strumento di rilevamento estrae informazioni sulla chiave che possono essere visualizzate:
roca-detect.py --dump --flatten --indent ~/.ssh/
roca-detect-tls rileva certificati da porte TLS/SSL remote. Fornisci un file con un elenco di voci indirizzo:porta delimitate da newline e usa quel file come input.
File di esempio: tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Quindi esegui:
roca-detect-tls tls_list.txt
È possibile generare moduli che superano il test di rilevamento dei moduli ma in realtà non contengono la struttura utilizzata dall'algoritmo di fattorizzazione. Il test dei moduli dlog non li segna come positivi.
Di solito si consiglia di creare un nuovo ambiente virtuale Python per il progetto:
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Abbiamo testato lo strumento con Python 2.7.13 e funziona (vedi Travis per maggiori informazioni). Abbiamo segnalazioni che versioni inferiori (<=2.6) non funzionano correttamente, quindi raccomandiamo vivamente di utilizzare un Python 2.7 aggiornato.
Usa pyenv per installare una nuova versione di Python localmente se non puoi / non vuoi aggiornare il Python di sistema.
Scarica internamente i sorgenti Python e li installa in ~/.pyenv.
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec $SHELL
pyenv install 2.7.13
pyenv local 2.7.13
Gli strumenti di rilevamento funzionano anche con Python 3.4+
Esegui tramite container Docker per evitare inconsistenze di ambiente. Il sorgente del Dockerfile può essere controllato su https://hub.docker.com/r/unnawut/roca-detect/.
docker run --rm -v /path/to/your/keys:/keys --network none unnawut/roca-detect
Assicurati di usare i flag --rm e --network none per disabilitare la connessione di rete del container ed eliminarlo dopo l'esecuzione.
Il codice è concesso in licenza sotto la licenza MIT permissiva.
Poiché ci sono state richieste di doppia licenza sotto licenza Apache 2.0 (a causa di alcuni dubbi sulla compatibilità), concediamo il codice anche sotto licenza Apache 2.0.
Scegli la licenza che preferisci, MIT o Apache 2.0.
Questa sezione contiene link a diversi repository GIT con porting linguistici