このツールは、ACM CCS 2017 会議論文 #124 Return of the Coppersmith's Attack: Practical Factorization of Widely Used RSA Moduli に関連しています。
このツールを使用すると、公開RSA鍵に、説明されている脆弱性が存在するかテストできます。
2017年11月4日更新: Python 2.7、3.4以上に対応。
2017年10月30日更新: 攻撃に関する論文は既に公開されています。ACM版。
2017年10月30日更新: 離散対数検出器がPythonで実装され、デフォルトで使用されるようになりました。これは、因数分解アルゴリズムが利用する素数の構造を検出します。
現在、このツールは以下の鍵形式に対応しています:
*.der、*.crt*.pem*.pem*.pem(正しいヘッダー -----BEGIN RSA... が必要)*.pub、"ssh-rsa" で始まり、1行に1つ*.pgp、*.asc。1ファイルに複数、正しいヘッダー -----BEGIN PGP... が必要*.apk*.txt。モジュラスは以下のいずれか
a) base64エンコード数値、b) 16進エンコード数値、c) 10進エンコード数値;binary:: で終わるフィールドはX509証明書としてデコードを試みます。--jks-pass-file で追加指定可能。検出ツールは、簡単な統合・操作のために意図的に単一ファイル実装となっています。
偽陽性検出率:
離散対数検出器はPythonコードのみに実装されており、デフォルトの検出方法として使用されます。
JavaおよびC#のコード移植版は元の公開以降メンテナンスされておらず、これらの検出器をより高精度な方法にアップグレードする予定はありません。ただし、PRは歓迎します!
オンラインチェッカーは離散対数検出器アルゴリズムを使用しています。
検出ライブラリ+ツールを pip でインストール(すべての依存関係をインストール):
pip install roca-detect
パッケージのルートフォルダで以下を実行:
pip install --upgrade --find-links=. .
pip が例えば 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鍵をテストするには、メールクライアントからエクスポートするか、https://pgp.mit.edu/ などのPGP鍵サーバーからダウンロードできます。
また、gpg コマンドラインユーティリティを使用して公開鍵をエクスポートすることもできます:
gpg --armor --export [email protected] > mykey.asc
検出ツールは鍵に関する情報を抽出し、表示できます:
roca-detect.py --dump --flatten --indent ~/.ssh/
roca-detect-tls はリモートのTLS/SSLポートから証明書を検出します。改行区切りの address:port エントリを含むファイルを用意し、そのファイルを入力として使用します。
ファイル例: 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を使用することを強く推奨します。
システムPythonを更新できない/したくない場合は、pyenv を使用してローカルに新しい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リポジトリへのリンクが含まれています。