PID Namespace

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Основна інформація

Простір імен PID (ідентифікатор процесу) - це функція в ядрі Linux, яка забезпечує ізоляцію процесів, дозволяючи групі процесів мати власний набір унікальних PID, відокремлений від PID в інших просторах імен. Це особливо корисно в контейнеризації, де ізоляція процесів є важливою для безпеки та управління ресурсами.

Коли створюється новий простір імен PID, перший процес в цьому просторі імен призначається PID 1. Цей процес стає процесом "init" нового простору імен і відповідає за управління іншими процесами в межах простору імен. Кожен наступний процес, створений в межах простору імен, матиме унікальний PID в цьому просторі імен, і ці PID будуть незалежними від PID в інших просторах імен.

З точки зору процесу в межах простору імен PID, він може бачити лише інші процеси в тому ж просторі імен. Він не відомий процесам в інших просторах імен, і він не може взаємодіяти з ними за допомогою традиційних засобів управління процесами (наприклад, kill, wait і т. д.). Це забезпечує рівень ізоляції, який допомагає запобігти взаємодії процесів один з одним.

Як це працює:

  1. Коли створюється новий процес (наприклад, за допомогою системного виклику clone()), процес може бути призначений для нового або існуючого простору імен PID. Якщо створюється новий простір імен, процес стає процесом "init" цього простору імен.

  2. Ядро підтримує відображення між PID в новому просторі імен та відповідними PID в батьківському просторі імен (тобто просторі імен, з якого було створено новий простір імен). Це відображення дозволяє ядру перекладати PID за необхідності, наприклад, при відправці сигналів між процесами в різних просторах імен.

  3. Процеси в межах простору імен PID можуть бачити та взаємодіяти лише з іншими процесами в тому ж просторі імен. Вони не відомі процесам в інших просторах імен, і їх PID унікальні в межах їх простору імен.

  4. Коли простір імен PID знищується (наприклад, коли процес "init" простору імен виходить), всі процеси в цьому просторі імен припиняються. Це забезпечує правильне очищення всіх ресурсів, пов'язаних з простором імен.

Лабораторія:

Створення різних просторів імен

CLI

sudo unshare -pf --mount-proc /bin/bash
Помилка: bash: fork: Неможливо виділити пам'ять

Коли unshare виконується без опції -f, виникає помилка через те, як Linux обробляє нові простори імен PID (ідентифікаторів процесів). Основні деталі та рішення наведено нижче:

  1. Пояснення проблеми:

  • Ядро Linux дозволяє процесу створювати нові простори імен за допомогою системного виклику unshare. Однак процес, який ініціює створення нового простору імен PID (називається "процесом unshare"), не входить в новий простір імен; лише його дочірні процеси.

  • Виконання %unshare -p /bin/bash% запускає /bin/bash в тому ж процесі, що й unshare. В результаті /bin/bash та його дочірні процеси знаходяться в початковому просторі імен PID.

  • Перший дочірній процес /bin/bash в новому просторі імен стає PID 1. Коли цей процес завершується, він спричиняє очищення простору імен, якщо інших процесів немає, оскільки PID 1 має спеціальну роль у прийнятті сирітських процесів. Після цього ядро Linux вимикає виділення PID в цьому просторі імен.

  1. Наслідки:

  • Вихід PID 1 в новому просторі імен призводить до очищення прапорця PIDNS_HASH_ADDING. Це призводить до невдалого виділення PID під час створення нового процесу, що призводить до помилки "Неможливо виділити пам'ять".

  1. Рішення:

  • Проблему можна вирішити, використовуючи опцію -f з unshare. Ця опція змушує unshare розгалужувати новий процес після створення нового простору імен PID.

  • Виконання %unshare -fp /bin/bash% забезпечує, що сама команда unshare стає PID 1 в новому просторі імен. /bin/bash та його дочірні процеси потім безпечно знаходяться в цьому новому просторі імен, запобігаючи передчасному виходу PID 1 та дозволяючи нормальне виділення PID.

Забезпечуючи, що unshare працює з прапорцем -f, новий простір імен PID правильно підтримується, що дозволяє /bin/bash та його підпроцесам працювати без зустрічі помилки виділення пам'яті.

Монтуванням нового екземпляру файлової системи /proc, якщо використовуєте параметр --mount-proc, ви забезпечуєте, що новий простір монтування має точний та ізольований вид інформації про процеси, специфічні для цього простору імен.

Docker

docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Перевірте, в якому просторі імен знаходиться ваш процес

ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr  3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'

Знайдіть всі простори імен PID

sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u

Зверніть увагу, що користувач root з початкового (типового) простору імен PID може бачити всі процеси, навіть ті, що знаходяться в нових просторах імен PID, тому ми можемо бачити всі простори імен PID.

Увійдіть всередину простору імен PID

nsenter -t TARGET_PID --pid /bin/bash

Коли ви входите в простір імен PID зі стандартного простору імен, ви все ще зможете бачити всі процеси. І процес з того PID ns зможе бачити новий bash в PID ns.

Також, ви можете увійти в інший простір імен PID процесу лише як root. І ви не можете увійти в інший простір імен без дескриптора, що вказує на нього (наприклад, /proc/self/ns/pid)

Посилання

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated