先週開催されたセキュリティカンファレンス「Black Hat」で、Dirty Credと呼ばれる新たなLinuxカーネルエクスプロイトが明らかになった。
博士課程の学生であるZhenpeng Lin氏と研究チームは、悪名高いDirty Pipe脆弱性に対する別のアプローチに取り組んだ。
Dirty Pipeは、カーネルがパイプを使ってデータを受け渡す仕組みを悪用し、攻撃者が最小権限のアカウントをroot権限まで昇格させられる重大な欠陥だ。攻撃者はこれを利用してシステムファイルを変更し、脆弱なマシン上でroot権限で実行される任意のコードを注入できる。
Lin氏のチームは、既報の脆弱性(CVE-2021-4154)と新たな脆弱性(CVE-2022-2588)に対して脆弱なシステムで、Linuxカーネルの認証情報を入れ替える手法を発見し、今後は互換性のあるCVEをさらに追加する予定だという。公開されているPOC(概念実証)はGitHubで提供されており、攻撃に対する有効な防御策となる。
研究者らはこのアプローチを、コンテナ(Dirty Pipeとは異なり)やAndroidにも適用できる汎用的な手法であり、「さまざまなバグをDirty Pipeのように機能させる」ものだと説明している。実際、生成されたエクスプロイトは「コードを変更せずに異なるカーネルやARCHで動作する」という。
こちらも読む:CI/CDパイプラインはソフトウェアサプライチェーンの重大なリスク:Black Hatの研究者ら
Dirty Credの仕組み
Lin氏はTwitterで、同じエクスプロイトコードを使い、CentOS 8やUbuntuなど異なる2つのシステム上で低権限ユーザーの権限を昇格させる方法を実演するデモを公開した。
攻撃の実体はカーネルヒープの破壊だ。特権認証情報は非特権の認証情報から分離されていないため、攻撃者は両者を入れ替えようとする可能性がある。
カーネルの認証情報には主に2種類ある:
- タスク認証情報
- オープンファイル認証情報
簡単に説明すると、カーネルは「struct cred」と「struct file」という2種類のオブジェクトを使用する。これらのオブジェクトは専用のキャッシュに格納される。前者にはタスク認証情報、つまりプロセスの特権、機能、権限に関する情報が保持される。
このようなデータを変更できる攻撃は、権限昇格につながる可能性がある。Dirty Credは、使用中の非特権認証情報を解放し、空いたメモリ領域に特権認証情報を割り当て、最終的に特権ユーザーとして操作する:
ただし、この攻撃は完璧ではない。特権ユーザーがタスク認証情報を割り当てるまで待つ必要があるためだ。例えば、root SUIDを持つプロセスを起動させることは可能だと考えられる。
オープンファイル認証情報とstruct fileオブジェクトの場合も、アプローチはほぼ同じだ。攻撃者は権限チェックの後、ファイルがディスクに書き込まれる前にファイルを解放する。これにより、攻撃者はそのメモリ領域に読み取り専用のファイルオブジェクトを割り当て、特権ユーザーとして操作できる可能性がある:
ファイルエクスプロイトを安定させるための最後の手順は、簡単に実現できるものではない。入れ替えは権限チェックとディスクへの書き込みの間に行う必要があり、時間枠が極めて狭いためだ。
研究者らは、その時間枠を延ばすため、カーネルの実行を一時停止させる複数の解決策(FUSEやファイルロックなど)を示した。
詳しくは、最適な特権アクセス管理(PAM)ソフトウェアを参照。
Dirty Cred攻撃から身を守る方法
特定の脆弱性など一定の条件下ではすでに動作しているものの、POCはまだ開発途上である点には注意が必要だ。CVE-2021-4154はLinuxカーネルで修正済みだが、研究者らによれば「このエクスプロイトは、linux-4.18.0-305.el8より新しいCentOS 8カーネルの大半と、5.4.0-87.98および5.11.0-37.41より新しいUbuntu 20カーネルの大半で動作する」という。
オブジェクトは特権ではなく種類に基づいて分離されているため、研究者らは、キャッシュをまたぐ攻撃を防ぐために仮想メモリを使って特権認証情報を非特権の認証情報から分離することを推奨している。





