User Namespace

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

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

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

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

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

Як це працює:

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

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

  3. У межах простору користувача процеси можуть мати повні привілеї root (UID 0) для операцій всередині простору, при цьому вони все ще мають обмежені привілеї поза простором. Це дозволяє контейнерам працювати з можливостями, схожими на root всередині власного простору, не маючи повних привілеїв root на системі-хості.

  4. Процеси можуть переміщатися між просторами за допомогою системного виклику setns() або створювати нові простори за допомогою системних викликів unshare() або clone() з прапорцем CLONE_NEWUSER. Коли процес переходить до нового простору або створює його, він починає використовувати відображення ідентифікаторів користувача та групи, що пов'язані з цим простором.

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

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

CLI

sudo unshare -U [--mount-proc] /bin/bash

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

Помилка: 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 та його дочірнім процесам працювати без помилки виділення пам'яті.

Docker

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

Для використання простору імен користувача потрібно запустити демон Docker з --userns-remap=default (у Ubuntu 14.04 це можна зробити, змінивши /etc/default/docker і потім виконавши sudo service docker restart)

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

ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr  4 20:57 /proc/self/ns/user -> 'user:[4026531837]'

Можливо перевірити карту користувача з контейнера Docker за допомогою:

cat /proc/self/uid_map
0          0 4294967295  --> Root is root in host
0     231072      65536  --> Root is 231072 userid in host

Або з хост-системи за допомогою:

cat /proc/<pid>/uid_map

Знайдіть всі простори користувачів

sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name user -exec ls -l  {} \; 2>/dev/null | grep <ns-number>
nsenter -U TARGET_PID --pid /bin/bash

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

Створення нового простору імен користувача (з відображеннями)

unshare -U [--map-user=<uid>|<name>] [--map-group=<gid>|<name>] [--map-root-user] [--map-current-user]
# Container
sudo unshare -U /bin/bash
nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody

# From the host
ps -ef | grep bash # The user inside the host is still root, not nobody
root       27756   27755  0 21:11 pts/10   00:00:00 /bin/bash

Відновлення можливостей

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

Наприклад, якщо у вас є можливість CAP_SYS_ADMIN у просторі користувача, ви можете виконувати операції, які зазвичай вимагають цієї можливості, наприклад монтування файлових систем, але тільки в контексті вашого простору користувача. Будь-які операції, які ви виконуєте з цією можливістю, не впливатимуть на систему хоста або інші простори.

Отже, навіть якщо отримання нового процесу всередині нового простору користувача поверне вам всі можливості (CapEff: 000001ffffffffff), ви фактично можете використовувати лише ті, що стосуються простору (наприклад, монтування), але не всі. Таким чином, цього самого недостатньо для виходу з контейнера Docker.

```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash

Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error

## Посилання
* [https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory](https://stackoverflow.com/questions/44666700/unshare-pid-bin-bash-fork-cannot-allocate-memory)

<details>

<summary><strong>Вивчайте хакінг AWS від нуля до героя з</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>

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

* Якщо ви хочете побачити свою **компанію рекламовану в HackTricks** або **завантажити HackTricks у форматі PDF**, перевірте [**ПЛАНИ ПІДПИСКИ**](https://github.com/sponsors/carlospolop)!
* Отримайте [**офіційний PEASS & HackTricks мерч**](https://peass.creator-spring.com)
* Відкрийте для себе [**Сім'ю PEASS**](https://opensea.io/collection/the-peass-family), нашу колекцію ексклюзивних [**NFT**](https://opensea.io/collection/the-peass-family)
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи telegram**](https://t.me/peass) або **слідкуйте** за нами на **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Поділіться своїми хакерськими трюками, надсилайте PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) **і** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **репозиторіїв на GitHub**.

</details>

Last updated