Me pregunto si la función printk () es un problema de seguridad en Linux.
Esto depende de si hay o no printk()
llamadas que puedan imprimir punteros sin autorización. En general, los punteros se desinfectarán cuando kernel.kptr_restrict
no sea cero. Esto funciona porque el identificador de los punteros es %pK
, lo que los desinfecta de forma predeterminada. Sin embargo, parece que hay muchas situaciones en las que los errores dan como resultado una fuga accidental del puntero, por ejemplo, porque un valor se calcula a partir de un puntero y se imprime, o porque un error tipográfico hace que se use %pk
en su lugar, lo que no pasa. El mismo proceso de desinfección. Esto no es exclusivo de esta función e incluso puede ser como proc y sysfs también. Estos infoleaks no son raros.
Cuando un atacante tiene acceso de usuario al sistema, ¿le facilita la vida si tiene acceso a los punteros del kernel?
Pues sí y no. Lo peor que un atacante puede hacer * con los punteros del kernel es descubrir el desplazamiento de base del kernel para romper KASLR. Desafortunadamente, KASLR ya está bastante inútil contra los atacantes locales, como se ha demostrado en el tiempo y la hora otra vez (más a menudo por Brad Spengler). Puede ser derrotado a través de infoleaks como se mencionó anteriormente, o mediante una variedad de ataques de tiempo contra la mayoría de las arquitecturas de CPU.
Se puede deshabilitar fácilmente configurando CONFIG_PRINTK como indicador de configuración del kernel de Linux. ¿Debería hacerse en un sistema altamente seguro?
No. Hay una opción mejor. En lugar de deshabilitar la impresión, es un requisito tener altos privilegios para leer el búfer de registro del núcleo. Esto se puede hacer configurando kernel.dmesg_restrict
a 1. Esto protege de los punteros que no se desinfectan y se filtra en el syslog para que no estén disponibles para los atacantes, además de ocultar otra información potencialmente sensible que podría imprimirse allí.
* Esto solo es cierto para los núcleos comunes. Si compila su propio kernel, especialmente si usa RANDSTRUCT
, el conocimiento de los punteros se vuelve mucho más valioso ya que puede permitir la localización precisa desplazamiento real de las funciones sensibles del kernel.