XKCDハートブリードの説明 を覚えている方は多いと思います。同じ趣旨で、ブランド化された最新の脆弱性 Dirty COW がどのように機能するかについて説明を求めたいと思います。
Linuxカーネルがどのように機能するか、または「コピーオンライト」が何であるかを知らない私のような誰かにそれを説明することは可能ですか?私は それが何をするか の説明を探しているのではなく、それがどのようにそしてなぜ機能するかについての説明を探しているわけではないことに注意してください。
私はLinuxカーネルの専門家ではありませんが、関係する概念に精通しており、Linusのコメントと差分を読みました。私はそれをやってみます-おそらく私がそれを間違えた場合、人々は私を訂正することができ、私たちは一緒に物事をハッシュ化します。
コピーオンライトは内部メモリの概念であり、主にパフォーマンス上の理由から、メモリのセクションのコピーを作成する操作は、メモリに変更を加えない限り、実際に独自のコピーを取得しません。彼らのコピーを作り、それに変更を加え、それを彼らに返します。利点は、実際に変更しない限り、実際に変更しない限り、コピーを作成する作業を行う必要がないことです。つまり、より高速で、メモリ使用量が少なく、キャッシュが向上します。
ここのバグは、そのコピーを行うコードにあります。そのコピー(または実際にはそのコピーに関する簿記)に競合状態があるようです。競合状態は、2つの異なるプロセスまたはスレッドが同じリソースにアクセスし、互いにステップ実行しているときに発生します。この場合、実際にコピーされる前にメモリに書き込み可能のフラグが付けられます-2つのスレッドが互いに非常に密接に動作している場合、2番目のスレッドは書き込み可能フラグを利用して実際には元のメモリに書き込むことができますコピー。
エクスプロイトは、カーネル自身の理解への書き込みアクセスを取得することにより、プロセスがそれ自体を昇格させることです。カーネルは、各プロセスがどのユーザーで実行されているかを認識しています-カーネルがコピーオンライトを使用してその情報を保存するために使用しているメモリのコピーを取得し、このDirty COWバグを使用して、ユーザー情報をカーネルの独自のコピーに実際に書き込むことができます。そのため、彼らはプロセスがrootとして実行されていると書いています。そして、彼らは何でもすることができます。
デモプログラムはそれを使用して、rootのみが書き込み可能なファイルに書き込みますが、文字通り何でもできます。修正は、両方にWriteフラグを使用するのではなく、CopyOnWriteを実行していることを示す新しいフラグを分離することでした。
あなたと他の3人が同じノートを使用してテストのために勉強しています。
あなたは「私は行かなければならない、私がマークアップできる自分のためにこれらのノートのコピーを作成する必要があります...コピーを作成させてください!」
メモをコピー機に取り、それをコピーしてoriginalを変更してから、-変更されたオリジナルをグループの残りの部分に戻します。その変更されたバージョンは悪いです。いくつかの回答を間違ったものに変更しました。
残りのグループは、良いバージョンのノートを持ち帰る間、悪いバージョンのノートを勉強し続けます。
あなたはテストに合格します。
彼らは失敗します。
この例とDirty COWの唯一のニュアンスは、Dirty COWでは想定されているがオリジナルを渡されていないことです。カーネルがコピーを作成します。ただし、コピーを要求すると、誤ってオリジナルにアクセスできる競合状態があります。 「レース状態」とは、「アクセスしてはいけないものにアクセスできる」という意味です。