
ROCA: Infineon RSA-Schlüsselschwachstelle
Dieses Tool bezieht sich auf ACM CCS 2017 Konferenzpapier #124 Return of the Coppersmith’s Attack: Practical Factorization of Widely Used RSA Moduli.
Es ermöglicht Ihnen, öffentliche RSA-Schlüssel auf das Vorhandensein der beschriebenen Schwachstelle zu testen.
Update 4.11.2017: Python 2.7, 3.4+ unterstützt.
Update 30.10.2017: Das Papier des Angriffs ist bereits online, ACM-Version.
Update 30.10.2017: Der diskrete Logarithmus-Detektor ist jetzt in Python implementiert und wird standardmäßig verwendet. Er erkennt die Struktur in den Primzahlen, die der Faktorisierungsalgorithmus ausnutzt.
Derzeit unterstützt das Tool die folgenden Schlüsselformate:
*.der, *.crt*.pem*.pem (muss den korrekten Header -----BEGIN... haben)*.pem (muss den korrekten Header -----BEGIN RSA... haben)*.pub, beginnt mit „ssh-rsa“, eine pro Zeile*.pgp, *.asc. Mehrere pro Datei, muss den korrekten Header -----BEGIN PGP... haben*.apk*.txt, Modulus kann a) base64-kodierte Zahl, b) hex-kodierte Zahl, c) dezimal-kodierte Zahl sein;binary:: endet, wird versucht als X509-Zertifikat zu dekodieren.--jks-pass-file an.Das Erkennungstool ist bewusst als Ein-Datei-Implementierung für einfache Integration / Handhabung konzipiert.
Fehlalarm-Erkennungsraten:
Der diskrete Logarithmus-Detektor ist nur im Python-Code implementiert und wird als standardmäßige Erkennungsmethode verwendet.
Die Java- und C#-Code-Ports werden seit der ursprünglichen Veröffentlichung nicht mehr gewartet und wir planen nicht, diese Detektoren auf die genauere Methode zu aktualisieren. Pull-Requests sind jedoch willkommen!
Der Online-Prüfer verwendet den Algorithmus des diskreten Logarithmus-Detektors.
Installieren Sie die Detector-Bibliothek + Tool mit pip (installiert alle Abhängigkeiten):
pip install roca-detect
Führen Sie im Hauptverzeichnis des Pakets aus:
pip install --upgrade --find-links=. .
Es kann erforderlich sein, zusätzliche Abhängigkeiten zu installieren, damit pip z.B. das Paket cryptography installieren kann.
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
Um die grundlegende Verwendung anzuzeigen:
# If installed with pip / manually
roca-detect --help
# Without installation (can miss dependencies)
python roca/detect.py
Das Testtool akzeptiert mehrere Dateinamen / Verzeichnisse als Eingabeargument. Es gibt einen Bericht zurück, der zeigt, wie viele Dateien gefingerprintet wurden (und welche das sind).
Beispiel (keine Schwachstellen gefunden):
Rekursiv ausgeführt auf allen meinen SSH-Schlüsseln und 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 ################################
Beispiel (Schwachstellen gefunden):
Rekursiv ausgeführt auf allen meinen SSH-Schlüsseln und 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 ################################
Um Ihren PGP-Schlüssel zu testen, können Sie ihn aus Ihrem E-Mail-Client exportieren oder von einem PGP-Schlüsselserver wie https://pgp.mit.edu/ herunterladen.
Sie können auch das Befehlszeilentool gpg verwenden, um Ihren öffentlichen Schlüssel zu exportieren:
gpg --armor --export [email protected] > mykey.asc
Das Erkennungstool extrahiert Informationen über den Schlüssel, die angezeigt werden können:
roca-detect.py --dump --flatten --indent ~/.ssh/
Das roca-detect-tls erkennt Zertifikate von entfernten TLS/SSL-Ports. Geben Sie eine Datei mit einer durch Zeilenumbrüche getrennten Liste von Adresse:Port-Einträgen an und verwenden Sie diese Datei als Eingabe.
Beispieldatei: tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Dann führen Sie aus:
roca-detect-tls tls_list.txt
Es ist möglich, Moduli zu generieren, die den Moduli-Fingerprinting-Test bestehen, aber tatsächlich keine Struktur enthalten, die der Faktorisierungsalgorithmus verwendet. Der Dlog-Moduli-Test markiert diese nicht als positiv.
Es wird normalerweise empfohlen, eine neue Python-Virtual-Umgebung für das Projekt zu erstellen:
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Wir haben das Tool mit Python 2.7.13 getestet und es funktioniert (siehe Travis für weitere Informationen). Wir haben Berichte erhalten, dass niedrigere Versionen (<=2.6) nicht richtig funktionieren, daher empfehlen wir dringend ein aktuelles Python 2.7 zu verwenden.
Verwenden Sie pyenv, um lokal eine neue Python-Version zu installieren, wenn Sie das systemweite Python nicht aktualisieren können / möchten.
Es lädt intern die Python-Quellen herunter und installiert sie 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
Die Erkennungstools funktionieren auch mit Python 3.4+
Führen Sie es über einen Docker-Container aus, um Umgebungsinkonsistenzen zu vermeiden. Die Dockerfile-Quelle kann unter https://hub.docker.com/r/unnawut/roca-detect/ überprüft werden.
docker run --rm -v /path/to/your/keys:/keys --network none unnawut/roca-detect
Stellen Sie sicher, dass Sie die Flags --rm und --network none verwenden, um die Netzwerkverbindung des Containers zu deaktivieren und den Container nach dem Ausführen zu löschen.
Der Code ist unter der großzügigen MIT-Lizenz lizenziert.
Da es Anfragen zur doppelten Lizenzierung unter der Apache 2.0-Lizenz gab (aufgrund einiger Zweifel an der Kompatibilität), lizenzieren wir den Code auch unter der Apache 2.0-Lizenz.
Wählen Sie die Lizenz, die Ihnen besser gefällt, entweder MIT oder Apache 2.0.
Dieser Abschnitt enthält Links zu verschiedenen GIT-Repositorys mit Sprach-Ports