
ROCA: Vulnerabilidad de clave RSA de Infineon
Esta herramienta está relacionada con el artículo de la conferencia ACM CCS 2017 #124 Return of the Coppersmith’s Attack: Practical Factorization of Widely Used RSA Moduli.
Permite probar claves públicas RSA para detectar la presencia de la vulnerabilidad descrita.
Actualización 4.11.2017: Compatible con Python 2.7, 3.4+.
Actualización 30.10.2017: El artículo del ataque ya está disponible en línea, versión ACM.
Actualización 30.10.2017: El detector de logaritmos discretos ahora está implementado en Python y se usa como método predeterminado. Detecta la estructura en los primos explotada por el algoritmo de factorización.
Actualmente la herramienta soporta los siguientes formatos de clave:
*.der, *.crt*.pem*.pem*.pem (debe tener el encabezado correcto )-----BEGIN RSA...*.pub, comenzando con "ssh-rsa", una por línea*.pgp, *.asc. Varios por archivo, debe tener el encabezado correcto -----BEGIN PGP...*.apk*.txt, el módulo puede ser
a) número codificado en base64, b) número codificado en hexadecimal, c) número codificado en decimal;binary:: se intenta decodificar como certificado X509--jks-pass-fileLa herramienta de detección es intencionalmente una implementación de un solo archivo para facilitar la integración/manipulación.
Tasas de detección de falsos positivos:
El detector de logaritmos discretos está implementado solo en el código Python y se usa como método de detección predeterminado.
Las versiones en Java y C# no se mantienen desde la publicación original y no planeamos actualizar estos detectores al método más preciso. Sin embargo, ¡se aceptan pull requests!
El verificador en línea utiliza el algoritmo del detector de logaritmos discretos.
Instale la biblioteca del detector + herramienta con pip (instala todas las dependencias):
pip install roca-detect
Ejecute en la carpeta raíz del paquete:
pip install --upgrade --find-links=. .
Puede ser necesario instalar dependencias adicionales para que pip pueda instalar, por ejemplo, el paquete 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
Para imprimir el uso básico:
# Si se instaló con pip / manualmente
roca-detect --help
# Sin instalación (pueden faltar dependencias)
python roca/detect.py
La herramienta de prueba acepta múltiples nombres de archivo / directorios como argumento de entrada. Devuelve el informe mostrando cuántos archivos han sido identificados (y cuáles son).
Ejemplo (no se encontraron vulnerabilidades):
Ejecutando recursivamente en todas mis claves SSH y known_hosts:
$> roca-detect ~/.ssh
2017-10-16 13:39:21 [51272] INFO ### RESUMEN ####################
2017-10-16 13:39:21 [51272] INFO Registros probados: 92
2017-10-16 13:39:21 [51272] INFO .. Certificados PEM: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados DER: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Archivos de clave RSA: . 16
2017-10-16 13:39:21 [51272] INFO .. Claves maestras PGP: 0
2017-10-16 13:39:21 [51272] INFO .. Total claves PGP: 0
2017-10-16 13:39:21 [51272] INFO .. Claves SSH: . . . 76
2017-10-16 13:39:21 [51272] INFO .. Claves APK: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Claves JSON: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados LDIFF: . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados JKS: . . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7: . . . . . 0
2017-10-16 13:39:21 [51272] INFO No se encontraron claves identificadas (OK)
2017-10-16 13:39:21 [51272] INFO ################################
Ejemplo (se encontraron vulnerabilidades):
Ejecutando recursivamente en todas mis claves SSH y known_hosts:
$> roca-detect ~/.ssh
<b>2017-10-16 13:39:21 [51272] ADVERTENCIA Huella digital encontrada en el Certificado</b>
...
2017-10-16 13:39:21 [51272] INFO ### RESUMEN ####################
2017-10-16 13:39:21 [51272] INFO Registros probados: 92
2017-10-16 13:39:21 [51272] INFO .. Certificados PEM: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados DER: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Archivos de clave RSA: . 16
2017-10-16 13:39:21 [51272] INFO .. Claves maestras PGP: 0
2017-10-16 13:39:21 [51272] INFO .. Total claves PGP: 0
2017-10-16 13:39:21 [51272] INFO .. Claves SSH: . . . 76
2017-10-16 13:39:21 [51272] INFO .. Claves APK: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Claves JSON: . . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados LDIFF: . . 0
2017-10-16 13:39:21 [51272] INFO .. Certificados JKS: . . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7: . . . . . 0
2017-10-16 13:39:21 [51272] INFO Claves identificadas encontradas: 1
2017-10-16 13:39:21 [51272] INFO ADVERTENCIA: Vulnerabilidad potencial
2017-10-16 13:39:21 [51272] INFO ################################
Para probar su clave PGP puede exportarla desde su cliente de correo o descargarla de un servidor de claves PGP como https://pgp.mit.edu/
También puede usar la utilidad de línea de comandos gpg para exportar su clave pública:
gpg --armor --export [email protected] > mikey.asc
La herramienta de detección extrae información sobre la clave que puede ser mostrada:
roca-detect.py --dump --flatten --indent ~/.ssh/
roca-detect-tls detecta certificados desde puertos TLS/SSL remotos. Proporcione un archivo con una lista de entradas dirección:puerto delimitadas por nueva línea y use ese archivo como entrada.
Archivo de ejemplo: tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Luego ejecute:
roca-detect-tls tls_list.txt
Es posible generar módulos que pasen la prueba de huella digital de módulos pero que en realidad no contengan la estructura que utiliza el algoritmo de factorización. La prueba de módulos Dlog no los marca como positivos.
Generalmente se recomienda crear un nuevo entorno virtual de Python para el proyecto:
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Probamos la herramienta con Python 2.7.13 y funciona (consulte Travis para más información). Tenemos informes que indican que versiones inferiores (<=2.6) no funcionan correctamente, por lo que recomendamos encarecidamente usar Python 2.7 actualizado.
Use pyenv para instalar una nueva versión de Python localmente si no puede / no desea actualizar el Python del sistema.
Internamente descarga las fuentes de Python y las instala en ~/.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
Las herramientas de detección también funcionan con Python 3.4+
Ejecute mediante un contenedor Docker para evitar inconsistencias de entorno. El código fuente de Dockerfile se puede auditar en https://hub.docker.com/r/unnawut/roca-detect/.
docker run --rm -v /ruta/a/sus/claves:/keys --network none unnawut/roca-detect
Asegúrese de usar las banderas --rm y --network none para deshabilitar la conexión de red del contenedor y eliminar el contenedor después de la ejecución.
El código está licenciado bajo la licencia MIT permisiva.
Como hubo solicitudes de doble licencia bajo la licencia Apache 2.0 (debido a algunas dudas sobre la compatibilidad), licenciamos el código también bajo la licencia Apache 2.0.
Elija la licencia que mejor se adapte a sus necesidades, ya sea MIT o Apache 2.0.
Esta sección contiene enlaces a diferentes repositorios GIT con versiones en otros lenguajes