CVE-2017-1000253: load_elf_binary により十分な容量が割り当てられない

Public Date: September 26, 2017, 12:00 am
Updated -
Ongoing Status
Important Impact

Red Hat Product Security チームは、Linux カーネルの ELF バイナリー読み込みの実装に影響を与える脆弱性について認識しています。アプリケーションが 位置独立実行形式 (PIE: Position Independent Executables) として構築されている場合、そのアプリケーションのデータセグメントの一部が、スタック用に確保されているメモリー領域へマッピングすることをローダーが許可してしまうため、スタックが破損し、権限の昇格が可能となってしまう可能性があります。この脆弱性には CVE-2017-1000253 が割り当てられました。この問題は 2017 年 9 月 26 日に公開され、重要な影響と評価されています。

背景情報

位置独立実行形式 (PIE: Position Independent Executables) は、アプリケーションバイナリー (ELF)、ライブラリー、関連アセットのメモリーの場所をランダム化して、攻撃を困難にすることを目的としたセキュリティーメカニズムです。メモリーの特定の場所にあるデータの予測可能性を減らすことで、一般的な攻撃の成功率を低減することを目的としています。

PIE 実行ファイルの詳細

compile-time オプションとして '-pie' フラグを指定してコンパイラーに渡すことで、PIE で実行ファイルを作成できます。

$ gcc -pie test.c -o test

既存のプログラムは、 'readelf' を使用して固有のヘッダーを検索することで、PIE 実行ファイルであるかどうかを判断することができます。以下は、以前にコンパイルされた test 実行ファイルを検証する際に使用したコマンド例です。

$  readelf -h ./test | grep "Type:[[:space:]]*DYN "
  Type:                              DYN (Shared object file)

$ readelf -d ./test |grep "(DEBUG)"
 0x0000000000000015 (DEBUG)              0x0

攻撃者は PIE 実行ファイルを作成できなくても、システム上の既存の PIE 実行ファイルを悪用することができます。

謝辞

Red Hat は、Qualys Research Labs がこの問題を報告してくださったことに感謝いたします。

その他の参考資料

https://www.qualys.com/2017/09/26/cve-2017-1000253/cve-2017-1000253.txt
https://access.redhat.com/blogs/766093/posts/1975793
http://www.trapkit.de/tools/checksec.html
https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables
https://sourceware.org/binutils/docs/binutils/readelf.html


影響を受ける製品

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

以下の Red Hat 製品のバージョンが影響を受けます。

  • Red Hat Enterprise Linux 5
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 7 (7.4.0 より前のリリース)
  • Red Hat Enterprise Linux for Realtime (kernel-rt-3.10.0-693.rt56.617 より前のバージョン)
  • Red Hat Enterprise MRG 2 (kernel-rt-3.10.0-693.2.1.rt56.585.el6rt より前のバージョン)

影響を受けない製品

カーネル 3.10.0-693 以降のバージョンが搭載された Red Hat Enterprise Linux 7.4、カーネル kernel-rt-3.10.0-693.rt56.617 以降のバージョンが搭載された Red Hat Enterprise Linux for Realtime、カーネル kernel-rt-3.10.0-693.2.1.rt56.585.el6rt 以降のバージョンが搭載された Red Hat Enterprise MRG-2 を実行中のシステムには、今回の脆弱性による影響はありません。

Red Hat の Linux コンテナーでは、ホストのカーネルからの不具合が継承されます。Red Hat では、入手可能な最新版のコンテナーイメージを使用することを推奨しています。Red Hat Container Catalogue に含まれる Container Health Index を使用すると、お使いのコンテナーのセキュリティー状況を確認できます。

攻撃の詳細と影響

カーネルが ELF 実行ファイルの読み込みを試行し、必要なメモリー容量全体が正しく算出されないと、不具合が発生します。カーネルがバイナリーのセグメントを読み込むと、バイナリーの一部が アプリケーションとスタックのギャップ用に確保されている領域とそれ以上の領域にマッピングされ、スタック自体と、バイナリーの一部が重複してしまう可能性があります。

攻撃者は、正しいサイズを割り当て、データの破損時には有効で機能するペイロードでオーバーレイされるように実行するバイナリーを作成する必要があります。攻撃者はカーネルの指示を変更できませんが、特定した権限のあるユーザー空間アプリケーション (setuid) に対して攻撃が行われた場合や、追加のユーザー権限がある場合には、権限の昇格が可能になる場合があります。

これはリモート攻撃ではなく、攻撃者はシステム上のローカルアカウントへのアクセスを必要とします。

脆弱性の診断

システムの脆弱性の判断

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

対処方法

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

影響を受ける製品の更新

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

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

* kpatch をリクエストするには、有効なプレミアムサブスクリプションのエンタイトルメントが必要になります。

製品パッケージアドバイザリー
Red Hat Enterprise Linux 7.3 Extended Update Support**kernelRHSA-2017:2793
Red Hat Enterprise Linux 7.2 Extended Update Support**kernelRHSA-2017:2794
Red Hat Enterprise Linux 6kernelRHSA-2017:2795
Red Hat Enterprise Linux 6.7 Extended Update Support**kernelRHSA-2017:2796
Red Hat Enterprise Linux 6.6 Advanced Update Support***kernelRHSA-2017:2797
Red Hat Enterprise Linux 6.5 Advanced Update Support***kernelRHSA-2017:2798
Red Hat Enterprise Linux 6.4 Advanced Update Support***kernelRHSA-2017:2799
Red Hat Enterprise Linux 6.2 Advanced Update Support***kernelRHSA-2017:2800
Red Hat Enterprise Linux 5 Extended Life SupportkernelRHSA-2017:2801
Red Hat Enterprise Linux 5.9 Advanced Update Support***kernelRHSA-2017:2802

*このパッチを取得するには、有効な EUS サブスクリプションが必要です

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

Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?

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

軽減策

vm.legacy_va_layout を 1 に設定すると、レガシーの mmap レイアウトに切り替えて、この問題の悪用を実質的に停止することができます。mmap の割り当ては、プロセスアドレス空間の下層部で開始され、ボトムアップの割当モデルに従っています。そのため、最初の PIE 実行ファイルは確保されているスタック領域から離れた場所にマッピングされ、スタックに干渉できなくなります。

Red Hat Enterprise Linux 5 の 64 ビットプロセスでは、vm.legacy_va_layout の値に関係なく、強制的にレガシーの仮想アドレス空間レイアウトが使用されます。

注記: 大容量のリニアアドレス空間を必要とするアプリケーション (特定のデータベースなど) は、この軽減策で提案されているレガシーのメモリーレイアウトを処理できない可能性があります。Red Hat では、実稼働システムにこの軽減策をデプロイする前に、システムとアプリケーションをテストすることを推奨しています。

root として /etc/sysctl.conf ファイルを編集し、以下のように追加または変更します。
vm.legacy_va_layout = 1
この設定を適用するには、root ユーザーとして /sbin/sysctl -p コマンドを実行して、/etc/sysctl.conf からの設定をリロードします。

vm.legacy_va_layout が定義した値に設定されていることを確認します。
$ /sbin/sysctl vm.legacy_va_layout
    vm.legacy_va_layout = 1

    さらにサポートが必要な場合には Red Hat グローバルサポートサービス にお問い合わせください。

    Ansible Playbook

    Ansible playbook が利用可能です。正規のスクリプトであることを確認するために、GPG 分離署名 もダウンロードできます。

    この Playbook は、HOSTS という名前の変数に対して実行され、次のように起動できます (「hostname」がインベントリーファイルで定義されていることが前提)。

    # ansible-playbook -e HOSTS=hostname cve-2017-1000253-mitigation.yml	

    この Playbook には root 権限が必要で、「become: true」を指定するので、適切なパーミッションのあるアカウントを使用する必要があります。