CVE-2017-1000253: load_elf_binary により十分な容量が割り当てられない
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 MRG 2
影響を受けない製品
カーネル 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) に対して攻撃が行われた場合や、追加のユーザー権限がある場合には、権限の昇格が可能になる場合があります。
これはリモート攻撃ではなく、攻撃者はシステム上のローカルアカウントへのアクセスを必要とします。
脆弱性の診断
対処方法
影響を受けるバージョンのカーネルをご使用のお客様は、パッチのリリース直後にカーネルを更新することが強く推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。カーネルの更新を適用するには、システムを再起動する必要があります。
影響を受ける製品の更新
Red Hat Enterprise Linux 7.2 以上をお使いのお客様は kpatch を利用できます。* kpatch を利用する場合はサポートケースを作成してください。
kpatch の詳細は RHEL 7 はライブカーネルパッチ (kpatch) をサポートしていますか? を参照してください。
* kpatch をリクエストするには、有効なプレミアムサブスクリプションのエンタイトルメントが必要になります。
製品 | パッケージ | アドバイザリー |
---|---|---|
Red Hat Enterprise Linux 7.3 Extended Update Support** | kernel | RHSA-2017:2793 |
Red Hat Enterprise Linux 7.2 Extended Update Support** | kernel | RHSA-2017:2794 |
Red Hat Enterprise Linux 6 | kernel | RHSA-2017:2795 |
Red Hat Enterprise Linux 6.7 Extended Update Support** | kernel | RHSA-2017:2796 |
Red Hat Enterprise Linux 6.6 Advanced Update Support*** | kernel | RHSA-2017:2797 |
Red Hat Enterprise Linux 6.5 Advanced Update Support*** | kernel | RHSA-2017:2798 |
Red Hat Enterprise Linux 6.4 Advanced Update Support*** | kernel | RHSA-2017:2799 |
Red Hat Enterprise Linux 6.2 Advanced Update Support*** | kernel | RHSA-2017:2800 |
Red Hat Enterprise Linux 5 Extended Life Support | kernel | RHSA-2017:2801 |
Red Hat Enterprise Linux 5.9 Advanced Update Support*** | kernel | RHSA-2017:2802 |
*このパッチを取得するには、有効な EUS サブスクリプションが必要です。
お持ちのアカウントに有効な EUS サブスクリプションがない場合は、Red Hat 営業部門または営業の担当者にお問い合わせください。
Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?
***RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です。
軽減策
Red Hat では、実稼働システムにこの軽減策をデプロイする前に、システムとアプリケーションをテストすることを推奨しています。
さらにサポートが必要な場合には Red Hat グローバルサポートサービス にお問い合わせください。
Ansible Playbook
Ansible playbook が利用可能です。正規のスクリプトであることを確認するために、GPG 分離署名 もダウンロードできます。
この Playbook は、HOSTS という名前の変数に対して実行され、次のように起動できます (「hostname」がインベントリーファイルで定義されていることが前提)。
# ansible-playbook -e HOSTS=hostname cve-2017-1000253-mitigation.yml
この Playbook には root 権限が必要で、「become: true」を指定するので、適切なパーミッションのあるアカウントを使用する必要があります。
Comments