Refuser l’access à la mémoire partagée à partir de processus non binarys

Je dois créer un segment de mémoire partagée contenant des données secrètes. J’utilise les fonctions shmget et shmat pour accéder au segment avec les droits 0600 . Je veux partager ce segment de mémoire uniquement avec des processus fourchus. J’ai essayé de créer une autre application qui tentait d’accéder à ce segment, mais celle-ci a échoué. Il semble donc fonctionner comme je le souhaite.

Mais quand je lance l’application qui a créé le segment à nouveau, il peut accéder au segment. Comment est-ce possible? Est-ce une bonne idée de stocker des données secrètes dans la mémoire partagée?

Vous pouvez mmap() partager et région de mémoire anonyme en fournissant des MAP_SHARED et MAP_ANONYMOUS dans le processus parent. Cette mémoire sera accessible uniquement à ce processus et à ses enfants. Comme le segment de mémoire est anonyme, aucun autre processus ne pourra s’y référer, et encore moins accéder / mapper:

 void *shared_mem = mmap(NULL, n_bytes, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); 

Le processus parent doit créer un segment de mémoire partagée en utilisant mmap() . Ce segment de mémoire est hérité par tout processus enfant créé par fork() . Processus enfant peut simplement utiliser le pointeur shared_mem hérité de parent pour faire référence à ce segment de mémoire:

 #include  #include  #include  int main() { void *shared_mem = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0); pid_t pid = fork(); if (pid > 0) { // parent // use shared_mem here } else if (pid == 0) { // child // use shared_mem here } else { // error } return 0; } 

Le seg partagé n’appartient pas à un processus, il appartient à un utilisateur. Effectivement, les parameters 0600 n’autorisent cet utilisateur que pour RW (et root), mais tout autre processus s’exécutant comme cet utilisateur aura le même access.

Créez un utilisateur spécifique, à “utiliser” (connecté) uniquement à cette fin.

Est-ce une bonne idée d’avoir des données secrètes dans un segment de mémoire partagée?

Considérez le segment comme un fichier – peut-être un peu moins facile d’access (besoin de connaître la CIB) – sauf qu’il disparaîtra lorsque le système sera arrêté.

Est-ce une bonne idée de stocker des secrets dans un fichier? Peut-être pas si les données sont en texte clair.

Dans un fichier ou dans un segment de mémoire partagé, le cryptage des données serait une amélioration.

Voir cette page pour des explications détaillées sur la façon dont vous pouvez contrôler un segment shmem.


OTOH si ce dont vous avez besoin est seulement d’avoir un processus d’échange d’informations avec ses enfants, voyez les processus en cours . Dans ce cas, les données secrètes sont stockées dans la mémoire de stack / stack des processus et sont plus difficiles à atteindre par les processus externes appartenant au même utilisateur. Mais l’utilisateur “propriétaire” du processus peut également lire une mémoire de processus (via un core dump par exemple) et rechercher les données secrètes. Beaucoup moins facile, mais toujours possible.

Notez que dans ce cas, si les données secrètes sont disponibles dans le processus parent avant l’exécution de fork() , les enfants en hériteront automatiquement.

Encore une fois, pensez au cryptage.