
CVE-2023-32784用のオリジナルPoC
この脆弱性は CVE-2023-32784 に割り当てられ、KeePass 2.54 で修正されました。Dominik Reichl 氏の迅速な対応と創造的な修正に改めて感謝します!
明確化: パスワードはキーボードから入力される必要があり、クリップボードからコピーされたものは対象外です(「しくみ」のセクションを参照)。
まず、KeePass 2.54 以降に更新してください。
次に、KeePass を長期間使用している場合、マスターパスワード(および場合によっては他のパスワード)がページファイル/スワップファイル、ハイバネーションファイル、クラッシュダンプに含まれている可能性があります。あなたのパラノイア度合いに応じて、以下の手順で問題を解決することを検討できます:
C:\Windows\memory.dmp、他にもあるかもしれません)/w オプションで使用)または、HDD を上書きして OS をクリーンインストールするだけでも構いません。
影響を受けない製品の不完全なリスト(追加する場合はプルリクエストまたはイシューを作成してください)。経験則として、.NET で書かれたオリジナルの KeePass 2.X アプリでなければ、影響を受けない可能性が高いです。
KeePass Master Password Dumper は、KeePass のメモリからマスターパスワードをダンプするためのシンプルな概念実証ツールです。最初のパスワード文字を除いて、ほぼパスワードを平文で復元できます。対象システムでのコード実行は不要で、メモリダンプだけで済みます。メモリの取得元は問いません - プロセスのダンプ、スワップファイル(pagefile.sys)、ハイバネーションファイル(hiberfil.sys)、さまざまなクラッシュダンプ、システム全体の RAM ダンプのいずれでも構いません。ワークスペースがロックされているかどうかも関係ありません。KeePass が実行されていない状態になった後でも、RAM からパスワードをダンプすることは可能ですが、成功する可能性は経過時間とともに低下します。
Windows(英語版)の KeePass 2.53.1 と Debian(keepass2 パッケージ)の KeePass 2.47 でテスト済みです。macOS 版でも動作するはずです。残念ながら、Enter master key on secure desktop オプションを有効にしても攻撃の防止には役立ちません。PoC は古いバージョンの KeePass で作成されたデータベースで問題が発生する可能性がありますが、私はそれを再現できませんでした(issue #4 を参照)。
この発見は、KeePass の作者である Dominik Reichl 氏によってここで確認されました。Dominik 氏の迅速な対応に感謝します。すぐに修正されることを願っています!
git clone https://github.com/vdohney/keepass-password-dumper または GitHub からダウンロードcd keepass-password-dumperdotnet run PATH_TO_DUMPWindows でこれをテストする最も簡単な方法は、タスクマネージャーで KeePass プロセスを右クリックし、「Create dump file」を選択してプロセスダンプを作成することです。

dotnet run PATH_TO_DUMP PATH_TO_PWDLIST を追加して、2 文字目以降のすべての可能なパスワードのリストを生成することもできます。あなたの脅威モデルによります。あなたのコンピュータが、あなたのユーザー権限でバックグラウンドで実行されているマルウェアにすでに感染している場合、この発見によって状況が大幅に悪化することはありません。 ただし、KeeTheft や KeeFarce とは異なり、プロセスインジェクションやその他のコード実行が必要ないため、マルウェアがステルス性を高め、アンチウイルスを回避しやすくなる可能性はあります。
誰かがあなたのコンピュータにアクセスしてフォレンジック分析を行う可能性が合理的に疑われる場合、これは問題になる可能性があります。最悪の場合、KeePass がロックされているか、まったく実行されていないにもかかわらず、マスターパスワードが復元されます。
強力なパスワードでフルディスク暗号化を使用し、システムがクリーンであれば、問題はないはずです。この発見だけでは、インターネット経由でリモートからパスワードを盗むことは誰にもできません。
KeePass 2.X は、パスワード入力用に独自開発されたテキストボックス SecureTextBoxEx を使用しています。このテキストボックスはマスターパスワードの入力だけでなく、KeePass 内のパスワード編集ボックスなど他の場所でも使用されています(そのため、この攻撃はそれらの内容の復元にも使用できます)。
ここで悪用される欠陥は、入力されたすべての文字について、メモリ内に残存文字列が作成されることです。.NET の仕組み上、一度作成されるとそれを取り除くことはほぼ不可能です。たとえば、"Password" と入力すると、次のような残存文字列が生成されます: •a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d。POC アプリケーションはダンプ内でこれらのパターンを検索し、パスワードの各位置の可能性のある文字を提示します。
この攻撃の信頼性は、パスワードの入力方法や、1 セッションあたりに入力されたパスワードの数に影響される可能性があります。しかし、1 セッション内に複数のパスワードやタイプミスがあったとしても、.NET CLR がこれらの文字列を割り当てる方法により、メモリ内で整然と並ぶ可能性が高いことを発見しました。つまり、3 つの異なるパスワードが入力された場合、各文字位置について 3 つの候補がその順序で得られる可能性が高く、3 つすべてのパスワードを復元することができます。
これは簡易的な POC のため、おそらくあまり信頼性や堅牢性は高くありません。問題を見つけて修正した場合は、プルリクエストを作成してください。
許可されるパスワード文字は現在、次のようにハードコードされています: ^[\x20-\x7E]+$(すべての印刷可能な ASCII 文字とスペース)。
パスワードリストを自動生成する機能を追加してくれた adridlug と、コードをリファクタリングしてくれた ynuwenhof に感謝します。
まだどれも確認していません。