Blueborne - Bluetooth サブシステムにおける Linux カーネルのリモート DoS (サービス拒否) 攻撃 - CVE-2017-1000251

Public Date: September 13, 2017, 09:59
更新 September 13, 2017, 09:59 - Chinese, Simplified 英語
Resolved 状態
Important Impact
Red Hat セキュリティーレスポンスチームは、Linux カーネルの Bluetooth Host L2CAP プロトコル の実装に影響する脆弱性を認識しています。 この脆弱性には CVE-2017-1000251 が割り当てられました。この問題は  2017 年 9 月 12 日 に公開され、重要な影響として評価されています

背景情報

L2CAP (Logical Link Control and Adaptation Layer Protocol) は BlueBluetooth スタックのデータリンク層で動作し、接続の多重化、セグメント化、および Bluetooth などの上位層プロトコルのパケット再構築などのサービスを提供します。これにより、高レベルプロトコルによるクライアントへの L2CAP データパケットの送受信が行われます。

Linux カーネルの Bluetooth サブシステムがクライアントから受信した保留中の設定パケットを処理する方法で、スタックバッファーオーバーフローの問題が発見されました。その結果、クライアントはスタックバッファーオブジェクトに格納された任意の L2CAP 設定パラメーターを送信できます。これらのパラメーターは、バッファー長を超えて、隣接したカーネルスタックの内容を上書きすることができます。これは、認証前の Bluetooth 接続の確立時に発生します。カーネルスタック保護機能 (CONFIG_CC_STACKPROTECTOR=y) が無効になっている場合、Bluetooth でシステムに接続できる非認証ユーザーはこの不具合を悪用してシステムをクラッシュしたり、システムで任意のコードを実行することが可能です。

謝辞

Red Hat は、この問題の報告について Armis Labs に謝意を表します。

影響を受ける製品

Red Hat セキュリティーレスポンスチームは、本件によるセキュリティー上の影響度を「重要な影響」として評価しています

以下の Red Hat 製品バージョンが影響を受けます。
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise MRG 2
PPC64 アーキテクチャー上の Red Hat Enterprise Linux 7 は、スタックの保護なしで構築されるため、リモートでコードが実行される可能性のある脆弱性としてこの問題の影響を受けることに注意してください。カーネルスタックの保護はリモートでのコード実行のリスクを軽減します。そのため、保護されない状態で Bluetooth サービスが実行され、モジュールがロードされた場合、非認証の攻撃者が Red Hat Enterprise Linux 7 の PPC64 サーバーにてリモートでコードを実行することが可能です。PPC64 上の Red Hat Enterprise Linux 7 はワークステーション向けには提供されないため、Bluetooth ハードウェアを使用し、bluez パッケージがインストールされているサーバーが対象となります。デフォルトのサーバーインストールでは、bluez パッケージはインストールされないため、bluetooth.service ユニットファイル (および bluetoothd) は存在しません。

影響を受けない製品

攻撃が成功するには、脆弱性が存在する Bluetooth カーネルモジュールがロードされ、Bluetoothd サービスが実行されている必要があります。

以下の Red Hat 製品バージョンは影響を受けません。
  • RHEL Atomic Host には脆弱性が存在する Bluetooth モジュールが同梱されますが、bluetoothd サービスは同梱されないため影響を受けません。
  • s390x 上の Red Hat Enterprise Linux 7 は脆弱性が存在する Bluetooth モジュールを構築しないため、影響を受けません。
  • Red Hat Enterprise Linux 5 は、不具合が存在しないカーネル内で古いバージョンの Bluetooth サブシステムを使用するため、影響を受けません。
Red Hat Linux コンテナーは、このような Bluetooth モジュールの不具合など、カーネルの問題の影響を直接受けませんが、Red Hat は最新バージョンのコンテナーイメージを使用することを推奨します。Red Hat Container Catalog の一部である Container Health Index を使用すると、常にコンテナーのセキュリティー状態を確認できます。

攻撃の詳細と影響

Linux カーネルの Bloetooth サブシステムがクライアントから受信した保留中の L2CAP 設定応答を処理する方法で、スタックバッファーオーバーフローの不具合が発見されました。カーネルでスタック保護機能が有効になっているシステム (CONFIG_CC_STACKPROTECTOR=y、s390x および ppc64[le] 以外のすべてのアーキテクチャーで有効になっている) では、Bluetooth を使用してシステムに接続できる非認証の攻撃者はこの不具合を悪用してシステムをクラッシュできる可能性があります。スタック保護機能の性質により、コード実行の可能性は完全に排除できませんが、可能性は低いと考えられます。スタック保護機能のないシステム (ppc64[le]: Bluetooth モジュールは s390x では構築されません) では、Bluetooth を使用してシステムに接続できる非認証の攻撃者はこの不具合を悪用し、ring 0 (kernel) 権限を使用してシステム上でリモートで任意のコードを実行できる可能性があります。このような不具合は一般的にバッファーオーバーフローと呼ばれます。通常、この不具合を発生させるには、割り当てられたバッファー領域を超えた任意コードを作成し、他の手段 (関数の戻りポインターの誤作動など) でそのコードを実行します。攻撃者は脆弱性のあるシステムの近辺にいないと Bluetooth プロトコルでそのシステムに接続することはできません。

脆弱性の診断

Bluetooth ハードウェアがシステムに存在し、Bluetooth サービスが有効で使用できる状態である場合、この脆弱性の影響を受けます。具体的に説明すると、bluetooth.ko カーネルモジュールコード内にこの不具合が存在するため、このモジュールがロードされた場合にシステムの脆弱性が発生します。

システムの脆弱性を判断する

以下の診断スクリプトを使用して、現在ご使用のシステムにこの不具合による脆弱性が存在するかどうかを判断します。正規のスクリプトであることを確認する場合は 分離されている GPG 署名 もダウンロードします。このスクリプトの現在のバージョンは 1.0 です。


対処方法

影響を受けるバージョンのカーネルを実行するお客様は、パッチのリリース直後にカーネルを更新することが強く推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。カーネルの更新を適用するには、システムを再起動する必要があります。

影響を受ける製品の更新

Red Hat Enterprise Linux 7.2 以降を実行しているお客様は、kpatch を利用できます。kpatch を利用する場合は、サポートケースを作成してください。

kpatch の詳細については、 RHEL 7 はライブカーネルパッチ (kpatch) をサポートしていますか? を参照してください。

製品パッケージアドバイザリー
Red Hat Enterprise Linux 7kernelRHSA-2017:2679
Red Hat Enterprise Linux 7kernel-rt保留
Red Hat Enterprise Linux 7.3 Extended Update Support (EUS)*kernelRHSA-2017:2680
Red Hat Enterprise Linux 7.2 Extended Update Support (EUS)*kernel保留
Red Hat Enterprise Linux 6
kernelRHSA-2017:2681
Red Hat Enterprise Linux 6.7 Extended Update Support (EUS)*kernelRHSA-2017:2682
Red Hat Enterprise Linux 6.6 Advanced Update Support (AUS)**kernel保留
Red Hat Enterprise Linux 6.5 Advanced Update Support (AUS)**kernel保留
Red Hat Enterprise Linux 6.4 Advanced Update Support (AUS)**kernelRHSA-2017:2683
Red Hat Enterprise Linux 6.2 Advanced Update Support (AUS)**kernel保留
Red Hat Enterprise MRG 2kernel-rt保留
*このパッチを取得するには、有効な EUS サブスクリプション が必要です。

お持ちのアカウントに有効な EUS サブスクリプションがない場合は、詳細について Red Hat の営業部門または営業担当者に お問い合わせ ください。

**RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です

軽減策

一般的に、カーネルスタックメモリーの破損を悪用すると、kernel ring 0 (root など) 権限を使用して簡単にシステム上で任意のコードを実行できます。RHEL カーネルは、このようなメモリーの破損から保護する gcc コンパイルタイムオプションで強化されています。gcc -fstack-protector オプションは、カナリア値を関数の最初と関数の戻りアドレスの前に追加します。-fstack-protector-strong はカナリアの保護を、タイプや長さのアレイを含むローカルのスタック変数の周辺に拡張します。データをこれらのスタック変数にコピーする間、カーネルはカナリア値を検証してメモリーの破損を検出し、カーネルパニックによる攻撃を阻止します。

Bluetooth カーネルモジュール (bluetooth、btusb、bnep) は、システムが起動し、Bluetooth サービスが有効であると自動的にロードされます。カーネルモジュールがロードされないようにするには、システム全体の modprobe ルールを使用します。以下のコマンドを実行して、Bluetooth モジュールをブラックリストし、Bluetooth ハードウェアが存在する場合はロードしないようにします。
# echo "install bnep /bin/true">> /etc/modprobe.d/disable-bluetooth.conf
# echo "install bluetooth /bin/true">> /etc/modprobe.d/disable-bluetooth.conf
# echo "install btusb /bin/true">> /etc/modprobe.d/disable-bluetooth.conf

さらに、カーネルモジュールを無効にしたら、bluez (Bluetooth ユーティリティー) パッケージがインストールされている場合は Bluetooth サービスを起動時に無効にします。RHEL 7 では root として次のコマンドを実行します。

# systemctl disable bluetooth.service
# systemctl mask bluetooth.service
# systemctl stop bluetooth.service

RHEL 6 では、以下のコマンドを root として実行します。

# service bluetooth stop
# chkconfig bluetooth off

注意: 上記のカーネルモジュールがすでにロードされている場合、rmmod コマンドを使用すると手作業でアンロードすることができます。システムで検出された Bluetooth ハードウェアに応じて、ロードされる Bloetooth モジュールに若干の違いがあることが想定されます。rmmod コマンドは、使用時にロードされた追加の Bluetooth モジュールに関する情報を表示します。ロードされたことが通知される追加の Bluetooth モジュールすべてに rmmod を実行します。root として以下を実行し、実行中のカーネルからこれらのモジュールをアンロードします。

# rmmod bnep
# rmmod bluetooth
# rmmod btusb
    ヘルプが必要な場合は このソリューション を参照するか、Red Hat グローバルサポートサービス にお問い合わせください。

    Ansible Playbook

    Ansible playbook を利用できます。正規のスクリプトであることを確認する場合は 分離されている GPG 署名 もダウンロードします。

    /etc/modprobe.d/disable-bluetooth.conf にブラックリストファイルを作成して脆弱性のあるモジュールがロードされないようにすることで「偽のインストール」を実行し、脆弱性を軽減します。また、これにより Bluetooth サービスが存在する場合は無効化されます。Bluetooth モジュールがすでに実行中のカーネルにロードされ、削除できない場合は、システムを再起動 します。ブラックリストファイルにより、モジュールのロードが確実に禁止されます。必要であれば、修正済みのパッケージをインストールした後に /etc/modprobe.d/disable-bluetooth.conf を削除できます。

    この Playbook は、HOSTS という名前の変数に対して実行されます。次のように起動できます (「hostname」がインベントリーファイルに定義されていることが前提です)。 
    # ansible-playbook -e HOSTS=hostname cve-2017-1000251-mitigation.yml	
     この Playbook には root 権限が必要であり「become: true」を指定するので、適切な権限が設定されているアカウントを使用する必要があります。

    Comments