GN⁺: PuTTY 취약점 vuln-p521-bias 발견
(chiark.greenend.org.uk)PuTTY 툴의 NIST P521 커브 ECDSA 개인키 서명 생성 취약점
- PuTTY 0.68부터 0.80까지 모든 버전에는 NIST P521 커브를 사용하는 ECDSA 개인 키에서 서명을 생성하는 코드에 심각한 취약점이 있음
- PuTTY 또는 Pageant가 SSH 서버에 인증할 때 키에서 서명을 생성할 때 발생
- 이 취약점에는 CVE-2024-31497이 할당됨
- Ruhr University Bochum의 Fabian Bäumer와 Marcus Brinkmann이 발견
취약점의 영향
- 이 취약점의 영향은 개인키가 노출되는 것임
- 공격자가 수십 개의 서명된 메시지와 공개키를 가지고 있으면 개인키를 복구하기에 충분한 정보를 가지게 됨
- 이를 통해 마치 사용자인 것처럼 서명을 위조하여 해당 키를 사용하는 모든 서버에 로그인할 수 있음
- 이러한 서명을 얻기 위해 공격자는 키를 사용하여 인증하는 서버를 잠시 침해하거나, 키를 보유한 Pageant 사본에 잠시 액세스하기만 하면 됨
- 그러나 이러한 서명은 SSH 연결의 수동적인 도청자에게는 노출되지 않음
- 이러한 유형의 키가 있는 경우 즉시 폐기할 것을 권장
- 모든 OpenSSH authorized_keys 파일과 다른 SSH 서버의 동일한 파일에서 이전 공개키를 제거하여 손상된 키의 서명이 더 이상 가치가 없도록 해야 함
- 그런 다음 새 키 쌍을 생성하여 교체
영향 받는 키 타입
- 영향을 받는 유일한 키 타입은 521비트 ECDSA임
- Windows PuTTYgen에서 'Key fingerprint' 상자의 시작 부분에 ecdsa-sha2-nistp521이 표시되거나, Windows Pageant에 로드될 때 'NIST p521'로 설명되거나, SSH 프로토콜 또는 키 파일에서 ecdsa-sha2-nistp521로 시작하는 ID를 가진 키
- 다른 크기의 ECDSA와 다른 키 알고리즘은 영향을 받지 않음
- 특히 Ed25519는 영향을 받지 않음
오류 상세 내용
- 모든 DSA 서명 체계는 서명 중에 무작위 값을 생성해야 함
- 이를 'nonce'(한 번만 사용되는 값을 의미하는 암호학 용어) 또는 k라는 문자로 알려져 있음
- 공격자가 사용한 k 값을 추측하거나 동일한 k로 생성한 두 개의 서명을 찾을 수 있다면 즉시 개인 키를 복구할 수 있다는 것이 잘 알려져 있음
- 따라서 고품질 무작위성 소스가 없는 시스템에서 DSA 서명을 생성하는 것은 위험함
- PuTTY는 Windows에서 개발되었기 때문에 암호화 난수 생성기가 전혀 없었음
- 따라서 PuTTY는 무작위 숫자를 전혀 사용하지 않고 결정적인 방법을 사용하여 k를 생성해 왔음
- 해시 입력에 서명할 메시지와 개인 키를 모두 포함하는 보안 해시를 계산하는 것이 핵심 기법
- 이 기술은 현재 주류이며 RFC 6979는 이를 수행하는 구체적이고 잘 알려진 방법을 문서화하고 있음
- 그러나 PuTTY는 2001년부터 동일한 작업을 수행했고 RFC는 2013년까지 게시되지 않았기 때문에 해당 사양을 따르지 않았음
취약점 발생 원인
- PuTTY의 기술은 SHA-512 해시를 만든 다음 DSA 시스템에 사용되는 그룹 순서인 q로 모듈로 축소하는 방식으로 작동
- P521을 제외한 모든 경우에 512비트 숫자를 q로 줄임으로써 발생하는 편향은 무시할 만한 수준
- 그러나 P521의 경우 q가 521비트(즉, 512비트 이상)이므로 512비트 숫자를 q로 줄이는 것은 아무런 효과가 없음
- 상위 9비트가 항상 0인 k 값을 얻게 됨
- 이러한 편향으로 인해 키 복구 공격이 가능해짐
취약점 수정 내용
- 이 취약점을 해결하기 위해 모든 DSA 및 ECDSA 키 유형에 대해 PuTTY의 이전 k 생성 시스템을 완전히 버리고 RFC 6979 기술로 전환
- Ed25519와 같은 EdDSA 키는 이미 다른 시스템을 사용했으며 변경되지 않음
- 그러나 이전 k 생성기를 사용하여 서명이 생성될 때마다 기존 P521 개인 키에 대한 정보가 이미 유출되었다는 사실에는 영향을 미치지 않음
GN⁺의 의견
- 비교적 최근에 발견된 취약점이지만, 2001년부터 사용되던 방식의 문제점으로 발생한 것으로 보임. 애초에 표준을 따르지 않은 커스텀 구현방식이 가진 위험성을 보여주는 사례로 볼 수 있음.
- 이번 취약점은 특정 타입의 키에만 영향을 미치지만, 해당 키를 사용한 적이 있다면 심각한 문제가 될 수 있으므로 영향 받는 키를 즉시 폐기하는 것이 중요함.
- 오픈소스 프로젝트에서 암호화 관련 부분은 표준을 따르고, 외부 검증도 필요해 보임. 특히 난수 생성 부분은 매우 중요하므로 운영체제나 검증된 라이브러리에 의존하는 것이 안전할 것으로 보임.
- PuTTY는 SSH, Telnet, Rlogin 프로토콜을 지원하는 널리 사용되는 오픈소스 터미널 에뮬레이터로, 접속 정보 저장 기능으로 편리하게 사용되고 있음. 향후 취약점 패치에 적극적으로 대응하는 것이 필요해 보임.
- macOS나 리눅스에서 PuTTY 대신 사용할 수 있는 터미널로는 기본 터미널 앱이나 iTerm2 등이 있음. 윈도우에서는 Windows Terminal, PowerShell, Cmder 등을 대안으로 고려해 볼 수 있음.
Hacker News 의견
다음은 해커뉴스 댓글들을 요약한 내용입니다:
- PuTTY에서 사용하는 ECDSA P-521 키 생성 방식에 취약점이 발견됨. 521비트 모듈러스를 사용할 때는 k 값도 521비트 랜덤이어야 하는데, PuTTY는 512비트 랜덤만 사용해 상위 9비트가 0으로 채워짐. 이는 선형대수를 통해 개인키 유출로 이어질 수 있음.
- PuTTY 개발자 Simon Tatham의 솔직하고 명확한 취약점 공개 자세를 높이 평가함. 변명이나 축소 없이 사실 그대로를 전달함.
- 취약점이 어떻게 발견되었는지에 대한 배경 설명이 부족함.
- 최신 Windows에는 OpenSSH가 기본 내장되어 있어 PuTTY를 더 이상 사용하지 않아도 됨. 다만 사용 습관이나 관성으로 계속 쓰는 사람들이 많음.
- 기본값을 사용하지 않고 해당 키 타입을 선택한 사람은 많지 않을 것임.
- P521 호스트 키를 사용중이라면 클라이언트 업그레이드 후 키 교체가 필요할 수 있음.
- RNG나 모듈러 연산이 필요없는 EdDSA로의 전환을 고려해볼 만함.
- PuTTY라는 이름이 창문 유리를 고정하는 퍼티(putty)에서 유래했음을 뒤늦게 깨달음.
- PuTTY가 SHA-512 해시 결과를 q로 모듈러 연산한 이유가 이해가 안 됨. 필요한 비트만큼 잘라쓰거나 메시지와 개인키를 각각 해시한 뒤 조합하는 방식이 더 나아보임.
- 521비트 랜덤 숫자 대신 상위 9비트가 0인 숫자를 사용하면 60번 서명 후 개인키가 유출된다는데, 어떤 원리인지 궁금함.