No soy un experto en el kernel de Linux, pero estoy familiarizado con los conceptos involucrados y leo el comentario de Linus y la diferencia. Voy a intentarlo, tal vez la gente pueda corregirme si me equivoco y nos arreglaremos las cosas juntos.
Copia en escritura es un concepto de memoria interna en el que, principalmente por motivos de rendimiento, las operaciones que hacen una copia de una sección de la memoria en realidad no obtienen su propia copia a menos que realicen un cambio en esa memoria, momento en el que , usted rápidamente hace su copia, hace el cambio a eso y se lo devuelve. 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 la contabilidad en torno a 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 está marcada para poder escribirse antes de que realmente se copie: si dos subprocesos están trabajando muy cerca el uno del otro, la segunda puede aprovechar la marca grabable y escribir en la memoria original, no la copia.
La vulnerabilidad es que esto permite que un proceso se eleve a sí mismo al obtener acceso de escritura al propio entendimiento del kernel. El kernel sabe a 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 Copia en escritura, luego, utilizando este error de COW sucio, realmente pueden escribir la información del usuario en la copia del kernel. . Entonces escriben que el proceso se está ejecutando como root ... y luego pueden hacer cualquier cosa.
El programa de demostración lo utiliza para escribir en un archivo que solo se puede escribir por root, pero podría haber hecho literalmente cualquier cosa. La solución fue separar una nueva bandera que dice que están haciendo un CopyOnWrite, en lugar de usar la bandera de escritura para ambas.