Este proyecto es una simulación de un kernel de juguete desarrollado en Rust que implementa paginación interna y un shell de usuario basado en IPC. Su objetivo es demostrar conceptos fundamentales de gestión de memoria y vulnerabilidades de seguridad, específicamente simulando una desreferencia de apuntador nulo (Null Pointer Dereference) que permite el escalamiento de privilegios.
Nota sobre la arquitectura: El proyecto utiliza un kernel simulado con paginación interna. No existe un mapeo literal a la página cero del sistema operativo anfitrión. Todas las operaciones de memoria y exploits ocurren dentro de una arena aislada de 64KB de memoria física simulada.
La simulación consta de dos binarios que se comunican mediante Unix Domain Sockets (/tmp/rust_os_sim.sock):
- Kernel: El servicio de fondo que gestiona la MMU (Unidad de Manejo de Memoria) y las llamadas al sistema.
- User App: Un shell interactivo que permite al usuario mapear memoria, escribir datos y disparar syscalls.
Se requiere de tener Rust y Cargo instalados, posteriormente se puede compilar con:
cargo buildEl kernel debe iniciarse primero en su propia terminal. Acepta argumentos de CLI que definen las políticas de seguridad de la simulación.
cargo run --bin kernel -- [OPCIONES]--allow-page-zero- Descripción: Permite al usuario mapear lógicamente la dirección
0x0. - Impacto: Por defecto, los sistemas operativos modernos prohíben mapear la página cero para evitar exploits. Activar esta bandera desactiva esa protección en la simulación.
- Descripción: Permite al usuario mapear lógicamente la dirección
--vulnerable- Descripción: Habilita la llamada al sistema
SYS_VULN. - Impacto: Esta syscall contiene una falla simulada donde ejecuta o confía ciegamente en el payload ubicado en la memoria física correspondiente a la dirección lógica
0.
- Descripción: Habilita la llamada al sistema
Ejemplo: Iniciar un kernel inseguro (listo para el exploit)
cargo run --bin kernel -- --allow-page-zero --vulnerableCon el kernel ejecutándose, abrir una segunda terminal y ejecutar la aplicación de usuario:
cargo run --bin user_appSe pedirá un nombre de usuario para el login. Una vez dentro, aparece el prompt > donde se pueden usar los siguientes comandos:
mmap <addr>: Mapea una página lógica (ej.mmap 0x0).write <addr> <val>: Escribe un byte en una dirección (soporta hex, ej.write 0 0xCC).read <addr>: Lee un byte de la memoria lógica.su: Intenta escalar privilegios a root de forma convencional (fallará).echo_root <msg>: Envía un mensaje al log del kernel (solo para usuarios privilegiados).sys_vuln: Ejecuta la syscall vulnerable.exploit: Ejecuta la secuencia automatizada de ataque.exit: Cierra el shell.
El objetivo es obtener acceso de root aprovechando la desreferencia del apuntador nulo.
El kernel debe haberse iniciado con las protecciones desactivadas:
cargo run --bin kernel -- --vulnerable --allow-page-zeroLa syscall sys_vuln intenta leer una instrucción desde la dirección lógica 0, simulando un intento de lectura de un apuntador nulo.
Como el kernel permite mapear dicha página, un usuario puede inyectar un opcode de escalamiento (0xCC) en esa dirección y forzar al kernel a ejecutarlo con privilegios elevados.
En el shell de usuario, simplemente escribe:
> exploit
Para entender la mecánica, se puede realizar el ataque manualmente:
- Verificar que no eres root:
> echo_root hola [KERNEL] ERROR: Unauthorized> su [KERNEL] ERROR: Unauthorized. (PSW.mode == 0) - Mapear la dirección lógica 0:
> mmap 0 [KERNEL] OK: Mapped successfully - Inyectar el payload (
0xCC/204):> write 0 0xCC [KERNEL] OK: Write Successful - Ejecutar la syscall vulnerable:
> sys_vuln [KERNEL] OK: PRIVILEGE ESCALATION SUCCESSFUL - Confirmar acceso de root:
> echo_root Ahora tengo el control [KERNEL] OK: Message logged as root
El mensaje "Ahora tengo el control" se mostrará en la terminal que está ejecutando el kernel, simulando que el usuario ha logrado escribir en un búfer accesible solo a usuarios privilegiados.