CVE-2021-4034 検出と緩和: “Pwnkit”ローカル特権昇格の検出と緩和

By 清水 孝郎 - JANUARY 30, 2022

SHARE:

本文の内容は、2022年1月28日にJason Averyが投稿したブログ(https://sysdig.com/blog/detecting-mitigating-cve-2021-4034-sysdig/)を元に日本語に翻訳・再構成した内容となっております。

Qualysの新しいアドバイザリーによると、SUIDセットプログラム”pkexec”にローカル特権昇格のバグがあることが開示されています。この欠陥は、CVE-2021-4034のCVE IDに指定されており、脆弱性発見者の間では”pwnkit”という呼称で呼ばれています。CVSSv3ベーススコアは、10.0点満点中7.8点という高いスコアとなっています。

脆弱性のあるプログラムは、プロセスの権限を管理するPolkitの一部です。Polkitのpkexecは、非特権プロセスが特権プロセスと通信することを可能にし、また、”sudo”に似た特権昇格の正当かつ認可された使用方法を実現します。

この関数に引数が渡されない場合、メモリ破壊の欠陥があります。攻撃者は、環境変数を操作することで、”pkexec”を騙し、スーパーユーザー権限で任意のコードを読み込んで実行することができます。
2013年にあるブロガーがこのバグを偶然発見しましたが、パッチを当てるべき脆弱性として報告しませんでした。惜しかったですね。この欠陥は、2009年にプログラムが最初にリリースされてから約13年前に登場しました。つまり、現在世界中で使われているほぼすべてのLinuxやUnix系のインストールが影響を受けている可能性があります。

EIPを制御せずにメモリを搾取

この脆弱性は、攻撃者が命令ポインタ(x86アセンブリーではEIP)を制御することなく、メモリ破壊を利用できるという点で興味深いものです。通常、ヒープオーバーフローのようなメモリベースの攻撃では、命令ポインタが上書きされ、悪用されたプロセスがメモリ内の別の場所にあるシェルコードを実行するように指示されます。しかし、ここでは単純に環境変数で実行すべきプログラムがどこにあるかを”pkexec”に伝えることができます。

通常、プログラムは明示的な引数と暗黙的な環境変数の両方を読んで、自分が実行すべきタスクを知ります。’pkexec’ の場合、期待される引数は実行すべきプログラムです。要求されたユーザーがそのようなアクションを実行する権限があると判断した場合、そのプログラムを root として実行します。引数が与えられなかった場合は、単に使用法のヘルプメッセージを表示して終了します。しかし、’pkexec’ が引数を処理する方法のために、境界外の書き込みで環境変数を引数のメモリ空間に黙って入れてしまうこともあります。pkexec は、その空間で実行するプログラムを探しますが、何も見つからず、期待通りに終了します。

つまり、攻撃者がこれを利用するためには、’pkexec’が予期せずルートランドに渡すように、シェルコードの場所を環境変数に入れておく必要があるのです。

「安全でない」環境変数を渡すコツは、’pkexec’がエラーメッセージを表示する方法にあります。何も指していない SHELL 環境変数を渡すことで、エラー状態を引き起こすことができます。pkexec は GNOME GLib ライブラリに依存しており、様々なチャーセット (言語形式) でメッセージを正しくフォーマットします。

あなたはおそらく、ASCII または UTF-8 フォーマットでこれを読んでいることでしょう。アラビア語やヘブライ語のような言語の文字が含まれている文書を見たことがあれば、その文書はおそらく UTF-16 または UTF-32 フォーマットであると思われます。もっと詳しく知りたい方は、Wikipediaに詳しい説明があります。

Glib に知らない文字セットを使うように指示すると、Glib は環境変数 GCONV_PATH を探してフォーマットを行うライブラリを見つけようとします。通常、これはルートに渡される変数ではありませんが、この脆弱性の仕組みにより、GCONV_PATH変数はPATHのような別の変数に紛れ込ませることができ、スーパーユーザーの環境に再び追加されてしまいます。そのため、攻撃者はユーザーレベルのシェルを使って’pkexec’を実行し、エラーを発生させ、無効な文字セットを使用し、GCONV_PATHをライブラリ型シェルコードの場所に設定する必要があります。

一般に公開されているエクスプロイトから借りてきた、本質的に必要なものは以下の通りです:
Exploit cve-2021-4034 pwkit
コンパイルして実行すると、’pwnkit.so’を介して/bin/shシェルが実行されます。’whoami’コマンドにより、root権限を持っていることが確認できます。
CVE-2021-4034 exploit works

CVE-2021-4034の影響

この記事を書いている時点では、MitreNVD も CVSSv3 スコアを公式にアドバイザリで公表していません。CVSSv3.1計算機を使用して、公式のベーススコアを高深刻度の7.8と推定しています。推定ベースベクターコードは「CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H」です。
基本的に、この脆弱性はリモートでは悪用できませんが、他の手段でシステム上のユーザーシェルを取得した攻撃者は、これを利用して簡単かつ確実にroot権限を得ることができます。この脆弱性は非常に長い間存在していたため、基本的にPolkitを使用するすべてのUnix系システムに脆弱性があります。OpenBSD は例外で、 argc が空の場合には execve システムコールを許可しないという緩和策がすでに実施されており、セキュリティに重点を置いた OS でこの問題を悪用しようとする希望は打ち砕かれています。

CVE-2021-4034の緩和策

一時的な緩和策は、pkexec の機能を犠牲にする方法があります。SUID パーミッションを削除することで、このプログラムは root としてプロセスを実行できません。しかし、正常な動作のためにそれに依存しているプロセスは影響を受けます。SUID パーミッションは、次のように chmod で削除できます:

chmod 0755 /usr/bin/pkexec

ユーザーは、この問題を解決するために、各自のLinuxディストリビューションから最新のセキュリティパッチを適用することをお勧めします。

CNCFのインキュベーションプロジェクトであるFalcoは、クラウド・ネイティブ環境における異常な活動を検出するのに役立ちます。次のFalcoルールは、CVE-2021-4034の影響を受けているかどうかを検出するのに役立ちます。このルールは、公式のFalcoルールYAMLでも公開されています。

 

– rule: Polkit Local Privilege Escalation Vulnerability (CVE-2021-4034)
desc: “This rule detects an attempt to exploit a privilege escalation vulnerability in Polkit’s pkexec. By running specially crafted code, a local user can leverage this flaw to gain root privileges on a compromised system”
Condition:
spawned_process and user.uid != 0 and proc.name=pkexec and proc.args = ” and proc.env icontains ‘GCONV_PATH=’
Output:
“Detect Polkit pkexec Local Privilege Escalation Exploit (CVE-2021-4034) (user=%user.loginname uid=%user.loginuid command=%proc.cmdline args=%evt.args)”
priority: CRITICAL
tags: [process, mitre_privilege_escalation]

 

このルールは、エクスプロイトを実行しようとする試みを検出します。具体的には、生成されたユーザープロセスとしてpkexecに引数が渡されず、環境変数にGCONV_PATHがある状態を探します。これは一般的ではなく、悪意のない方法で引数なしの’pkexec’を使用しただけでは検出されないはずです。検出されたシステムコールをSysdigツールで見てみると、以下のようになります。

sysdig -r cve-2021-4034.scap -X proc.name=pkexec and evt.type=execve and proc.env contains 'PATH=GCONV_PATH='

Sysdig Falco runtime detection

まとめ

今回のCVEは、信頼できる古いソフトウェアであっても、必ずしも脆弱性がないわけではないことを示しています。まだ発見されていない脆弱性が影に潜み、発見されるのを待っていることがあります。また、小さなブロガーであっても、見過ごされてしまうような良い情報を見つけることがあります。

あなたがFalcoについてもっと知りたいと思ったら: