Un espace de noms IPC (Inter-Process Communication) est une fonctionnalité du noyau Linux qui fournit l'isolation des objets IPC System V, tels que les files de messages, les segments de mémoire partagée et les sémaphores. Cette isolation garantit que les processus dans différents espaces de noms IPC ne peuvent pas accéder directement ou modifier les objets IPC des autres, offrant ainsi une couche supplémentaire de sécurité et de confidentialité entre les groupes de processus.
Comment cela fonctionne :
Lorsqu'un nouvel espace de noms IPC est créé, il démarre avec un ensemble complètement isolé d'objets IPC System V. Cela signifie que les processus s'exécutant dans le nouvel espace de noms IPC ne peuvent pas accéder ou interférer avec les objets IPC des autres espaces de noms ou du système hôte par défaut.
Les objets IPC créés dans un espace de noms sont visibles et accessibles uniquement aux processus de cet espace de noms. Chaque objet IPC est identifié par une clé unique dans son espace de noms. Bien que la clé puisse être identique dans différents espaces de noms, les objets eux-mêmes sont isolés et ne peuvent pas être accessibles à travers les espaces de noms.
Les processus peuvent se déplacer entre les espaces de noms en utilisant l'appel système setns() ou créer de nouveaux espaces de noms en utilisant les appels système unshare() ou clone() avec le drapeau CLONE_NEWIPC. Lorsqu'un processus se déplace vers un nouvel espace de noms ou en crée un, il commencera à utiliser les objets IPC associés à cet espace de noms.
Laboratoire :
Créer différents espaces de noms
CLI
sudounshare-i [--mount-proc] /bin/bash
En montant une nouvelle instance du système de fichiers /proc en utilisant le paramètre --mount-proc, vous vous assurez que le nouveau namespace de montage a une vue précise et isolée des informations de processus spécifiques à ce namespace.
Erreur : bash: fork: Impossible d'allouer de la mémoire
Lorsque unshare est exécuté sans l'option -f, une erreur est rencontrée en raison de la manière dont Linux gère les nouveaux espaces de noms PID (Process ID). Les détails clés et la solution sont décrits ci-dessous :
Explication du Problème :
Le noyau Linux permet à un processus de créer de nouveaux espaces de noms en utilisant l'appel système unshare. Cependant, le processus qui initie la création d'un nouveau namespace PID (appelé processus "unshare") n'entre pas dans le nouveau namespace ; seuls ses processus enfants le font.
L'exécution de %unshare -p /bin/bash% démarre /bin/bash dans le même processus que unshare. Par conséquent, /bin/bash et ses processus enfants se trouvent dans le namespace PID d'origine.
Le premier processus enfant de /bin/bash dans le nouveau namespace devient le PID 1. Lorsque ce processus se termine, il déclenche le nettoyage du namespace s'il n'y a pas d'autres processus, car le PID 1 a le rôle spécial d'adopter les processus orphelins. Le noyau Linux désactive alors l'allocation de PID dans ce namespace.
Conséquence :
La sortie du PID 1 dans un nouveau namespace entraîne le nettoyage du drapeau PIDNS_HASH_ADDING. Cela entraîne l'échec de la fonction alloc_pid pour allouer un nouveau PID lors de la création d'un nouveau processus, produisant l'erreur "Impossible d'allouer de la mémoire".
Solution :
Le problème peut être résolu en utilisant l'option -f avec unshare. Cette option fait en sorte que unshare fork un nouveau processus après la création du nouveau namespace PID.
L'exécution de %unshare -fp /bin/bash% garantit que la commande unshare elle-même devient le PID 1 dans le nouveau namespace. /bin/bash et ses processus enfants sont alors en sécurité dans ce nouveau namespace, empêchant la sortie prématurée du PID 1 et permettant une allocation normale des PID.
En veillant à ce que unshare s'exécute avec le drapeau -f, le nouveau namespace PID est correctement maintenu, permettant à /bin/bash et à ses sous-processus de fonctionner sans rencontrer l'erreur d'allocation de mémoire.
sudofind/proc-maxdepth3-typel-nameipc-execreadlink{} \; 2>/dev/null|sort-u# Find the processes with an specific namespacesudofind/proc-maxdepth3-typel-nameipc-execls-l{} \; 2>/dev/null|grep<ns-number>
Entrer dans un espace de noms IPC
nsenter-iTARGET_PID--pid/bin/bash
De plus, vous ne pouvez entrer dans un autre espace de processus que si vous êtes root. Et vous ne pouvez pasentrer dans un autre espace sans un descripteur pointant vers celui-ci (comme /proc/self/ns/net).
Créer un objet IPC
# Containersudounshare-i/bin/bashipcmk-M100Sharedmemoryid:0ipcs-m------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0x2fba90210root6441000# From the hostipcs-m# Nothing is seen