Tú y otras 3 personas están estudiando para un examen, usando las mismas notas.
Dices "Me tengo que ir, necesito hacer una copia de estas notas para mí mismo que pueda marcar... ¡déjame ir a hacer una copia!"
Llevas las notas a la fotocopiadora, las copias, alteras el original y luego tome el original modificado de vuelta al resto del grupo. Esa versión modificada es mala; has alterado algunas respuestas para que sean incorrectas.
El resto del grupo se queda estudiando una mala versión de las notas, mientras tú te llevas la buena versión a casa.
Pasas la prueba.
Ellos fallan.
El único matiz entre este ejemplo y Dirty COW es que en Dirty COW no se supone que eres entregó el original; el núcleo hace la copia por usted. Pero hay una condición de carrera que por error te da acceso al original cuando pides una copia. "Condición de carrera" significa "puedes acceder sigilosamente a algo a lo que no deberías tener acceso".
No soy un experto en kernel de Linux, pero estoy familiarizado con los conceptos involucrados y leí el comentario de Linus y la diferencia. Lo intentaré, tal vez la gente pueda corregirme si me equivoco y resolveremos las cosas juntos.
Copy On Write es un concepto de memoria interna en el que, principalmente por razones de rendimiento, las operaciones que hacen una copia de una sección de la memoria en realidad no obtienen su propia copia a menos y hasta que realicen un cambio en esa memoria; en ese momento, rápidamente hacer su copia, hacer el cambio a eso y devolvérselo. La ventaja es que no tiene que hacer el trabajo de hacer la copia a menos y hasta que realmente la cambien:más rápido, menos uso de memoria, mejor almacenamiento en caché.
El error aquí está en el código que hace esa copia. Parece que hay una condición de carrera en esa copia (o en realidad en la contabilidad de esa copia). Una condición de carrera ocurre cuando dos procesos o subprocesos diferentes acceden al mismo recurso y se pisan entre sí. En este caso, lo que sucede es que la memoria se marca para que se pueda escribir antes de que se copie:si dos subprocesos están trabajando muy cerca uno del otro, el segundo puede aprovechar el indicador de escritura y escribir en la memoria original, no la copia.
El exploit es que esto permite que un proceso se eleve a sí mismo al obtener acceso de escritura a la propia comprensión del núcleo. El kernel sabe en qué usuario se está ejecutando cada proceso:al tomar una copia de esa memoria que el kernel está usando para almacenar esa información usando Copy On Write, luego usando este error Dirty COW, en realidad pueden escribir la información del usuario en la propia copia del kernel. . Entonces escriben que el proceso se está ejecutando como root... y luego pueden hacer cualquier cosa.
El programa de demostración usa eso para escribir en un archivo que solo puede escribir root, pero podría haber hecho literalmente cualquier cosa. La solución fue separar una nueva bandera que decía que estaban haciendo un CopyOnWrite, en lugar de usar la bandera Write para ambos.