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