linux memory linux-kernel

linux - Permisos de acceso de/dev/mem



memory linux-kernel (2)

  1. 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.

  2. CONFIG_STRICT_DEVMEM hace que el kernel verifique las direcciones en / dev / mem con devmem_is_allowed() en arch/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 :

  1. 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!

  2. Para evitar que los atacantes usen mal /dev/mem y alteren la memoria del kernel, se debe habilitar un indicador CONFIG_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é que CONFIG_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 cualquier Operation NOT Permitted error Operation 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?