Linux カーネルキーチェーン管理における「Use after free」脆弱性 (CVE-2016-0728)
Red Hat は、Red Hat Enterprise Linux 7 カーネルおよび派生物に同梱されているカーネルに影響を与える脆弱性を認識しています。 この脆弱性 CVE-2016-0728 により、スキルのある攻撃者が任意のコードを実行したり、システム上の特権を昇格させたりできる可能性があります。攻撃者はアカウントでカスタムコードを実行できる状態にあることが前提になります。ほとんどの一般的な設定では、これを実行するにはターゲットシステムのログインおよびシェルアカウントを持っている必要があります。
診断ステップ:
この問題は、カーネルのバージョン 3.10 のコミット 3a50597de8635cd05133bd12c95681c82fe7b878 で取り込まれました。このバージョン以降のすべての Red Hat Enterprise Linux カーネルがこの脆弱性の影響を受けます。本書は、その修正を含むバージョンと共に更新されています。
システムが実行しているカーネルのバージョンを確認するには、https://access.redhat.com/articles/3078 を参照してください。
メジャーリリース | 状態 | 修正 |
---|---|---|
Red Hat Enterprise Linux 4 | 影響なし | |
Red Hat Enterprise Linux 5 | 影響なし | |
Red Hat Enterprise Linux 6 | 影響なし | |
Red Hat Enterprise Linux 7 | 影響あり | https://access.redhat.com/errata/RHSA-2016:0064 |
Red Hat Enterprise Linux 7.1 EUS | 影響あり | https://access.redhat.com/errata/RHSA-2016:0103 |
Red Hat Enterprise Linux 7 for Real Time | 影響あり | https://access.redhat.com/errata/RHSA-2016:0065 |
Red Hat Enterprise MRG 2 | 影響あり | https://access.redhat.com/errata/RHSA-2016:0068 |
カーネルをアップデートする方法
このアップデートを適用する方法についての詳細は、この 記事 を参照してください。
システムへの影響:
ユーザーにはシステムのアカウントを持っているか、またはシステムに対してユーザーの代わりにコードを実行するように指示できる必要があります。攻撃は即時に起こる訳ではなく、実行にいくらかの時間がかかる場合があります。システムはキーの使用数が上昇してから、負にラップすることを示します。以下のコマンドは、使用数が 50076394 のキーファイルを表示しており、攻撃が進行中であることを示しています。
$ cat /proc/keys | grep TEST_KEY
01cca8cf I--Q--- 50076394 perm 3f3f3f3f 0 0 keyring TEST_KEY: empty
攻撃が成功して障害が発生する際にログイベントは生成されません。
この脆弱性により、使用しているシステムがセキュリティー侵害を受けた可能性があります。どうすればよいでしょうか。
本記事の診断ステップを実行してから、依然としてお使いのシステムに脆弱性があると思われるか、またはお使いのシステムがセキュリティー侵害を受けたと思われる場合は、Red Hat の サポートケースを開く か、または Red Hat サポートに電話でお問い合わせください。
よくある質問
Q) 「Use after free」とは何ですか。またこれはどのように悪用されるのでしょうか。
A) カーネルは参照カウンターを使用し、特定のカーネルオブジェクトを使用しているコードの各種部分の数を追跡します。この場合に該当するオブジェクトは、ユーザーによって作成されるキーリングオブジェクトです。カウンターがゼロに設定されていると、カーネルは、オブジェクトを解放できることを認識します。カーネルがキーリングオブジェクトの取得を試行する際は、一致する key_get() を使用し、これをリリースする際は一致する key_put() 関数呼び出しを使用します (カーネルがオブジェクトの使用を完了した時点)。
この脆弱性におけるエラーとは、エラーパスの処理時に key_put() 関数を呼び出せないことです。キーオブジェクトを取得する呼び出し回数がリリース要求に一致しない場合、カウンターの整数値が最大値からゼロにラップされます。カウンターがゼロであるとの条件が満たされると、オブジェクトはリリースされますが、メモリー内のオブジェクトへの参照は依然として残ります。この状況により、参照カウンターのオーバーフローが生じ、よく知られている「use-after-free」バグクラスに相当する状況が生じます。
カーネルの他の部分は、この解放済みメモリーを使用のために割り当てることができます。攻撃者は、メモリーの正しい場所を各種の指示で上書きすることにより、このメモリー内の関数が呼び出される際のペイロードとして、この解放済みのメモリー領域を使用することができます。この状況でのペイロードは、昇格された特権を持つ新たなシェルを発生させます。
Q) インターネットのサイトには、この悪用は以下のコマンドで防ぐことができるという記載がありました。
# echo 1 > /proc/sys/kernel/keys/maxkeys
A) この制限は、ユーザーが作成したキーにのみ適用され、root で作成されたキーには適用されません。各ユーザーは、ログイン時に pam 経由で (root で) セッションキーリングを取得します。現時点で回避策とはなりません。
Q) リブートを計画する前に実行できる代替の軽減策はありますか。
A) Frank Ch. Eigler 氏が 脆弱性バグのコメント #13 およびコメント #14 で systemtap に関連する回避策案についてコメントしています。Bugzilla コメントの指示に従ってください。
Q) カーネルアップデートのインストール後はリブートする必要がありますか。
A) はい。
Q) SELinux はこの問題を軽減しますか。
A) いいえ。
参考資料:
Perception points analysis
Red Hat's Bugzilla on CVE-2016-0278
Red Hat's Security Vulnerability Response Site
Comments