セキュリティ

カスペルスキーのパスワードマネージャーが生成したパスワードは総当たり攻撃で爆速突破が可能と判明、一体なぜか?


セキュリティ調査企業のLedger Donjonが、セキュリティ企業・カスペルスキーの開発するパスワードマネージャー「Kaspersky Password Manager(KPM)」のプログラムに問題があり、生成されたパスワードが総当たり攻撃に対して非常に脆弱だったことが判明したと発表しました。KPMの利用者には既にパスワードの更新をするように促すメッセージが送信されており、記事作成時点ですでに問題は修正済みとのことです。

Kaspersky Password Manager: All your passwords are belong to us | Donjon
https://donjon.ledger.com/kaspersky-password-manager/


Kaspersky Password Manager's random password generator was about as random as your wall clock • The Register
https://www.theregister.com/2021/07/06/kaspersky_password_manager/


パスワードを生成するにはさまざまな方法がありますが、KPMはランダムに選ばれた文字や数字、記号を組み合わせてパスワードを生成します。

例えば10個の文字セットからGetRandom32という乱数生成メソッドで文字を出力する場合、以下のようなコードで書くことができます。

const string charset = "0123456789";
return charset[GetRandom32() % 10];


「GetRandom32()」で0から31までの数字をランダムで選び、10で割った余りをcharsetに返す流れとなっているので、このままだと0と1が返ってくる確率が少し高くなってしまいます。そのため、「GetRandom32()」で31と32が出た時を無視するように手を加える必要があります。オープンソースで開発されるパスワードマネージャーのKeePassにおけるパスワードのランダム生成では、これに近い方法が採用されているとのこと。
const string charset = "0123456789";
do {
    uGen = GetRandom32();
} while (uGen >= 30);
return charset[uGen];


このように、ランダム生成で重要なことは、「指定された範囲から文字を均一な確率で選出する」ということ。もし確率に偏りがあった場合、そのパスワードの安全性は必然的に低くなってしまいます。

Ledger Donjonは2019年に、KPMに搭載されているパスワード生成機能を調査しました。KPMのパスワード生成機能は大文字・小文字・数字・特殊文字から、デフォルトだと12文字のパスワードを作成するというもの。パスワードに使う文字セットはカスタマイズ可能で、パスワード生成機能のUIから設定できます。


Ledger Donjonの調査チームは「KPMに含まれるパスワードジェネレーターにはいくつかの問題があります。最も重大な問題は、『メルセンヌ・ツイスタ』と呼ばれる擬似乱数生成機(PRNG)を使用していたことです。そして、そのシード値にデバイスのシステム時刻を使っていました」と報告しました。

KPMのパスワード生成関数のコードが以下。seedがシステム時刻の下位32ビット(ft.dwLowDateTime)と上位32ビット(ft.dwHighDateTime)の和に定義されています

std::string pwlib::generatePassword(pwdlib::Policy policy, int seed)
{
    if (seed == 0) {
        FILETIME ft;

        GetSystemTimeAsFileTime(&ft);
        seed = ft.dwLowDateTime + ft.dwHighDateTime;
    }
    auto mtrand = std::bind(std::uniform_real_distribution<float>(0,1), mt19937(seed));
    return generateRandomPassword(policy, mtrand);
}


擬似乱数生成機はその名の通り、一見ランダムのように見えるものの、一定のアルゴリズムで数を算出します。そして、その初期状態として設定されるのがシード値であり、シード値が同じであれば、擬似乱数は必ず同じ数字が生成されます。


PCのシステム時刻を擬似乱数生成のシード値に使っていたということは、KPMで生成されるパスワードは、システム時刻が同一であれば同じパスワードを生成していたということになります。

また、KPMの画面ではパスワード生成時に、大量の文字列が流れるアニメーションが表示する演出が採用されていました。このアニメーションの再生時間が1秒以上なので、1秒以内にパスワード生成ボタンを押すことがなく、この問題の発覚が遅れたと調査チームは指摘しています。

2010年から2021年までを秒に換算すると、およそ3億1561万9200秒になります。つまり、2010年から2021年までにKPMで生成されたパスワードは3億1561万9200パターンしかないということになります。調査チームによれば、3億1561万9200パターンのパスワードに総当たり攻撃をしかける場合、たった数分で突破できてしまうとのこと。また、アカウントの作成時刻はある程度絞られることを考えると、秒単位で突破される可能性も高いといえます。


このKPMのパスワード生成に関する脆弱性について、調査チームは2019年6月にレポートと概念実証をカスペルスキーに送信。カスペルスキーはこの脆弱性に「CVE-2020-27020」という識別子を割り振り、2020年10月に修正パッチを配布しました。また、ユーザーへは修正パッチをインストールした後にパスワードを再生成するように勧告しています。なお、影響を受けるのはWindows版・iOS版・Android版で、以下のバージョン以前のものとなります。
・Kaspersky Password Manager for Windows 9.0.2 Patch F
・Kaspersky Password Manager for Android 9.2.14.872
・Kaspersky Password Manager for iOS 9.2.14.31

この記事のタイトルとURLをコピーする

・関連記事
コインやダイスとカップを使って暗号的に安全な乱数を作れる - GIGAZINE

「人間が完全にランダムな選択を行うことは可能なのか?」をアンケート結果から徹底検証 - GIGAZINE

放射性物質を用いて量子乱数を生成してしまう猛者が現れる - GIGAZINE

「1Password」や「LastPass」など9つの人気パスワードマネージャーに情報漏えいのリスクがあると報じられる - GIGAZINE

人気パスワード管理アプリ「LastPass」の無料版にスマホかPCのいずれかからしか使えないような制限が追加 - GIGAZINE

名作アクションゲーム「悪魔城伝説」のパスワードはどうやって生成されているのか? - GIGAZINE

in セキュリティ, Posted by log1i_yk

You can read the machine translated English article here.