Comment mmap ' ing / dev / mem fonctionne-t-il même si vous êtes en mode non privilégié?
On février 9, 2021 by adminPour autant que je sache, les programmes de lespace utilisateur sexécutent en mode non privilégié, et nont donc pas daccès direct à la mémoire ou aux E / S.
Alors, comment pouvons-nous accéder directement à la mémoire ou aux emplacements dE / S lorsque nous mmap / dev / mem dans des programmes despace utilisateur?
Par exemple:
int fd = 0; u8 leds = 0; fd = open("/dev/mem", O_RDWR|O_SYNC); leds = (u8 *)mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x80840000);
Il sagit dun hack très couramment utilisé dans les appareils embarqués.
Désormais, la variable leds
peut être utilisée à la volée pour accéder tout périphérique qui pourrait être présent à 0x80840000.
Nous nutiliserons plus aucun appel système pour accéder à cette adresse.
Même quelque chose comme
leds[0x20] = val;
fonctionnerait.
Mais les opérations privilégiées, telles que la lecture / écriture directement vers / depuis une adresse dE / S ne devraient être possibles quen mettant le processeur en mode privilégié via un appel système.
Source .
Commentaires
Réponse
Autoriser laccès à /dev/mem
par des processus non privilégiés serait en effet un problème de sécurité et ne devrait pas être autorisé.
Sur mon système, ls -l /dev/mem
ressemble à ceci:
crw-r----- 1 root kmem 1, 1 Sep 8 10:12 /dev/mem
Pour que root
puisse le lire et lécrire, les membres du kmem
group (dont il se trouve quil ny en a pas) peut le lire mais pas lécrire, et tout le monde ne peut pas louvrir du tout. Cela devrait donc être sécurisé.
Si votre /dev/mem
ressemble au mien, votre processus non privilégié naurait même pas du tout pu ouvrir le fichier, encore moins mmap
it.
Vérifiez les autorisations de /dev/mem
sur votre système pour vous assurer quelles sont sécurisées!
Commentaires
- Mais en supposant que je fais cela en tant que root … Cela signifie-t-il quun processus exécuté par root obtient le noyau privilèges daccès de niveau?
- Eh bien, si vous ' faites cela en tant que root, vous avez accès à tout. Je ' ne sais pas ce que vous entendez par " privilèges daccès au niveau du noyau ", mais root peut certainement faire tout ce quil veut, dune manière ou dune autre (en particulier, par exemple, en créant et en chargeant dynamiquement un nouveau module de noyau).
- Oui, cela ' est correct: lorsque vous mappez un fichier, vous pouvez ensuite lire & écrire le fichier sans utiliser dappels ststem. Cela ' est vrai que vous ' mappé un fichier disque normal ou un périphérique spécial comme
/dev/mem
. Si vous préférez, vous pouvez ouvrir/dev/mem
et lancer des appels systèmesread()
etwrite()
. Vous n’enverriez pas d’E / S sans l’utilisation d’appels système. Le résultat final est le même, mais si vous avez beaucoup de petites E / S à faire,mmap()
et laccès direct fonctionneront probablement mieux, en particulier parce que vous ne ' t besoin dappels système! Ceci est vrai aussi pour les fichiers normaux! - @ Stark07 Je pense que vous ' avez manqué le point. Les
mmap
(et/dev/mem
) eux-mêmes ne fournissent PAS un accès direct au mémoire système, et il est impossible de le faire dans Ring 4. Ce quil fait à la place, cest simplement mapper un fichier (ou une ressource) à une adresse virtuelle spécifique dans le processus appelant, tout comme ce qui se passe lorsquun programme est chargé /exec
ed (dans ce cas, limage du programme estmmap
éditée dans la mémoire virtuelle). - TL; DR Un processus non privilégié na pas un accès direct aux ressources système, mais peut le faire lorsque ces ressources sont mappées à leur espace dadressage virtuel . Il ny a ' aucune différence entre accéder à sa pile / tas / rodata / que ce soit et accéder à la mémoire du noyau – Ils finissent par accéder tous les deux à la mémoire physique réelle, alors que ce dernier cas se trouve juste sous le programme ' s control.
Answer
Les adresses visibles à un processus utilisateur (quil soit exécuté en tant que root ou en tant quutilisateur sans privilège) sont des adresses virtuelles, qui sont mappées aux adresses physiques par la MMU via les tables de pages. La configuration des tables de pages est une opération privilégiée, et ne peut être effectuée que par le code du noyau; cependant, une fois les tables de pages définies, laccès à la mémoire est autorisé en mode utilisateur.
Concrètement, votre code utilise mmap
pour demander au noyau de configurer le tables de pages pour permettre laccès à une plage donnée de mémoire physique. Le noyau vérifie les privilèges du processus (il a un accès en lecture / écriture à /dev/mem
) et configure les tables de pages pour lui permettre daccéder à la mémoire physique.
Réponse
La valeur de leds
est une adresse virtuelle. Tant quelle est dans lespace utilisateur du processus en cours, le processus peut y accéder directement via des instructions telles que leds[0] = val
sans avoir à être en mode privilégié, peu importe où dans la RAM cette adresse virtuelle est mappée
*
dans la déclaration deleds
, mais que ' est juste du code, aucune preuve que cela fonctionne réellement en tant quutilisateur non privilégié; dans mon expérience (limitée), tout fonctionne en tant que root sur périphériques intégrés.root
a de nombreux privilèges, parmi lesquels le fait dêtre autorisé à remplacer les autorisations du système de fichiers. Certains " fichiers " sont en réalité un accès aux périphériques (comme le disque ou la mémoire), qui sont interdits aux utilisateurs normaux. Pasroot
. Maisroot
fonctionne dans l espace utilisateur , donc il ne ' pas profiter de tous les privilèges du mode système (exécuter des instructions privilégiées, principalement).