RHSB-2022-001 Polkit 権限の昇格 - (CVE-2021-4034)
更新
エグゼクティブサマリー
Red Hat は、認証されたユーザーが権限昇格攻撃を実行できる pkexec の脆弱性を認識しています。
polkit パッケージは、権限のないプロセスが Linux システムで特権プロセスと通信できるようにするポリシーを定義し、処理するように設計されています。polkit の一部である pkexec は、setuid 機能を使用して、polkit ポリシー定義に従って、別のユーザーとしてコマンドを実行できるツールです。pkexec に存在する脆弱性により、権限のない ローカルの攻撃者 は、権限を昇格 して、プロセスの引数ベクトルの誤った処理により、認証およびポリシーを回避することができます。
お客様にとっての主なリスクは、影響を受けるシステムで権限のないユーザーが管理者権限を取得できる点です。攻撃者が攻撃を行うには、ターゲットシステムへのログインアクセスが必要となります。
この問題には CVE-2021-4034 が割り当てられています。また、重要な影響 と評価されています。
以下の Red Hat 製品バージョンに影響があります。「影響を受ける」とは、製品のコードに脆弱性が存在することを意味します。製品に脆弱性がある場合に対処することができる使用方法や緩和策に関係なく、脆弱性が存在することを意味します。
Red Hat Enterprise Linux 6
Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 8
Red Hat Virtualization 4
さらに、Red Hat Enterprise Linux (RHEL CoreOS を含む) でサポートされるすべての Red Hat 製品が影響を受ける可能性もあります。これには、以下が含まれます。
RHEL をベースとし、polkit パッケージが同梱される製品コンテナー。これらのイメージは定期的に更新されます。Red Hat Container Catalog の一部である Container Health Index には、この不具合の修正が利用できるかどうかを示すコンテナーの健全性が表示されます。
RHEL チャンネルからパッケージを取得する製品 (Red Hat OpenShift Container Platform、Red Hat OpenStack Platform、Red Hat Virtualization などのレイヤー製品も含まれます)。これらの製品環境で、基礎となる RHEL polkit パッケージが最新であることを確認します。
現在ご使用のシステムにこの不具合による脆弱性が存在するかどうかを判断するには、以下の診断セクションを参照してください。さらに、自動修正の Ansible Playbook もご利用いただけます。
テクニカルサマリー
pkexec プログラムは、渡された引数の量を適切に検証しません。この問題により、最終的に、環境変数をコマンドとして実行しようとします。悪用に成功すると、pkexec は権限のあるユーザーとして任意のコードを実行し、攻撃者にローカル権限昇格を付与します。詳細は CVE-2021-4034 を参照してください。
軽減策
Red Hat Product Security (製品のセキュリティー) では、影響を受けるお客様は、更新が利用可能になり次第、polkit パッケージを更新することを強くお勧めいたします。すぐに更新できないお客様は、以下の手順を実行するとこの問題を軽減できます。
1.https://access.redhat.com/solutions/5441 の必要な systemtap パッケージと依存関係をインストールします。
2.polkit デバッグ情報をインストールします。
debuginfo-install polkit
3.以下の systemtap スクリプトを作成して、pkexec-block.stp という名前を指定します。
probe process("/usr/bin/pkexec").function("main")
{
if (cmdline_arg(1) == "")
raise(9);
}
4.systemtap モジュールを実行中のカーネルに読み込みます。
stap -g -F -m stap_pkexec_block pkexec-block.stp
5.モジュールが読み込まれていることを確認します。
lsmod | grep -i stap_pkexec_block
stap_pkexec_block 434176 0
6.polkit パッケージが修正を含むバージョンに更新されたら、以下を実行して systemtap が生成したカーネルモジュールを削除します。
rmmod stap_pkexec_block
rmmod コマンドを使用した後は、システムの再起動は必要ありません。
注記: システムが再起動すると、systemtap が生成したモジュールは、カーネルに再読み込みする必要があります。これを行うには、軽減策スクリプトが作成されたディレクトリーに移動し、手順 4 と 5 に従ってください。
上記の軽減策が実行されると、pkexec は適切なユースケースで引き続き期待どおりに機能します。
注記: この緩和策は Secure Boot が有効なシステムでは動作しません。 SystemTap では、外部のコンパイルサーバーに、カーネルのキーリングに登録されている鍵を使用して、生成されたカーネルモジュールを署名できる必要があります。
技術情報
新しいプロセスを開始すると、Linux カーネルはすべてのコマンド引数 (argv)、環境変数 (envp) を持つ別の配列、および引数の数 (argc) を表す整数値でアレイを作成します。Linux カーネルは、引数配列と環境変数配列の両方をメモリー上に連続して配置します。もう 1 のデフォルトの動作は、引数配列の最初の値に実行ファイル名が含まれる方法です (例:pkexec 実行ファイルなら pkexec)。これは、ユーザーがプロセスに送った引数がこの値の後に配置されることを意味しています。
pkexec は引数の数を検証しません。これは常に 1 以上で、2 番目の値が NULL か、または権限のあるユーザーとして pkexec により実行されるコマンドであることを前提としています。攻撃者が強制的に引数アレイが空になるようにした場合、pkexec は環境アレイのコンテンツを実行するアプリケーションとして解釈します。攻撃者は、これらの変数を操作して、特定の値とペイロードを含めることでこれを活用し、認証を要求せずに権限のあるユーザーとして実行することができます。
サービスへの影響
以下の Red Hat サービスは直接影響を受けます。
OpenShift Dedicated (OSD)
Azure RedHat OpenShift (ARO)
サービスへの影響は低です。また polkit を使用するため、ユーザーはグラフィカルまたは CLI を使用して認証し、認証エージェントとして機能する polkit を持つサービスを取得する必要があります。OSD では、グラフィカルの使用は無関係です。CLI の使用では、ユーザーは OC コマンドを使用して OSD クラスターに対して認証を行います。
また、OSD は実稼働クラスターで polkit を特別な使用しません。OSD では、テスト OSD クラスターのマスターのいずれかで、timedatex には polkit の依存関係があります。したがって、OSD/ARO の場合は、程度の影響となります。
影響を受ける製品の更新
影響のあるバージョンの Red Hat 製品をご使用のお客様は、エラータが入手可能になり次第、該当製品を更新することが強く推奨されます。
利用可能な更新を早急に適用し、適切であると思われる軽減策を有効にしてください。
製品 | コンポーネント | アドバイザリー/更新 [1] |
Red Hat Enterprise Linux 8 | polkit | |
Red Hat Enterprise Linux 8.4.0 Extended Update Support [2] | polkit | |
Red Hat Enterprise Linux 8.2.0 Extended Update Support [2] | polkit | |
Red Hat Enterprise Linux 8.1.0 Update Services for SAP Solutions, Advanced Update Support [3],[4] | polkit | |
Red Hat Enterprise Linux 7 | polkit | |
Red Hat Enterprise Linux 7.7 Update Services for SAP Solutions, Advanced Update Support [3],[4] | polkit | |
Red Hat Enterprise Linux 7.6 Update Services for SAP Solutions, Advanced Update Support [3],[4] | polkit | |
Red Hat Enterprise Linux 7.4 Advanced Update Support [4] | polkit | |
Red Hat Enterprise Linux 7.3 Advanced Update Support [4] | polkit | |
Red Hat Enterprise Linux 6 Extended Life-cycle Support [5] | polkit | |
Red Hat Virtualization 4 for Red Hat Enterprise Linux 8 | polkit | RHSA-yyyy:xxxx |
Red Hat Virtualization 4 for Red Hat Enterprise Linux 7 | polkit | RHSA-yyyy:xxxx |
[1] 更新が公開されると、アドバイザリー/更新リンクが追加されます。
[2] Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?
[3] Advanced mission critical Update Support (AUS) とは何ですか?
[4] Red Hat Enterprise Linux for SAP Solutions サブスクリプションの概要
[5] このパッチを取得するには、有効な 延長ライフサイクルサポート (ELS) サブスクリプションが必要です。 お持ちのアカウントに有効な ELS サブスクリプションがない場合は、Red Hat の営業部門または営業担当者に お問い合わせ ください。
診断
以下の脆弱性検出スクリプトを使用すると、現在ご使用のシステムにこの不具合による脆弱性が存在するかどうかを判断できます。正規のスクリプトであることを確認する場合は、OpenPGP 分離署名 もダウンロードします。検証にGPG 署名を使用する方法 と手順は、カスタマーポータルで確認できます。
Ansible Playbook
また、上記の軽減策を自動化する Ansible Playbook も使用できます。この Playbook は systemtap を使用するために必要なパッケージをインストールし、systemtap スクリプトを作成してインストールして、引数なしで pkexec コマンドが使用されないようにします。この軽減策は再起動後に再適用する必要があります。これは、Playbook を再実行することで実現できます。
Playbook を使用するには、軽減策が適用されるホストの Ansible インベントリー名で追加変数 HOSTS を定義します。たとえば、以下のようになります。
ansible-playbook -e HOSTS=web,ns1,mail CVE-2021-4034_stap_mitigate.yml
正規の Playbook であることを確認するには、OpenPGP 分離署名 をダウンロードできます。検証にGPG 署名を使用する方法 と手順は、カスタマーポータルで確認できます。
よくある質問
Q: 修正の適用後、システムが脆弱でないことを確認するにために、サービスまたはシステムを再起動する必要がありますか。
A: サービスを再起動したり、システムを再起動する必要はありません。この修正は、polkit スイートのツールである pkexec に適用されます。これは単一のインスタンスが実行され、更新が適用されると、次に pkexec が実行されたときに、パッチが適用されたアプリケーションが読み込まれます。更新が適用されると、更新プロセスは polkit サービスを再起動します。
Q: 推奨される軽減策を適用した後、システムまたはサービスを再起動する必要がありますか。
A: 軽減策の適用後にシステムを再起動する必要はありません。Systemtap 自体が、カーネルモジュールが読み込まれていることを確認します。
質問: 軽減策として pkexec バイナリーから setuid パーミッションを安全に削除できますか?
回答: Red Hat では、setuid ビットを削除するとシステムの破損を引き起こすので推奨していません。pkexec バイナリーから setuid パーミッションを削除すると、正当なユースケースで適切に機能しなくなります。つまり、pkexec の実行に依存するアプリケーションがすべて機能を停止し、予期しないシステムエラーや動作を引き起こす可能性があります。この脆弱性の Qualys アドバイザリーでは、軽減案として setuid の削除が記載されていますが、これはシステムの破損を引き起こすことなく実行可能な軽減策ではないと判断されています。Red Hat は、別の軽減策を提示しており、この軽減策を適用しても pkexec の機能に悪影響を与えることはありません。軽減策の使用は、リリースされたパッチが適用されるまで短期間のみのみとしてください。
質問: OpenShift Container Platform にはどのような影響がありますか?
回答: OpenShift Container Platform (OCP) では、polkit パッケージは RHCOS に同梱されており、クラスターノードで使用されます。OCP ノードへのアクセスはクラスター管理者のみに制限されます。誰かが OCP ノードに直接接続でき、すでに root ユーザーである場合には、脆弱性のある polkit パッケージが存在しても、何も変化はありません。
polkit パッケージは、クラスター管理者が OCP クラスター管理に使用する、複数の OCP コンテナーイメージにも同梱されています。これらのイメージは特権付きコンテナーとして実行されるので、これらのコンテナーにアクセスできるユーザーにはすべて、完全な管理者アクセスが割り当てられることになります。
質問: Docker で Red Hat Enterprise Linux 7.x を実行しています。再起動後、ネットワーク上でコンテナーにアクセスすることができません。どうすればよいでしょうか?
回答: Docker が起動すると、net.ipv4.ip_forward を 1 に設定して IP 転送を許可します。IP 転送は、ネットワーク経由でコンテナーにアクセス可能にするために必要です。ただし、マシン設定では永続化されません。polkit パッケージを更新する際に、polkit サービスは Red Hat Enterprise Linux サーバーで自動的に再起動され、システムのトリガーを終了してカーネル設定を再読み込みします。これが原因で、永続化されない sysctl エントリーが上書きされ、Docker コンテナーがネットワーク経由でアクセスできなくなります。そのような動作を回避するには、システム管理者は net.ipv4.ip_forward で必要な値が sysctl 設定ファイルに永続化されていることを確認する必要があります。この手順の詳細は、How to set sysctl variables on Red Hat Enterprise Linux を参照してください。
謝辞
Red Hat は、この脆弱性を報告していただいた Qualys Research Team に感謝いたします。
参考資料
https://access.redhat.com/security/cve/CVE-2021-4034
Comments