Qualys は、ディストリビューションで使用される Polkit (旧称 PolicyKit) システム コンポーネントの脆弱性 (CVE-2021-4034) を特定しました。これにより、特権のないユーザが昇格されたアクセス権を必要とするアクションを実行できるようになります。 この脆弱性により、権限のないローカル ユーザーが権限を root に昇格し、システムを完全に制御できるようになります。 この問題はコードネーム PwnKit と呼ばれ、ほとんどの Linux ディストリビューションのデフォルト構成で実行される有効なエクスプロイトを生成することで注目に値します。
この問題は、PolKit の pkexec ユーティリティに存在します。このユーティリティは SUID ルート フラグを備えており、指定された PolKit ルールに従って別のユーザーの権限でコマンドを実行するように設計されています。 pkexec に渡されるコマンド ライン引数の処理が正しくないため、アクセス ルールの設定に関係なく、権限のないユーザーが認証をバイパスし、root としてコードを実行する可能性があります。 攻撃の場合、PolKit でどのような設定や制限が指定されているかは関係ありません。pkexec ユーティリティを使用して実行可能ファイルに SUID ルート属性が設定されていれば十分です。
Pkexec は、プロセスの開始時に渡されるコマンド ライン引数カウント (argc) の有効性をチェックしません。 pkexec の開発者は、argv 配列の最初のエントリには常にプロセス名 (pkexec) が含まれ、1 番目のエントリには NULL 値または pkexec 経由で起動されたコマンドの名前が含まれると想定していました。 引数の数は配列の実際の内容に対してチェックされず、常に 0 より大きいと想定されていたため、プロセスに空の argv 配列が渡された場合、Linux execve 関数で許可されているように、pkexec は NULL を最初の引数として扱います (プロセス名) と次のプロセスはバッファ メモリの外にあり、配列の後続の内容と同様です。 |————+————+——+————|————+————+——+————| | 引数[1] | 引数[0] | ... | argv[argc] | 環境[1] | 環境[XNUMX] | ... | envp[envc] | |—-|—-+—-|—-+—+——|—|—-|—-+—-|—-+——+—|—| VVVVVV "プログラム" "-オプション" NULL "値" "PATH=名前" NULL
問題は、argv 配列の後に、環境変数を含む envp 配列がメモリ内に存在することです。 したがって、argv 配列が空の場合、pkexec は、環境変数 (argv[1] は envp[0] と同一になりました) を含む配列の最初の要素から、昇格された特権で実行されたコマンドに関するデータを抽出します。その内容は制御できます。攻撃者によって。
argv[1] の値を受け取ると、pkexec は PATH 内のファイル パスを考慮して実行可能ファイルへのフル パスを決定し、そのフル パスを含む文字列へのポインタを argv[1] に書き込みます。 argv[1] は envp[0] と同一であるため、最初の環境変数の値が上書きされます。 最初の環境変数の名前を操作することで、攻撃者は pkexec 内の別の環境変数を置き換えることができます。たとえば、suid プログラムでは許可されていない「LD_PRELOAD」環境変数を置き換え、共有ライブラリがプロセス。
この悪用には、GCONV_PATH 変数の置換が含まれます。この変数は、シンボル トランスコーディング ライブラリへのパスを決定するために使用されます。この変数は、g_printerr() 関数の呼び出し時に動的にロードされます。そのコードでは iconv_open() が使用されます。 GCONV_PATH のパスを再定義することで、攻撃者はロードされるのが標準の iconv ライブラリではなく、pkexec がまだ実行されている段階でエラー メッセージが表示されるときに実行される独自のライブラリであることを確認できます。 root 権限と起動前の権限がチェックされます。
この問題はメモリ破損によって引き起こされるという事実にもかかわらず、使用されているハードウェア アーキテクチャに関係なく、確実かつ繰り返し悪用される可能性があることに注意してください。 準備されたエクスプロイトは、Ubuntu、Debian、Fedora、CentOS で正常にテストされていますが、他のディストリビューションでも使用できます。 元のエクスプロイトはまだ公開されていないため、軽微で他の研究者が簡単に再現できるため、マルチユーザー システムではパッチ アップデートをできるだけ早くインストールすることが重要です。 Polkit は BSD システムと Solaris でも利用できますが、それらでの使用については研究されていません。 既知のことは、OpenBSD カーネルでは execve() の呼び出し時に null argc 値を渡すことを許可していないため、この攻撃は OpenBSD では実行できないということです。
この問題は、pkexec コマンドが追加された 2009 年 6 月から存在しています。 PolKit 脆弱性の修正は現在パッチとして提供されています (パッチリリースはリリースされていません) が、ディストリビューション開発者には事前にこの問題が通知されていたため、ほとんどのディストリビューションは脆弱性に関する情報の公開と同時にアップデートを公開しました。 この問題は、RHEL 7/8/0755、Debian、Ubuntu、openSUSE、SUSE、Fedora、ALT Linux、ROSA、Gentoo、Void Linux、Arch Linux、および Manjaro で修正されています。 脆弱性をブロックするための一時的な手段として、/usr/bin/pkexec プログラムから SUID ルート フラグを削除できます (「chmod XNUMX /usr/bin/pkexec」)。
出所: オープンネット.ru