今週は、Linuxカーネルに存在する深刻度の高い脆弱性について説明します。
ダーティパイプ - Linux のローカル特権のエスカレーション
CVE-2022-0847により、権限のない Linux ユーザーが任意の読み取り専用ファイルを上書きすることが可能です。この脆弱性を利用して、root プロセスにコードを注入し、root ユーザーへと特権を昇格させることが可能です。
Dirty Cow」脆弱性と同様に、攻撃者は「Dirty Pipe」エクスプロイトを実行し、ファイルにテキストを書き込むことができます。Dirty Pipeが悪用されやすいのは、ユーザーが任意のファイルにテキストを書き込むことができ、場合によってはSUIDバイナリ経由で簡単に特権を昇格させることができる点です。
根本原因 - Dirty Pipe 脆弱性は、初期化されていないpipe_buffer.flags変数によって引き起こされます。パイプはプロセス間通信に使用されるツールで、一方の端がデータをプッシュし、他方の端がそのデータをプルすることができます。パイプバッファが初期化されていない状態でコミットされた場合、深刻度の高い脆弱性が発生します。ページキャッシュの参照にPIPE_BUF_FLAG_CAN_MERGEを注入すると、特殊な方法で用意されたパイプに新しいデータを書き込むだけで、ページキャッシュ内のデータを上書きすることが可能です。
この脆弱性には、いくつかの注意点があります。
- 攻撃者は、ファイルの読み取り権限を持っている必要があります。
- オフセットはページ境界であってはならない
- 書き込みがページ境界を越えることができない
- ファイルのサイズを変更することはできません
現在のところ、この脆弱性に対する既存の緩和策はありません。Linux カーネルのバージョンが 5.8 より大きい場合、ベンダーは以下のバージョンにパッチを適用することを推奨しています。5.16.11, 5.15.25, 5.10.102。
2022年3月14日更新:最新のLinodeカーネルが利用可能で、Dirty Pipeが修正されています。
cgroupsによるコンテナエスケープ
コントロールグループ(cgroups)は、Linuxカーネルの機能の一つで、プロセスのコンピュータリソースの使用量を割り当て、割り当てるものです。場合によっては、これらのプロセスは階層的なグループに編成され、グループに基づいてリソースの割り当てが行われます。
Cgroupsは、Linuxのコンテナでよく使われます。コンテナ内で複数のプロセスが動作しており、それらをグループ化する必要があるためです。
CVE-2022-0492は、コンテナから脱出し、ホストマシンにピボットすることができる脆弱性です。これは、cgroup アーキテクチャ v1 のみに影響します。
根本原因- この脆弱性は、cgroups v1 の機能であるrelease_agentファイルに関係します。release_agentファイルにより、管理者は、cgroup 内のプロセスが終了したときに実行する 「リリースエージェント」を設定することができます。release_agentはルート cgroup ディレクトリにのみ表示され、その子 cgroup 全てに影響します。プロセスが終了するたびに、カーネルはnotifiy_on_releaseが有効かどうかをチェックし、有効であれば、設定されたrelease_agentバイナリを生成します。コンテナエスケープは、Linux がrelease_agentファイルを設定するプロセスが管理者権限(例:CAP_SYS_ADMIN能力)を持っているかどうかをチェックしなかったために発生します。
この脆弱性は、以下の方法で緩和することができます。
- AppArmor、SELinux、またはSeccompのセキュリティプロファイルの有効化
- 必要ない場合は非特権ユーザーの名前空間を無効にする
- 非特権ユーザーでのコンテナ実行
Palo Altoのセキュリティ研究者は、あなたのコンテナ環境がCVE-2022-0492に対して脆弱であるかどうかを判断するためのテストを作成しました。
この脆弱性の背景には、いくつかの注意点があります。本脆弱性の悪用を成功させるためには、以下の条件を満たす必要があります。
- コンテナは特権ユーザー(rootまたはno_new_privs フラグを持つユーザー)として実行する必要がある。
- AppArmor、SELinux、またはSeccompを無効にする必要があります。
- ホストは非特権ユーザーの名前空間を有効にする必要がある
- コンテナは、ルート v1 cgroup
ヒープアウト境界書き込みによる Netfilter のローカル特権のエスカレーション
Netfilterは、ネットワークに関連するさまざまな操作を可能にするLinuxカーネルによるフレームワークである。パケットフィルタリング、ネットワークアドレス(およびポート)変換、パケットロギング、ユーザ空間パケットキューイングが可能です。また、ステートレスおよびステートフルパケットフィルタリングに基づいたインターネットファイアウォールを構築することができます。
CVE-2022-25636 は、ローカルユーザが関数nft_fwd_dup_netdev_offload () でヒープ境界外書き込みを行うことができる脆弱性です。nf_dup_netdev.cを 使用し、特権を得ることができます。この脆弱性は、現在、カーネルバージョン 5.4-rc1 から 5.6.10 までのバージョンに影響します。
根本原因:nft_fwd_dup_netdev_offload関数において、ハードウェアオフロードを有効にしたチェーン上のdupまたはfwdフロールールを設定する際に、ctx->num_actions++がflow->rule->action.entries配列にオフセットするために使用されています(nf_dup_netdev.c:67)。インクリメントが呼び出される数と割り当てられたエントリの数に不一致があります。割り当てられた配列サイズはexpr.offload_flags&NFT_OFFLOAD_F_ACTION(nf_tables_offload.c:97) を持つ nftables 式の数に基づいていますが、即時式タイプだけがこれを持ちます (dup や fwd ではありません)。この不一致により、対応する/先行する即値のないdup/fwd式でルールを作成すると、エントリ配列のサイズが小さくなり、任意の数の境界外配列の書き込みが発生する可能性があります。誰かがスクリプトを書き、OOB書き込みを実行すると、カーネルROP/ローカル特権の昇格に変わる可能性があります。
カーネルを最新バージョンにパッチすることをお勧めします。
コメント