Linux カーネルにおける DCCP プロトコルの IPV6 実装での use-after-free (解放済みメモリー使用) - CVE-2017-6074
更新
この情報は役に立ちましたか?
この情報は役に立ちましたか?
Red Hat セキュリティーレスポンスチームは、Linux カーネルの DCCP プロトコル IPV6 の実装に影響する脆弱性を認識しており、この脆弱性は CVE-2017-6074 で対応されています。この問題は 2017 年 2 月 20 日 に公開され、重要な影響 と評価されています。
DCCP は、プログラマーがアプリケーション層でネットワーク輻輳設定を制御できるようにするためのレイヤー4 (トランスポート層) プロトコルです。このプロトコルは IP をレイヤー 3 (ネットワーク層) プロトコルとして使用するため、インターネット全体でルーティング可能です。そのため、DCCP は IPV4 ベースのシステムと IPV6 ベースのシステムの両方で動作することを目的としています。この脆弱性は IPV6 ベースの DCCP 接続を明示的に使用して悪用されます。
DCCP は内部のステートマシンを使用して接続を把握します。このような状況で、ソケットが LISTEN 状態にある場合、DCCP のステートマシンが DCCP_PKT_REQUEST データ構造を誤って処理します。これにより、ネットワークに接続された同じノード上のクライアントとサーバーの両方を制御できるローカルユーザーによって「Use After Free」の状態が引き起こされる可能性があります。接続が確立されると、skbuff と呼ばれるデータ構造が接続ごとに作成されます。skbuff の最後には、skb_shared_info という別の struct があり、struct ubuf_info が含まれます。この struct には、skb がクリーンアップされるときに呼び出される関数ポインターが含まれます。skbuff のメモリーが解放された後に、この ubuf_info struct のコールバック関数が呼び出されるとエラー状態になります。この状態になると、攻撃者は悪意のある命令でメモリーを上書きし、解放時と 2 回目の不正使用時との間に関数ポインターの値を悪用することができます。
この攻撃を実行するには、サーバーとクライアントの両方が同じシステムで実行され、sk_shared_info struct への参照が解放後も可能である必要があります。
Red Hat は、この問題を報告し、支援してくださった Andrey Konovalov 氏に謝意を表します。
Red Hat セキュリティーレスポンスチームは、本件によるセキュリティー上の影響度を重要な影響と評価しています。
Red Hat 製品の次のバージョンに影響します。
攻撃の詳細と影響
この不具合では、ローカルシステムのアカウントを持つ攻撃者による特権昇格が可能になります。このような脆弱性は通常 UAF (Use After Free) と呼ばれ、以前に行われた free() 操作が原因で使用中の割り当てを参照しなくなったポインターを介してメモリーにアクセスするコードパスを実行して悪用されます。この問題では、DCCP ネットワーキングコードに不具合があり、十分なアクセス権限を持つ悪意のあるユーザーはそのコードにアクセスし、すべてのローカルインターフェース上で DCCP ネットワーク接続を開始できます。実際に悪用されると、ホストカーネルのクラッシュやホストカーネルのコンテキスト内のコードの実行、カーネルメモリー構造の変更によるその他の特権の昇格が生じる可能性があります。攻撃者はシステムのローカルアカウントにアクセスできなければなりません。これはリモート攻撃ではなく、IPV6 のサポートが有効である必要があります。
影響を受けるバージョンのカーネルを実行している Red Hat のすべてのお客様には、パッチのリリース直後にカーネルを更新することが強く推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。カーネルの更新を適用するには、システムを再起動する必要があります。
製品 | パッケージ | アドバイザリー |
---|---|---|
Red Hat Enterprise Linux 7 | kernel | RHSA-2017:0294 |
Red Hat Enterprise Linux 7 | kernel-rt | RHSA-2017:0295 |
Red Hat Enterprise Linux 7.2 Extended Update Support (EUS: 延長アップデートサポート)* | kernel | RHSA-2017:0501 |
Red Hat Enterprise Linux 7.1 Extended Update Support (EUS: 延長アップデートサポート)* | kernel | RHSA-2017:0403 |
Red Hat Enterprise Linux 6 | kernel | RHSA-2017:0293 |
Red Hat Enterprise Linux 6.7 Extended Update Support (EUS: 延長アップデートサポート)* | kernel | RHSA-2017:0316 |
Red Hat Enterprise Linux 6.6 Advanced Update Support** | kernel | RHSA-2017:0324 |
Red Hat Enterprise Linux 6.5 Advanced Update Support** | kernel | RHSA-2017:0366 |
Red Hat Enterprise Linux 6.4 Advanced Update Support** | kernel | RHSA-2017:0345 |
Red Hat Enterprise Linux 6.2 Advanced Update Support*** | kernel | RHSA-2017:0365 |
Red Hat Enterprise Linux 5 | kernel | RHSA-2017:0323 |
Red Hat Enterprise Linux 5.9 Advanced Update Support** | kernel | RHSA-2017:0346 |
Red Hat Enterprise Linux 5.6 Advanced Update Support** | kernel | RHSA-2017:0347 |
RHEL Atomic Host | kernel | リスピンの実行 (2017 年 2 月 22 日) |
Red Hat Enterprise MRG 2 | kernel-rt | 保留中 |
Red Hat Virtualization (RHEV-H/RHV-H) | kernel | 保留中 |
*このパッチを取得するには、有効な EUS サブスクリプションが必要です。
お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat 営業部門または営業の担当者にお問い合わせください。
Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?
**RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です。
アプリケーションが DCCP プロトコルの使用を試行する際に、DCCP カーネルモジュールが自動的にロードされます。このモジュールがロードされないようにするには、システム全体の modprobe ルールを使用します。以下のコマンドを root として実行すると、モジュールは意図的または非意図的にロードされなくなります。Red Hat セキュリティーレスポンスチームは、この方法を、特権ユーザーによる場合でも意図せずにモジュールがロードされないようにするための強固な方法であると判断しています。
# echo "install dccp /bin/true">> /etc/modprobe.d/disable-dccp.conf
DCCP モジュールがすでにロードされている場合は、システムを再起動する必要があります。ほとんどの場合、DCCP カーネルモジュールは、使用中であり、ネットワークインターフェースがアクティブな場合はアンロードできなくなります。
ヘルプが必要な場合は、ナレッジベースのアーティクル (https://access.redhat.com/solutions/41278) を参照するか、Red Hat グローバルサポートサービスにお問い合わせください。
また、最新の RHEL 6 および 7 システムのデフォルトターゲットの SELinux ポリシーはこの脆弱性を軽減します。詳細は CVE-2017-6074 の Bugzilla を参照してください。
Ansible Playbook を使用すると、脆弱性が 2 つのステップにより軽減されます。まずは、「偽装インストール」が実行されます。ブラックリストファイルが /etc/modprobe.d/disable-dccp.conf に作成されることで、脆弱性のある DCCP モジュールがロードされなくなります。次に、実行中のカーネルに DCCP モジュールがすでにロードされている場合、アンロードを試行します。(モジュールがカーネルで使用中であるために) アンロードできない場合は、「システムを再起動」します。ブラックリストファイルが所定の場所にあれば、このモジュールはロードされなくなります。修正済みのパッケージが利用可能な場合でこれをインストールした後に、必要に応じて /etc/modprobe.d/disable-dccp.conf のファイルを削除できます。
この Playbook は、HOSTS という名前の変数に対して実行され、次のように起動できます (「hostname」がインベントリーファイルに定義されていることが前提です)。
# ansible-playbook -e HOSTS=hostname mitigate-fixit.yml
この Playbook には root 権限が必要となるため、(インベントリーファイルの「hostname」の定義がない場合は)、--become を指定する必要がある場合があります。
Comments