
ROCA : Vulnérabilité de la clé RSA d'Infineon
Cet outil est lié à l'article de conférence ACM CCS 2017 #124 Return of the Coppersmith's Attack : Practical Factorization of Widely Used RSA Moduli.
Il vous permet de tester la présence de la vulnérabilité décrite dans les clés RSA publiques.
Mise à jour 04/11/2017 : Python 2.7, 3.4+ supportés.
Mise à jour 30/10/2017 : Le papier de l'attaque est déjà en ligne, version ACM.
Mise à jour 30/10/2017 : Le détecteur de logarithme discret est maintenant implémenté en Python et utilisé par défaut. Il détecte la structure dans les nombres premiers exploitée par l'algorithme de factorisation.
Actuellement, l'outil prend en charge les formats de clés suivants :
*.der, *.crt*.pem*.pem*.pem (doit avoir l'en-tête correct -----BEGIN RSA...)*.pub, commençant par "ssh-rsa", une par ligne*.pgp, *.asc. Plusieurs par fichier, doit avoir l'en-tête correct -----BEGIN PGP...*.apk*.txt, le modulo peut être a) un nombre encodé en base64, b) un nombre codé en hexadécimal, c) un nombre codé en décimal;binary:: est tenté d'être décodé en certificat X509--jks-pass-fileL'outil de détection est intentionnellement implémenté en un seul fichier pour une intégration / manipulation facile.
Taux de faux positifs :
Le détecteur de logarithme discret est implémenté uniquement dans le code Python, utilisé comme méthode de détection par défaut.
Les ports en Java et C# ne sont plus maintenus depuis la publication originale et nous ne prévoyons pas de mettre à jour ces détecteurs vers la méthode plus précise. Cependant, les PR sont les bienvenus !
Le vérificateur en ligne utilise l'algorithme du détecteur de logarithme discret.
Installez la bibliothèque de détection + l'outil avec pip (installe toutes les dépendances) :
pip install roca-detect
Exécutez dans le dossier racine du paquet :
pip install --upgrade --find-links=. .
Il peut être nécessaire d'installer des dépendances supplémentaires pour que pip puisse installer, par exemple, le paquet 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
Pour afficher l'utilisation de base :
# Si installé avec pip / manuellement
roca-detect --help
# Sans installation (peut manquer des dépendances)
python roca/detect.py
L'outil de test accepte plusieurs noms de fichiers / répertoires comme argument d'entrée. Il renvoie le rapport indiquant combien de fichiers ont été empreints (et lesquels).
Exemple (aucune vulnérabilité trouvée) :
Exécution récursive sur toutes mes clés SSH et 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 ################################
Exemple (vulnérabilités trouvées) :
Exécution récursive sur toutes mes clés SSH et 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 ################################
Pour tester votre clé PGP, vous pouvez l'exporter depuis votre client de messagerie ou la télécharger depuis un serveur de clés PGP tel que https://pgp.mit.edu/
Vous pouvez également utiliser l'utilitaire en ligne de commande gpg pour exporter votre clé publique :
gpg --armor --export [email protected] > mykey.asc
L'outil de détection extrait des informations sur la clé qui peuvent être affichées :
roca-detect.py --dump --flatten --indent ~/.ssh/
Le roca-detect-tls détecte les certificats depuis des ports TLS/SSL distants. Fournissez un fichier avec une liste d'entrées address:port séparées par des sauts de ligne et utilisez ce fichier comme entrée.
Exemple de fichier : tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Ensuite exécutez :
roca-detect-tls tls_list.txt
Il est possible de générer des modulos qui réussissent le test d'empreinte des modulos mais qui ne contiennent pas réellement la structure utilisée par l'algorithme de factorisation. Le test de modulos Dlog ne les marque pas comme positifs.
Il est généralement recommandé de créer un nouvel environnement virtuel Python pour le projet :
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Nous avons testé l'outil avec Python 2.7.13 et il fonctionne (voir Travis pour plus d'infos). Nous avons des rapports indiquant que les versions inférieures (<=2.6) ne fonctionnent pas correctement, nous recommandons donc vivement d'utiliser Python 2.7 à jour.
Utilisez pyenv pour installer une nouvelle version de Python localement si vous ne pouvez pas / ne voulez pas mettre à jour le Python système.
Il télécharge en interne les sources Python et les installe dans ~/.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
L'outil de détection fonctionne également avec Python 3.4+
Exécutez via un conteneur Docker pour éviter les incohérences d'environnement. La source du Dockerfile peut être audité sur https://hub.docker.com/r/unnawut/roca-detect/.
docker run --rm -v /path/to/your/keys:/keys --network none unnawut/roca-detect
Assurez-vous d'utiliser les drapeaux --rm et --network none pour désactiver la connexion réseau du conteneur et supprimer le conteneur après exécution.
Le code est sous licence MIT permissive.
Comme il y a eu des demandes de double licence sous licence Apache 2.0 (en raison de certains doutes sur la compatibilité), nous concédons également le code sous licence Apache 2.0.
Choisissez la licence qui vous convient le mieux, soit MIT, soit Apache 2.0.
Cette section contient des liens vers différents dépôts GIT avec des ports linguistiques