Autorisations d'accès de /dev / mem
j'ai une série de questions concernant /dev/mem
:
beaucoup d'articles sur le net, semblent se référer
/dev/mem
comme la passerelle vers"Physical RAM"
. Mais si je suis en droit,/dev/mem
à l'entrée de l'"Physical Address Space"
du processeur qui pourrait inclure des registres de contrôle de plusieurs périphériques HW et pas seulement de la RAM? S'il vous plaît, corrigez-moi si je me trompe!afin d'empêcher les pirates d'abuser
/dev/mem
et modifier la mémoire du noyau, un drapeauCONFIG_STRICT_DEVMEM
doit être activé, ce qui empêchera les applications utilisateur d'accéder à l'espace d'adresse physique au-delà de 1 Mo. J'ai vérifié le fichier de configuration sur mon PC (Ubuntu) et j'ai trouvé queCONFIG_STRICT_DEVMEM = y
. J'ai écrit un programme qui tente de lire à la mémoire physique au-delà de 1 MO et j'ai pu lire! Aucun défaut de segmentation ni aucunOperation NOT Permitted
erreur. Comment est-ce possible?
mon programme ressemble grossièrement à ceci:
fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);
2 réponses
Oui, vous avez raison, /dev/mem permet d'associer n'importe quelle adresse physique, y compris les non-RAM mémoire mappée IO. Cela peut être utile pour un piratage rapide et sale pour accéder à un périphérique matériel sans écrire un pilote de noyau.
CONFIG_STRICT_DEVMEM permet de vérifier les adresses du noyau dans /dev / mem avec
devmem_is_allowed()
arch/x86/mm/init.c
, et le commentaire explique:* 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.
votre adresse
0xFFFF0000
est très probablement non-RAM, car BIOSes typiquement mettre la mémoire IO juste en dessous de 4 Go, donc c'est pourquoi vous êtes en mesure de le mapper même avec STRICT_DEVMEM.
Quel est le suivi du rendement:
cat /dev/mem | wc
j'obtiens:
cat: /dev/mem: Operation not permitted
1908 11791 1048576
donc pour moi il s'arrête à 1MB.
notez que cat utilise Ouvert, pas mmap donc ce n'est pas un test identique.
Êtes-vous sûr de lire au-delà de 1MB?