linux - Permisos de acceso de/dev/mem
memory linux-kernel (2)
Sí, tienes razón, / dev / mem te permite asignar cualquier dirección física, incluida la IO asignada sin memoria RAM. Esto puede ser útil para que un hackeo rápido y sucio acceda a algún dispositivo de hardware sin escribir un controlador de kernel.
CONFIG_STRICT_DEVMEM hace que el kernel verifique las direcciones en / dev / mem con
devmem_is_allowed()
enarch/x86/mm/init.c
, y el comentario allí explica:* On x86, access has to be given to the first megabyte of ram because that area * contains bios code and data regions used by X and dosemu and similar apps. * Access has to be given to non-kernel-ram areas as well, these contain the PCI * mmio resources as well as potential bios/acpi data regions.
es muy probable que su dirección
0xFFFF0000
no sea RAM, ya que las BIOS normalmente ponen la memoria IO por debajo de los 4GB, por lo que puede mapearla incluso con STRICT_DEVMEM.
Tengo un conjunto de preguntas con respecto a /dev/mem
:
Muchos artículos en la red parecen referirse a
/dev/mem
como la puerta de entrada a"Physical RAM"
. Pero si estoy en lo cierto,/dev/mem
es la puerta de acceso al"Physical Address Space"
del procesador, que podría incluir registros de control de muchos periféricos de HW y no solo la RAM. ¡Por favor, corríjame si estoy equivocado!Para evitar que los atacantes usen mal
/dev/mem
y alteren la memoria del kernel, se debe habilitar un indicadorCONFIG_STRICT_DEVMEM
que evitará que las aplicaciones del usuario accedan al espacio de direcciones físicas más allá de 1 MB. Revisé el archivo de configuración en mi PC (Ubuntu) y encontré queCONFIG_STRICT_DEVMEM = y
. ¡Y escribí un programa que intenta leer en la memoria física más allá de 1 MB y pude leer! No hay falla de segmentación o cualquierOperation NOT Permitted
errorOperation NOT Permitted
. ¿Cómo es esto posible?
Mi programa se parece aproximadamente a esto:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
¿Qué hace el rendimiento de seguimiento?
cat /dev/mem | wc
Yo obtengo:
cat: /dev/mem: Operation not permitted
1908 11791 1048576
Así que para mí, se detiene en 1 MB.
Tenga en cuenta que cat usa open, no mmap, por lo que no es una prueba idéntica.
¿Estás seguro de que estás leyendo más allá de 1MB?