KeePass CVE-2023-32784:プロセスメモリーダンプの検知

By 清水 孝郎 - JUNE 13, 2023

SHARE:

本文の内容は、2023年6月13日にMIGUEL HERNÁNDEZが投稿したブログ(https://sysdig.com/blog/keepass-cve-2023-32784-detection/)を元に日本語に翻訳・再構成した内容となっております。

5月に、KeePassに影響を与える新しい脆弱性CVE-2023-32784が発見されました。KeePassは、Windows、Mac、またはLinux上で動作する人気のオープンソースパスワードマネージャーです。この脆弱性により、実行中のプロセスのメモリからマスターキーを平文で抽出することができます。マスターキーにより、攻撃者は保存されているすべての認証情報にアクセスすることができるようになります。

脆弱性を修正するために、KeePass 2.54にアップデートすることを強くお勧めします。

この記事では、新しい脆弱性CVE-2023-32784について、その仕組みと、攻撃者がシステムにフルアクセスし、認証情報を盗むための高度なテクニックを実行する場合に、このタイプの攻撃を検出する方法について説明します。

メモリーLinuxにおけるクレデンシャル

Linux でクレデンシャルについて語るとき、私たちは通常  /etc/shadow  ファイルを思い浮かべますが、パスワードが保存される場所はそれだけではありません。多くのプロセスもメモリ上に認証情報を保存しており、悪意のあるツールはこれを取り出そうとします。例えば、以下に説明する proc ディレクトリは、この種の攻撃の一般的なベクトルです。

Linux Kernel Docより:
“ディレクトリ /proc には、(中略)システム上で実行されている各プロセスに対して1つのサブディレクトリが含まれており、プロセスID(PID)にちなんで命名されています。”

MITREは、敵対者がOS Credential Dumpingとしてprocファイルシステムからクレデンシャルを収集する可能性があると定義しています: Proc Filesystem T1003.007としています。

KeePass CVE-2023-32784とは?

CVE-2023-32784は、メモリダンプから平文のマスターパスワードの復元を可能にします。メモリダンプはKeePassのプロセスダンプ、スワップファイル(pagefile.sys)、ハイバネーションファイル(hiberfil.sys)、またはシステム全体のRAMダンプのいずれかにすることができます。

KeePass 2.Xでは、パスワード入力にカスタム開発されたテキストボックス、SecureTextBoxExを使用しています。このCVEで悪用される欠陥は、文字が入力されるたびに、メモリ上に残置文字列が作成されることです。.NETの仕組み上、一度作成されたものを取り除くことはほぼ不可能です。例えば、”Password “を入力すると、以下のような残置文字列が作成されます:•a, ••s, •••s, ••••w, •••••o, ••••••r, •••••••d。 1文字目は復元できません。

シナリオを再現するために、18.04.1-UbuntuにKeePass 2.38 version for Linuxを使用しています。概念実証(PoC)は、元のPoCの一部でもあるこのGithubリポジトリに基づきます。


私たちが使用するPoCは、以下の手順でKeePassの秘密鍵を抽出します:

  • まず、すべての /proc/<pid>/cmdline ファイルをスキャンし、KeePassというキーワードが含まれるもののpidを保存します。
  • 次に、 /proc/<pid>/maps にあるメモリマップのうち、ライブラリに直接関連しないもののアドレスを取得します。
  • 最後に、 /proc/<pid>/mem を利用して、これらすべてのマップのメモリをバッファに格納します。そのメモリを解析して、ユーザがマスターパスワードを入力したときに残った文字列、つまり •a, ••s, •••s, のような文字列を順番に見つけます。
Keepass CVE-2023-32784


上の画像でわかるように、マスターキーは最初の文字がない状態で公開されています。

KeePass CVE-2023-32784を検出する方法

この種の攻撃を検出するには、未知のプロセスによる /proc フォルダへのアクセスを監視できるようにする必要があります。これによりアラートが発生し、さらに調査することができます。

CNCFのオープンソースプロジェクトであるFalcoでこれを検出しようとすると、クラウドネイティブ環境における異常な活動のアラートを送信することでリアルタイムに検出することができます。このシナリオでは、/procファイルから環境変数を読み取るルールを調整するか、新しいものを作成する必要があります。

このルールを正しくトリガーするには、PoCでKeePassマスターパスワードを取得するために使用される/proc/<pid>/cmdline/proc/<pid>/maps, または /proc/<pid>/memの読み取りをキャッチする条件を変更する必要があります。

- rule: Dump memory detection
  desc: An attempt to read process environment variables from /proc files
  condition: >
    open_read and container and (fd.name glob "/proc/*/mem" or fd.name glob "/proc/*/maps")
  output: >
    Detected process memory dump to search for credentials (proc.name=%proc.name proc.pname=%proc.pname fd.name=%fd.name container=%container.info evt.type=%evt.type evt.arg.request=%evt.arg.request proc.pid=%proc.pid proc.cwd=%proc.cwd proc.ppid=%proc.ppid proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline)Code language: JavaScript (javascript)


この新しいルールにより、CVE-2023-32784の悪用を検出することができます。

Keepass CVE-2023-32784


このアラートには、脅威の調査を継続するために必要なすべての情報が含まれています。

10:47:47.232147057: Warning Detected process memory dump to search for credentials (proc.name=dump proc.pname=sudo fd.name=/proc/2859/mem container=host (id=host) evt.type=openat evt.arg.request=<NA> proc.pid=2916 proc.cwd=/home/kpdemo/CVE-2023-32784-keepass-linux/ proc.ppid=2915 proc.cmdline=dump proc.pcmdline=sudo ./dump gparent=bash ggparent=gnome-terminal- gggparent=systemd proc.sid=2802 proc.exepath=/home/kpdemo/CVE-2023-32784-keepass-linux/dump user.uid=0 user.loginuid=1000 user.loginname=kpdemo user.name=root group.gid=0 group.name=root container.id=host container.name=host image=<NA>)Code language: HTML, XML (xml)


エクスプロイトで述べたように、攻撃者があなたのマシン内で十分な権限と能力を持っている場合、攻撃者はあらゆる悪意のある行動を取ることができるかもしれません。しかし、このルールは、私たちの認証情報が侵害されたかどうかの指標となり、それに応じて行動することができます。

プロセスメモリをダンプするその他のツール

この種の技術についてもう少し調べてみると、同様の動作を行うツールが他にもあることがわかります。ここでは、そのうちのいくつかを紹介し、同じ方法で検出する方法を説明します。

Mimipenguin

Mimipenguin 2.0は、現在のLinuxデスクトップ・ユーザーからログイン・パスワードをダンプするためのツールです。これは、一般的なWindowsの認証情報窃盗ツールmimikatzの背後にあるアイデアから派生したものです。

Keepass CVE-2023-32784


このツールは、KeePassのPoCと同様のことを試みますが、この場合、キーは見つかりません(CVEが実装されていないため)。しかし、システムの認証情報を取得することは可能です。上の画像では、両方のアラートを見ることができます。最初のものは、 /proc/<pid>/mem へのアクセスを検出したものです。

10:56:59.508184318: Warning Detected process memory dump to search for credentials (proc.name=python proc.pname=sudo fd.name=/proc/1114/mem container=host (id=host) evt.type=openat evt.arg.request=<NA> proc.pid=7194 proc.cwd=/home/kpdemo/mimipenguin/ proc.ppid=7193 proc.cmdline=python mimipenguin.py proc.pcmdline=sudo python mimipenguin.py gparent=bash ggparent=gnome-terminal- gggparent=systemd proc.sid=2802 proc.exepath=/usr/bin/python user.uid=0 user.loginuid=1000 user.loginname=kpdemo user.name=root group.gid=0 group.name=root container.id=host container.name=host image=<NA>) Code language: HTML, XML (xml)


2つ目は、 /etc/shadow へのアクセス権を獲得し、そこからユーザーのパスワードを抽出するところです。

10:57:52.447428441: Warning Sensitive file opened for reading by non-trusted program (user=root user_loginuid=1000 program=python command=python mimipenguin.py pid=7194 file=/etc/shadow parent=sudo gparent=bash ggparent=gnome-terminal- gggparent=systemd container_id=host image=<NA>)Code language: JavaScript (javascript)


LaZagne

LaZagneプロジェクトは、ローカルコンピュータに保存された多くのパスワードを取得するために使用されるオープンソースアプリケーションです。この場合、メモリに注目するだけでなく、さまざまな手法(プレーンテキスト、API、カスタムアルゴリズム、データベースなど)を使って認証情報を検索します。

Keepass CVE-2023-32784


この例では、再びアクセスを検出するアラートが表示され、ツールはユーザーのパスワードと保存していたKeePassデータベースの両方を発見したことを示しています。

11:14:02.074516511: Warning Detected process memory dump to search for credentials (proc.name=python proc.pname=sudo fd.name=/proc/1114/maps container=host (id=host) evt.type=openat evt.arg.request=<NA> proc.pid=7253 proc.cwd=/home/kpdemo/LaZagne/Linux/ proc.ppid=7252 proc.cmdline=python laZagne.py all proc.pcmdline=sudo python laZagne.py all gparent=bash ggparent=gnome-terminal- gggparent=systemd proc.sid=2802 proc.exepath=/usr/bin/python user.uid=0 user.loginuid=1000 user.loginname=kpdemo user.name=root group.gid=0 group.name=root container.id=host container.name=host image=<NA>)Code language: HTML, XML (xml)


学んだ教訓

認証情報の取得は、攻撃者が使用する非常に一般的な手法です。このようなタイプのアクションが横方向に移り、他のサービスに影響を与えるのを防ぐために、検出するために必要なすべてのツールを持つことが要求されます。

Falco は、アクセスを監視し、悪意のある行動を検出することを可能にするセキュリティの最終層を提供します。

最後に、新バージョンであるKeePass 2.54へのアップグレードを強くお勧めします。