ニュース

どこでも同じパスワードが生成される……Kasperskyのパスワード生成ツールの問題とは?

Ledger DonjonがKasperskyの許可を得て内容を公表。2020年のパッチで修正済み

Ledger Donjonの公式ブログ

 暗号通貨のハードウェアウォレットを提供するLedger社のセキュリティチーム「Ledger Donjon」は7月6日(現地時間)、「カスペルスキー パスワードマネージャー」の脆弱性「CVE-2020-27020」の詳細を明らかにした。この問題は2019年6月に脆弱性の報奨金プラットフォーム「HackerOne」を通じてKasperskyに提出。翌年、同社によって修正された。本脆弱性の内容は、Kasperskyの許可を得て公表されている。

 「カスペルスキー パスワードマネージャー」(KPM)には強力なパスワードを生成する機能が搭載されているが、これには「Boost」ライブラリが提供する疑似乱数生成器(PRNG)がそのまま用いられていた。これはメルセンヌツイスターによる乱数生成を行うが、暗号化にはあまり適していない。一見すると「KPM」が生成するパスワードはまったくのランダムに見えるが、実は「q」や「x」といった特定の文字が使われやすかった。

「KPM」で出現する文字の頻度(低いほど出現しやすい)

 また、「KPM」は同じ文字ばかり使うパスワードを生成しないよう、一度用いられた文字が再び現れにくいようにする。そのため、ある文字が選ばれると前述の偏りもあいまって、次に特定の文字がくる可能性が高まる。パスワードの文字がそれぞれ独立して・完全にランダムに選ばれる理想の状態に比べると、「KPM」が生成するパスワードはずっと推測しやすくなるわけだ。

 「KPM」のパスワード生成アルゴリズムは、実際のところ、それ単体ではあまり問題にならない。しかし、攻撃対象のユーザーが「KPM」を使っているとあらかじめわかっているならば、脅威になりうる。この問題は、PRNGに代わり暗号論的にセキュアな疑似乱数生成器(CSPRNG)を使うことで回避できる。ちなみにCSPRNGはOS側で用意されており、比較的簡単に利用可能(Windowsの場合「CryptGenRandom」、Linuxの場合「/dev/random」)だ。

 加えて、「KPM」には乱数生成の使い方にも問題があった。乱数を生成する際はシード(初期状態)を設定する。シードが同じであれば、発生する乱数は同じになる。

 しかし、「KPM」ではこのシードに秒単位のシステム時刻が用いられていた。そのため、どの「KPM」インスタンスもその秒においては同じパスワードを生成する。2010年から2021年の間であっても、その秒数は315,619,200に過ぎない。そのため、「KPM」は特定の文字セットに対して315,619,200のパスワードしか生成せず、ものの数分でブルートフォース(総当たり)が可能となる。一般にWebサービスではアカウントの作成日が表示されることが多いので、それを手掛かりにすればさらに探索範囲を絞ることができるだろう。

 なお、これらの問題を検証する過程で範囲外の読み取りの問題も発見されたとのこと。

 「CVE-2020-27020」は、以下のバージョンより前の「KPM」すべてに影響するが、すでに修正済みだ。Ledger Donjonによると、少なくともWindows版でメルセンヌツイスターPRNGが「CryptGenRandom」に置き換えられたことを確認しているとのこと。

  • Windows版 v9.0.2 パッチ F
  • Android版v9.2.14.872
  • iOS版v9.2.14.31

 過去に生成されたパスワードに関しては、再生成が必要である旨がユーザーに通知されている。