
ROCA: уязвимость RSA-ключа Infineon
Данный инструмент связан с докладом на конференции ACM CCS 2017 #124 Return of the Coppersmith’s Attack: Practical Factorization of Widely Used RSA Moduli.
Он позволяет проверить открытые ключи RSA на наличие описанной уязвимости.
Обновление 4.11.2017: Поддерживаются Python 2.7, 3.4+.
Обновление 30.10.2017: Статья об атаке уже опубликована, версия ACM.
Обновление 30.10.2017: Детектор дискретного логарифма теперь реализован на Python и используется по умолчанию. Он обнаруживает структуру в простых числах, используемую алгоритмом факторизации.
В настоящее время инструмент поддерживает следующие форматы ключей:
*.der, *.crt*.pem*.pem*.pem (должен иметь правильный заголовок -----BEGIN RSA...)*.pub, начинается с "ssh-rsa", один на строку*.pgp, *.asc. Несколько на файл, должен иметь правильный заголовок -----BEGIN PGP...*.apk*.txt, модуль может быть:
a) числом в кодировке base64, b) шестнадцатеричным числом, c) десятичным числом;binary::, пытается быть декодировано как сертификат X509.--jks-pass-fileИнструмент обнаружения намеренно реализован в одном файле для упрощения интеграции / манипуляции.
Вероятность ложных срабатываний:
Детектор дискретного логарифма реализован только в коде Python и используется как метод обнаружения по умолчанию.
Порты на Java и C# не поддерживаются с момента оригинальной публикации, и мы не планируем обновлять эти детекторы до более точного метода. Однако PR приветствуются!
Онлайн-проверка использует алгоритм детектора дискретного логарифма.
Установите библиотеку детектора + инструмент с помощью pip (устанавливает все зависимости):
pip install roca-detect
Выполните в корневой папке пакета:
pip install --upgrade --find-links=. .
Может потребоваться установка дополнительных зависимостей для установки, например, пакета 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
Чтобы вывести базовое использование:
# Если установлено с помощью pip / вручную
roca-detect --help
# Без установки (могут отсутствовать зависимости)
python roca/detect.py
Инструмент тестирования принимает несколько имён файлов / директорий в качестве входного аргумента. Он возвращает отчёт, показывающий, сколько файлов было проверено (и какие именно).
Пример (уязвимости не найдены):
Рекурсивный запуск на всех моих SSH-ключах и 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 ################################
Пример (уязвимости найдены):
Рекурсивный запуск на всех моих SSH-ключах и 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 ################################
Чтобы проверить свой PGP-ключ, вы можете экспортировать его из почтового клиента или загрузить с сервера PGP-ключей, например https://pgp.mit.edu/
Вы также можете использовать утилиту командной строки gpg для экспорта открытого ключа:
gpg --armor --export [email protected] > mykey.asc
Инструмент обнаружения извлекает информацию о ключе, которая может быть отображена:
roca-detect.py --dump --flatten --indent ~/.ssh/
Инструмент roca-detect-tls обнаруживает сертификаты с удалённых TLS/SSL-портов. Предоставьте файл с разделённым новой строкой списком записей адрес:порт и используйте этот файл в качестве входных данных.
Пример файла: tls_list.txt
github.com:443
google.com:443
internal.example.com:8080
Затем выполните:
roca-detect-tls tls_list.txt
Возможно сгенерировать модули, которые проходят тест на отпечаток модуля, но на самом деле не содержат структуры, используемой алгоритмом факторизации. Тест на модуль Dlog не помечает их как положительные.
Обычно рекомендуется создать новое виртуальное окружение Python для проекта:
virtualenv ~/pyenv
source ~/pyenv/bin/activate
pip install --upgrade pip
pip install --upgrade --find-links=. .
Мы тестировали инструмент с Python 2.7.13, и он работает (см. Travis для получения дополнительной информации). Есть сообщения о том, что более старые версии (<=2.6) работают некорректно, поэтому мы настоятельно рекомендуем использовать актуальную версию Python 2.7.
Используйте pyenv для установки новой версии Python локально, если вы не можете / не хотите обновлять системный Python.
Он внутренне загружает исходники Python и устанавливает их в ~/.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
Инструменты обнаружения работают также с Python 3.4+
Запустите через Docker-контейнер, чтобы избежать несоответствия окружения. Исходный код Dockerfile можно проверить на https://hub.docker.com/r/unnawut/roca-detect/.
docker run --rm -v /path/to/your/keys:/keys --network none unnawut/roca-detect
Убедитесь, что используете флаги --rm и --network none, чтобы отключить сетевое подключение контейнера и удалить контейнер после выполнения.
Код распространяется под разрешительной лицензией MIT.
Поскольку были запросы на двойное лицензирование под лицензией Apache 2.0 (из-за некоторых сомнений в совместимости), мы лицензируем код также под лицензией Apache 2.0.
Выбирайте лицензию, которая вам больше подходит: MIT или Apache 2.0.
В этом разделе приведены ссылки на различные репозитории GIT с портами на другие языки