7.5 KiB
IPC Namespace
{{#include ../../../../banners/hacktricks-training.md}}
Основна інформація
IPC (Міжпроцесна комунікація) namespace - це функція ядра Linux, яка забезпечує ізоляцію об'єктів System V IPC, таких як черги повідомлень, сегменти спільної пам'яті та семафори. Ця ізоляція гарантує, що процеси в різних IPC namespaces не можуть безпосередньо отримувати доступ або змінювати об'єкти IPC один одного, забезпечуючи додатковий рівень безпеки та конфіденційності між групами процесів.
Як це працює:
- Коли створюється новий IPC namespace, він починається з повністю ізольованого набору об'єктів System V IPC. Це означає, що процеси, що працюють у новому IPC namespace, не можуть отримати доступ або втручатися в об'єкти IPC в інших namespaces або в хост-системі за замовчуванням.
- Об'єкти IPC, створені в межах namespace, видимі та доступні лише для процесів у цьому namespace. Кожен об'єкт IPC ідентифікується унікальним ключем у своєму namespace. Хоча ключ може бути ідентичним у різних namespaces, самі об'єкти ізольовані і не можуть бути доступні між namespaces.
- Процеси можуть переміщатися між namespaces, використовуючи системний виклик
setns(), або створювати нові namespaces, використовуючи системні викликиunshare()абоclone()з прапоромCLONE_NEWIPC. Коли процес переміщується в новий namespace або створює його, він почне використовувати об'єкти IPC, пов'язані з цим namespace.
Лабораторія:
Створити різні Namespaces
CLI
sudo unshare -i [--mount-proc] /bin/bash
Монтування нової інстанції файлової системи /proc, якщо ви використовуєте параметр --mount-proc, забезпечує, що новий простір монтування має точний та ізольований вигляд інформації про процеси, специфічної для цього простору.
Помилка: bash: fork: Не вдалося виділити пам'ять
Коли unshare виконується без параметра -f, виникає помилка через те, як Linux обробляє нові PID (ідентифікатори процесів) простори. Основні деталі та рішення наведені нижче:
- Пояснення проблеми:
- Ядро Linux дозволяє процесу створювати нові простори за допомогою системного виклику
unshare. Однак процес, який ініціює створення нового PID простору (який називається "процесом unshare"), не входить до нового простору; лише його дочірні процеси входять. - Виконання
%unshare -p /bin/bash%запускає/bin/bashв тому ж процесі, що йunshare. Відповідно,/bin/bashта його дочірні процеси знаходяться в оригінальному PID просторі. - Перший дочірній процес
/bin/bashу новому просторі стає PID 1. Коли цей процес завершується, це викликає очищення простору, якщо немає інших процесів, оскільки PID 1 має особливу роль усиновлення сирітських процесів. Ядро Linux тоді вимкне виділення PID у цьому просторі.
- Наслідок:
- Завершення PID 1 у новому просторі призводить до очищення прапора
PIDNS_HASH_ADDING. Це призводить до того, що функціяalloc_pidне може виділити новий PID при створенні нового процесу, що викликає помилку "Не вдалося виділити пам'ять".
- Рішення:
- Проблему можна вирішити, використовуючи параметр
-fзunshare. Цей параметр змушуєunshareстворити новий процес після створення нового PID простору. - Виконання
%unshare -fp /bin/bash%забезпечує, що командаunshareсама стає PID 1 у новому просторі./bin/bashта його дочірні процеси тоді безпечно містяться в цьому новому просторі, запобігаючи передчасному завершенню PID 1 та дозволяючи нормальне виділення PID.
Забезпечивши, що unshare виконується з прапором -f, новий PID простір правильно підтримується, що дозволяє /bin/bash та його підпроцесам працювати без виникнення помилки виділення пам'яті.
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
Перевірте, в якому просторі імен знаходиться ваш процес
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
Знайти всі IPC простори імен
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
Увійти в IPC простір
nsenter -i TARGET_PID --pid /bin/bash
Також ви можете входити в інший простір процесів лише якщо ви є root. І ви не можете входити в інший простір без дескриптора, що вказує на нього (наприклад, /proc/self/ns/net).
Створити об'єкт IPC
# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x2fba9021 0 root 644 100 0
# From the host
ipcs -m # Nothing is seen
Посилання
{{#include ../../../../banners/hacktricks-training.md}}