🐥

Puttyで秘密鍵が復元できる脆弱性(CVE-2024-31497)

2024/04/17に公開

概要

PuttyでP-521のECDSAの鍵を利用している場合、署名を集めることで秘密鍵が復元できる

(確認されている)影響のあるソフト

  • Putty 0.68 - 0.80
  • FileZilla 3.24.1 - 3.66.5
  • WinSCP 5.9.5 - 6.3.2
  • TortoiseGit 2.4.0.2 - 2.15.0
  • TortoiseSVN 1.10.0 - 1.14.6

Putty以外のソフトはPuttyを同梱している

影響のあるユーザ

PuttyでP-521を用いたECDSAの鍵を利用しているユーザ。Puttyで生成した鍵かどうかは関係なく、Puttyでこの鍵を利用して署名したことがあるかどうかが問題になる。

影響があるのはECDSAのP-521のみであり、同じECDSAでも他の楕円曲線(P-256やP-384)は影響しない。RSAやed25519などの他のアルゴリズムも影響しない。

鍵のアルゴリズムの確認方法

PEM形式であればopensslコマンドで確認することができる。Puttyの.ppk形式である場合は、PEMに変換してから実施する

秘密鍵の場合

$ openssl pkey -in private.pem -text -noout
Private-Key: (521 bit)
priv:
    ...
pub:
    04:00:2c:b9:94:77:f1:25:3e:76:fd:43:c3:77:0a:
    1e:f1:c7:59:f9:2f:76:e7:c5:f4:6c:b2:44:14:c6:
    f4:1d:53:f9:ca:aa:4d:a4:99:96:71:cd:1d:0d:65:
    ff:ff:7c:21:f1:3e:b7:ae:d5:c6:dc:b3:e4:f2:32:
    0a:2c:da:9f:62:a6:c5:01:4e:77:97:ae:b3:06:76:
    86:8c:7b:16:91:20:b5:85:b3:c1:2b:cc:2b:50:53:
    b5:4e:fc:2c:0e:59:4b:a0:6e:21:c8:b6:43:a1:2b:
    fe:39:3d:45:63:d9:51:27:df:66:23:3c:51:1b:b4:
    cf:a8:27:be:45:32:72:c5:65:43:16:4b:7c
ASN1 OID: secp521r1
NIST CURVE: P-521

公開鍵の場合

$ openssl pkey -pubin -in pubkey.pem -text -noout
Public-Key: (521 bit)
pub:
    04:00:2c:b9:94:77:f1:25:3e:76:fd:43:c3:77:0a:
    1e:f1:c7:59:f9:2f:76:e7:c5:f4:6c:b2:44:14:c6:
    f4:1d:53:f9:ca:aa:4d:a4:99:96:71:cd:1d:0d:65:
    ff:ff:7c:21:f1:3e:b7:ae:d5:c6:dc:b3:e4:f2:32:
    0a:2c:da:9f:62:a6:c5:01:4e:77:97:ae:b3:06:76:
    86:8c:7b:16:91:20:b5:85:b3:c1:2b:cc:2b:50:53:
    b5:4e:fc:2c:0e:59:4b:a0:6e:21:c8:b6:43:a1:2b:
    fe:39:3d:45:63:d9:51:27:df:66:23:3c:51:1b:b4:
    cf:a8:27:be:45:32:72:c5:65:43:16:4b:7c
ASN1 OID: secp521r1
NIST CURVE: P-521
ASN1 OID: secp521r1
NIST CURVE: P-521

と出力されればP-521のECDSAの鍵である。

また、PEM DecoderなどWebサービスを使って確認することができる。公開鍵を入力してDecodeボタンを押すと、PEMをdecodeしてくれる。(間違えて秘密鍵を入力してはいけない)

...
    [ec] => Array
        (
            [curve_name] => secp521r1
            [curve_oid] => 1.3.132.0.35
...

curve_nameがsecp521r1になっていれば、P-521のECDSAの鍵になる。

攻撃者はどのように署名を集めるか

gitのコミット署名にPuttyを用いている場合、署名がそのリポジトリを見れるユーザには公開されている形になる。
また、悪意あるsshサーバにアクセスした場合、sshサーバ側は署名を取得することができる

どれぐらいの署名を集めることで復元可能か

発見者は58個の署名で50%の確率、60個の署名で100%の確率で復元可能と説明している

原因

Puttyにおける、ECDSAのnonceの生成アルゴリズムがランダムではなくバイアスがあリ上位9ビットが常に0であった。このバイアスを用いて攻撃者は署名から秘密鍵を復元することができる。

修正内容

nonceの生成方法をバイアスがないとされるRFC6979の方法に変更した。

対策

  • Putty及びPutty同梱ソフトを脆弱性のないバージョンにアップデートする
  • 鍵ペアを新規に作成して利用する
  • 古い鍵は盗まれているものとして、無効化する
    • 古い鍵はauthorized_keysから削除する

参考

Discussion