该工具与ACM CCS 2017会议论文第124号《Coppersmith攻击归来:广泛使用的RSA模数的实际分解》相关。
它使您能够测试公共RSA密钥是否存在所述的漏洞。
2017年11月4日更新:支持Python 2.7、3.4+。
2017年10月30日更新:离散对数检测器现已在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=. .
可能需要安装额外的依赖项,以便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 ### 摘要 ####################
2017-10-16 13:39:21 [51272] INFO 测试记录数:92
2017-10-16 13:39:21 [51272] INFO .. PEM证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. DER证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. RSA密钥文件:. 16
2017-10-16 13:39:21 [51272] INFO .. PGP主密钥:0
2017-10-16 13:39:21 [51272] INFO .. PGP总密钥数: 0
2017-10-16 13:39:21 [51272] INFO .. SSH密钥:. . . 76
2017-10-16 13:39:21 [51272] INFO .. APK密钥:. . . 0
2017-10-16 13:39:21 [51272] INFO .. JSON密钥:. . . 0
2017-10-16 13:39:21 [51272] INFO .. LDIFF证书:. . 0
2017-10-16 13:39:21 [51272] INFO .. JKS证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7:. . . . . 0
2017-10-16 13:39:21 [51272] INFO 未发现指纹密钥(正常)
2017-10-16 13:39:21 [51272] INFO ################################
示例(发现漏洞):
递归运行所有我的SSH密钥和known_hosts:
$> roca-detect ~/.ssh
<b>2017-10-16 13:39:21 [51272] WARNING 在证书中发现指纹</b>
...
2017-10-16 13:39:21 [51272] INFO ### 摘要 ####################
2017-10-16 13:39:21 [51272] INFO 测试记录数:92
2017-10-16 13:39:21 [51272] INFO .. PEM证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. DER证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. RSA密钥文件:. 16
2017-10-16 13:39:21 [51272] INFO .. PGP主密钥:0
2017-10-16 13:39:21 [51272] INFO .. PGP总密钥数: 0
2017-10-16 13:39:21 [51272] INFO .. SSH密钥:. . . 76
2017-10-16 13:39:21 [51272] INFO .. APK密钥:. . . 0
2017-10-16 13:39:21 [51272] INFO .. JSON密钥:. . . 0
2017-10-16 13:39:21 [51272] INFO .. LDIFF证书:. . 0
2017-10-16 13:39:21 [51272] INFO .. JKS证书:. . . 0
2017-10-16 13:39:21 [51272] INFO .. PKCS7:. . . . . 0
2017-10-16 13:39:21 [51272] INFO 发现指纹密钥:1
2017-10-16 13:39:21 [51272] INFO 警告:存在潜在漏洞
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。
如果您无法/不想更新系统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仓库链接