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 で生成された 2 つの署名を見つけたりできれば、直ちに秘密鍵を復元できることはよく知られている
- したがって、高品質な乱数ソースがないシステムで 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 年から使われていた方式の問題によって発生したものと見られる。そもそも標準に従わないカスタム実装方式が持つ危険性を示す事例といえる。
- 今回の脆弱性は特定タイプの鍵にしか影響しないが、その鍵を使用したことがある場合は深刻な問題になり得るため、影響を受ける鍵を直ちに廃棄することが重要。
- オープンソースプロジェクトでは暗号関連部分は標準に従い、外部検証も必要だと思われる。特に乱数生成部分は非常に重要なので、OS や検証済みライブラリに依存するのが安全と考えられる。
- PuTTY は SSH、Telnet、Rlogin プロトコルをサポートする広く使われているオープンソースのターミナルエミュレータであり、接続情報保存機能により便利に使われている。今後は脆弱性パッチに積極的に対応する必要がありそうだ。
- macOS や Linux で PuTTY の代わりに使えるターミナルとしては、標準ターミナルアプリや iTerm2 などがある。Windows では Windows Terminal、PowerShell、Cmder などを代替候補として検討できる。
4件のコメント
あ..
このタイプの鍵を使ったことはない気がしますが、とりあえずアップデートはしました。
これを見て、すぐに0.81へアップデートしましたね(笑)
Hacker Newsの反応
以下はHacker Newsのコメントを要約した内容です:
k値も521ビットの乱数である必要があるが、PuTTYは512ビットの乱数しか使っておらず、上位9ビットが0で埋まっていた。これは線形代数によって秘密鍵の漏洩につながる可能性がある。qでモジュラー演算した理由が理解できない。必要なビット数だけ切り出して使うか、メッセージと秘密鍵をそれぞれハッシュしてから組み合わせる方式のほうがよさそうだ。