
ROCA: Infineon RSA 키 취약점
이 도구는 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"로 시작, 줄당 하나*.pgp, *.asc. 파일당 여러 개, 올바른 헤더 -----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 저장소 링크가 포함되어 있습니다.