
ROCA: Vulnerabilidade de chave RSA da Infineon
Esta ferramenta está relacionada ao artigo da conferência ACM CCS 2017 #124 Return of the Coppersmith’s Attack: Practical Factorization of Widely Used RSA Moduli.
Permite testar chaves RSA públicas quanto à presença da vulnerabilidade descrita.
Atualização 4.11.2017: Python 2.7, 3.4+ suportados.
Atualização 30.10.2017: O artigo do ataque já está online, versão ACM.
Atualização 30.10.2017: O detector de logaritmo discreto agora está implementado em Python e usado como padrão. Ele detecta a estrutura nos primos explorada pelo algoritmo de fatoração.
Atualmente a ferramenta suporta os seguintes formatos de chave:
*.der, *.crt*.pem*.pem*.pem (deve ter o cabeçalho correto -----BEGIN RSA...)*.pub, começando com "ssh-rsa", uma por linha*.pgp, *.asc. Vários por arquivo, deve ter o cabeçalho correto -----BEGIN PGP...*.apk*.txt, o módulo pode ser a) número codificado em base64, b) número codificado em hexadecimal, c) número codificado em decimal;binary:: é tentado decodificar como certificado X509--jks-pass-fileA ferramenta de detecção é intencionalmente uma implementação de arquivo único para facilitar a integração/manipulação.
Taxas de detecção de falso positivo:
O detector de logaritmo discreto está implementado apenas no código Python, usado como método de detecção padrão.
As portas de código Java e C# não são mantidas desde a publicação original e não planejamos atualizar esses detectores para o método mais preciso. No entanto, PRs são bem-vindos!
O verificador online está usando o algoritmo do detector de logaritmo discreto.
Instale a biblioteca do detector + ferramenta com pip (instala todas as dependências):
pip install roca-detect
Execute na pasta raiz do pacote:
pip install --upgrade --find-links=. .
Pode ser necessário instalar dependências adicionais para que o pip possa instalar, por exemplo, o pacote 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 o uso básico:
# If installed with pip / manually
roca-detect --help
# Without installation (can miss dependencies)
python roca/detect.py
A ferramenta de teste aceita vários nomes de arquivo/diretórios como argumento de entrada. Ela retorna o relatório mostrando quantos arquivos foram identificados (e quais são eles).
Exemplo (nenhuma vulnerabilidade encontrada):
Executando recursivamente em todas as minhas chaves 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 ################################
Exemplo (vulnerabilidades encontradas):
Executando recursivamente em todas as minhas chaves 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 ################################
Para testar sua chave PGP, você pode exportá-la do seu cliente de email ou baixá-la de um servidor de chaves PGP como https://pgp.mit.edu/
Você também pode usar o utilitário de linha de comando gpg para exportar sua chave pública:
gpg --armor --export [email protected] > mykey.asc
A ferramenta de detecção extrai informações sobre a chave que podem ser exibidas:
roca-detect.py --dump --flatten --indent ~/.ssh/
O roca-detect-tls detecta certificados de portas TLS/SSL remotas. Forneça um arquivo com uma lista delimitada por novas linhas de entradas address:port e use esse arquivo como entrada.
Arquivo de exemplo: tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Em seguida execute:
roca-detect-tls tls_list.txt
É possível gerar módulos que passam no teste de identificação de módulos, mas na verdade não contêm a estrutura que o algoritmo de fatoração está usando. O teste de módulos Dlog não marca esses como positivos.
Geralmente é recomendado criar um novo ambiente virtual Python para o projeto:
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Testamos a ferramenta com Python 2.7.13 e funciona (veja Travis para mais informações). Temos relatos dizendo que versões inferiores (<=2.6) não funcionam corretamente, portanto, recomendamos fortemente usar Python 2.7 atualizado.
Use pyenv para instalar uma nova versão do Python localmente se você não puder / não quiser atualizar o Python do sistema.
Ele baixa internamente as fontes do Python e o instala em ~/.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
As ferramentas de detecção também funcionam com Python 3.4+
Execute via contêiner Docker para evitar inconsistência de ambiente. A origem do Dockerfile pode ser auditada em https://hub.docker.com/r/unnawut/roca-detect/.
docker run --rm -v /path/to/your/keys:/keys --network none unnawut/roca-detect
Certifique-se de usar as flags --rm e --network none para desabilitar a conexão de rede do contêiner e excluí-lo após a execução.
O código é licenciado sob a licença MIT permissiva.
Como houve solicitações de licenciamento duplo sob a licença Apache 2.0 (devido a algumas dúvidas sobre compatibilidade), estamos licenciando o código também sob a licença Apache 2.0.
Escolha a licença que melhor se adequa a você, MIT ou Apache 2.0.
Esta seção contém links para diferentes repositórios GIT com portas de linguagem