Anda dan 3 orang lainnya sedang belajar untuk ujian, menggunakan catatan yang sama.
Anda mengatakan "Saya harus pergi, saya perlu membuat salinan catatan ini untuk diri saya sendiri agar saya dapat memberi markup... biarkan saya membuat salinan!"
Anda membawa catatan ke mesin fotokopi, menyalinnya, mengubah asli , lalu ambil asli yang dimodifikasi kembali ke kelompok lainnya. Versi modifikasi itu buruk; Anda telah mengubah beberapa jawaban menjadi salah.
Anggota kelompok lainnya dibiarkan mempelajari versi catatan yang buruk, sementara Anda membawa pulang versi yang baik.
Anda lulus ujian.
Mereka gagal.
Satu-satunya nuansa antara contoh ini dan SAPI Kotor adalah bahwa di SAPI Kotor Anda seharusnya menyerahkan yang asli; kernel membuat salinannya untuk Anda. Tapi ada kondisi balapan yang secara keliru memberi Anda akses ke aslinya saat Anda meminta salinannya. "Kondisi ras" berarti "Anda dapat menyelinap masuk ke sesuatu yang seharusnya tidak dapat Anda akses".
Saya bukan ahli kernel linux, tetapi saya akrab dengan konsep-konsep yang terlibat dan saya membaca komentar Linus dan perbedaannya. Saya akan mencobanya - mungkin orang lain dapat mengoreksi saya jika saya salah dan kita akan menyelesaikannya bersama.
Salin Saat Tulis adalah konsep memori internal di mana, terutama karena alasan kinerja, operasi yang membuat salinan bagian memori tidak benar-benar mendapatkan salinannya sendiri kecuali dan sampai mereka membuat perubahan pada memori itu - pada saat itu, Anda dengan cepat buat salinan mereka, ubah itu dan serahkan kembali kepada mereka. Keuntungannya adalah Anda tidak perlu melakukan pekerjaan membuat salinan kecuali dan sampai mereka benar-benar mengubahnya - lebih cepat, penggunaan memori lebih sedikit, penyimpanan cache lebih baik.
Bug di sini ada dalam kode yang melakukan penyalinan itu. Tampaknya ada kondisi balapan di salinan itu (atau sebenarnya di pembukuan di sekitar salinan itu). Kondisi balapan terjadi ketika dua proses atau utas yang berbeda mengakses sumber daya yang sama dan saling menginjak. Dalam hal ini, yang terjadi adalah memori ditandai agar dapat ditulisi sebelum benar-benar disalin - jika dua utas bekerja sangat dekat satu sama lain, yang kedua dapat memanfaatkan bendera yang dapat ditulisi dan benar-benar menulis ke memori asli, bukan salinannya.
Eksploitasinya adalah ini memungkinkan suatu proses meningkatkan dirinya sendiri dengan mendapatkan akses tulis ke pemahaman kernel sendiri tentangnya. Kernel mengetahui pengguna yang menjalankan setiap proses - dengan mengambil salinan dari memori yang digunakan kernel untuk menyimpan info tersebut menggunakan Copy On Write, kemudian menggunakan bug Dirty COW ini, mereka benar-benar dapat menulis info pengguna ke dalam salinan kernel itu sendiri . Jadi mereka menulis bahwa prosesnya dijalankan sebagai root.. dan kemudian mereka dapat melakukan apa saja.
Program demo menggunakannya untuk menulis ke file yang hanya dapat ditulisi oleh root, tetapi itu bisa melakukan apa saja. Perbaikannya adalah memisahkan bendera baru yang mengatakan bahwa mereka sedang melakukan CopyOnWrite, alih-alih menggunakan bendera Tulis untuk keduanya.