Problemas de seguridad en parches propuestos por un empleado de Huawei para proteger el kernel de Linux

Desarrolladores del proyecto Grsecurity dibujó atención a la presencia de una vulnerabilidad trivialmente explotable en el conjunto de parches HKSP (Huawei Kernel Self Protection), hace unos días propuesto para mejorar la seguridad del kernel de Linux. La situación recuerda caso con Samsung, en el que un intento de mejorar la seguridad del sistema provocó la aparición de una nueva vulnerabilidad y facilitó la posibilidad de comprometer dispositivos.

Los parches HKSP fueron publicados por un empleado de Huawei, incluyen una mención de Huawei en el perfil de GitHub y usan la palabra Huawei en el nombre del proyecto (HKSP - Huawei Kernel Self Protection). Al mismo tiempo, los representantes de Huawei negaron la conexión del proyecto HKSP con la empresa y afirmaron que el código fue desarrollado por iniciativa personal del empleado, no es un proyecto oficial de Huawei y no se utiliza en los productos de la empresa. En página de GitHub HKSP retroactivamente después del descubrimiento vulnerabilidades también fue añadido Tenga en cuenta que el proyecto se está desarrollando en mi tiempo libre con fines de investigación.

HKSP incluye cambios como la aleatorización de compensaciones en la estructura de crédito, protección contra ataques al espacio de nombres del identificador de usuario (espacio de nombres pid), separación de la pila de procesos del área mmap, detección de llamadas dobles a la función kfree, bloqueo de fugas a través del pseudo -FS /proc (/proc/ {módulos, claves, usuarios clave}, /proc/sys/kernel/* y /proc/sys/vm/mmap_min_addr, /proc/kallsyms), aleatorización de direcciones de espacio de usuario mejorada, Ptrace adicional protección, protección mejorada smap y smep, la capacidad de prohibir el envío de datos a través de sockets sin formato, bloquear direcciones incorrectas en sockets UDP y verificar la integridad de los procesos en ejecución. También incluye el módulo del kernel Ksguard, cuyo objetivo es detectar intentos de introducir rootkits típicos.

Parches causado Greg Kroah-Hartman, responsable de mantener la rama estable del kernel de Linux, mostró interés y pidió al autor que dividiera el parche monolítico en partes para simplificar la revisión y promoción al kernel principal. Kees Cook, director proyecto en promoción tecnología de protección activa en el kernel de Linux, también positivamente respondió a los parches y, entre los problemas, llamó la atención sobre la vinculación a la arquitectura x86 y la naturaleza de notificación de muchos modos, que solo registran información sobre el problema, pero no intentan bloquearlo.

Un estudio del parche realizado por los desarrolladores de Grsecurity reveló muchos errores y debilidades en el código, y también mostró la ausencia de un modelo de amenaza que les permitiera juzgar adecuadamente las capacidades del proyecto. Para demostrar claramente que el código se escribió sin utilizar métodos de programación seguros, se proporciona un ejemplo de una vulnerabilidad trivial en el controlador.
archivo /proc/ksguard/state, que se crea con los derechos 0777, lo que implica que todos tienen acceso de escritura. La función ksg_state_write, utilizada para analizar comandos escritos en /proc/ksguard/state, crea un búfer tmp[32] en el que se escriben los datos según el tamaño del operando pasado, sin tener en cuenta el tamaño del búfer de destino y sin comprobando el parámetro con el tamaño de la cadena. Aquellos. Para sobrescribir parte de la pila del kernel, un atacante sólo necesita escribir una línea con formato especial en /proc/ksguard/state.

estático ssize_t ksg_state_write(archivo de estructura *archivo, const char __user *buf,
tamaño_t longitud, loff_t *desplazamiento)
{
valor u64;
char tmp [32];
tamaño_t n = 0;

si (copiar_de_usuario(tmp, buf, len))
devuelve -1;

valor = simple_strtoul(tmp, '\0', 10);
...

Prototipo de explotación:

char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
si (fd >= 0) {
escribir(fd, buf, tamaño de(buf));
cerrar(fd);
}

Fuente: opennet.ru

Añadir un comentario