mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
69 lines
6.8 KiB
Markdown
69 lines
6.8 KiB
Markdown
# UTS Namespace
|
||
|
||
{{#include ../../../../banners/hacktricks-training.md}}
|
||
|
||
## Basic Information
|
||
|
||
UTS (UNIX Time-Sharing System) простір імен є функцією ядра Linux, яка забезпечує **ізоляцію двох системних ідентифікаторів**: **ім'я хоста** та **NIS** (Network Information Service) доменне ім'я. Ця ізоляція дозволяє кожному UTS простору імен мати **своє власне незалежне ім'я хоста та NIS доменне ім'я**, що особливо корисно в сценаріях контейнеризації, де кожен контейнер повинен з'являтися як окрема система зі своїм ім'ям хоста.
|
||
|
||
### How it works:
|
||
|
||
1. Коли новий UTS простір імен створюється, він починає з **копії імені хоста та NIS доменного імені з його батьківського простору імен**. Це означає, що при створенні новий простір імен **ділить ті ж ідентифікатори, що й його батько**. Однак будь-які подальші зміни в імені хоста або NIS доменному імені в межах простору імен не вплинуть на інші простори імен.
|
||
2. Процеси в межах UTS простору імен **можуть змінювати ім'я хоста та NIS доменне ім'я** за допомогою системних викликів `sethostname()` та `setdomainname()`, відповідно. Ці зміни є локальними для простору імен і не впливають на інші простори імен або хост-систему.
|
||
3. Процеси можуть переміщатися між просторами імен за допомогою системного виклику `setns()` або створювати нові простори імен за допомогою системних викликів `unshare()` або `clone()` з прапором `CLONE_NEWUTS`. Коли процес переміщується в новий простір імен або створює його, він почне використовувати ім'я хоста та NIS доменне ім'я, пов'язані з цим простором імен.
|
||
|
||
## Lab:
|
||
|
||
### Create different Namespaces
|
||
|
||
#### CLI
|
||
```bash
|
||
sudo unshare -u [--mount-proc] /bin/bash
|
||
```
|
||
Монтування нової інстанції файлової системи `/proc`, якщо ви використовуєте параметр `--mount-proc`, забезпечує, що новий простір монтування має **точний та ізольований вигляд інформації про процеси, специфічної для цього простору**.
|
||
|
||
<details>
|
||
|
||
<summary>Помилка: bash: fork: Не вдається виділити пам'ять</summary>
|
||
|
||
Коли `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 у цьому просторі.
|
||
|
||
2. **Наслідок**:
|
||
|
||
- Завершення PID 1 у новому просторі призводить до очищення прапора `PIDNS_HASH_ADDING`. Це призводить до того, що функція `alloc_pid` не може виділити новий PID при створенні нового процесу, що викликає помилку "Не вдається виділити пам'ять".
|
||
|
||
3. **Рішення**:
|
||
- Проблему можна вирішити, використовуючи параметр `-f` з `unshare`. Цей параметр змушує `unshare` створити новий процес після створення нового PID простору.
|
||
- Виконання `%unshare -fp /bin/bash%` забезпечує, що команда `unshare` сама стає PID 1 у новому просторі. `/bin/bash` та його дочірні процеси тоді безпечно містяться в цьому новому просторі, запобігаючи передчасному завершенню PID 1 та дозволяючи нормальне виділення PID.
|
||
|
||
Забезпечуючи, що `unshare` виконується з прапором `-f`, новий PID простір правильно підтримується, що дозволяє `/bin/bash` та його підпроцесам працювати без виникнення помилки виділення пам'яті.
|
||
|
||
</details>
|
||
|
||
#### Docker
|
||
```bash
|
||
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
|
||
```
|
||
### Перевірте, в якому просторі імен знаходиться ваш процес
|
||
```bash
|
||
ls -l /proc/self/ns/uts
|
||
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
|
||
```
|
||
### Знайти всі UTS простори імен
|
||
```bash
|
||
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
|
||
# Find the processes with an specific namespace
|
||
sudo find /proc -maxdepth 3 -type l -name uts -exec ls -l {} \; 2>/dev/null | grep <ns-number>
|
||
```
|
||
### Увійти в UTS простір
|
||
```bash
|
||
nsenter -u TARGET_PID --pid /bin/bash
|
||
```
|
||
{{#include ../../../../banners/hacktricks-training.md}}
|