Recientemente he estado leyendo acerca de las implicaciones de las referencias erróneas de punteros NULL en el código del kernel (a menudo LKMs / modules), específicamente escalando privilegios a la raíz a través de mmap()
ing la página NULL y luego memcpy()
ing algún código shell que llama commit_creds(prepare_kernels_cred(0));
(o cualquier otra cosa) de user-land para hacer que el código posterior se ejecute en el contexto del usuario root (generalmente para generar un shell de root). Este fue un método de explotación muy popular hace alrededor de una década.
Se introdujo una mitigación, mmap_min_addr
, que previene mmap()
de páginas bajas, y la gente (por supuesto) encontró formas de evitarla (los artículos que leí eran todos en 2009). Sin embargo, no hay (aparentemente) ningún método (conocido o público) para eludir esta mitigación (y, por supuesto, otro endurecimiento del kernel hace que los errores de corrupción de memoria se vuelvan más difíciles o completamente inviables).
Dado esto, ¿qué tan perjudiciales son las desreferencias de puntero NULL en la actualidad? Parece que lo mejor que se puede aprovechar es la denegación de servicio (en un kernel moderno con mmap_min_addr
habilitado [quizás descuidando ASLR, DEP / NX, SELinux / AppArmor / PaX / grsec, etc.]). ¿Es posible aprovechar la escalada de privilegios en entornos particulares? (Excluyendo la desactivación de mmap_min_addr
, por supuesto). Y si es así, ¿cuáles son algunos ejemplos?