Простір імен UTS
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Базова інформація
A UTS (UNIX Time-Sharing System) namespace is a Linux kernel feature that provides iізоляцію двох системних ідентифікаторів: the hostname and the NIS (Network Information Service) domain name. Ця ізоляція дозволяє кожному UTS простору імен мати власний незалежний hostname і NIS domain name, що особливо корисно в сценаріях контейнеризації, коли кожен контейнер має виглядати як окрема система зі своїм hostname.
Як це працює:
- Коли створюється новий UTS простір імен, він починається з копії hostname і NIS domain name з його батьківського простору імен. Це означає, що при створенні новий простір імен sділить ті ж ідентифікатори, що й батьківський. Однак будь-які наступні зміни hostname або NIS domain name в межах цього простору імен не вплинуть на інші простори імен.
- Процеси в межах UTS простору імен можуть змінювати hostname і NIS domain name за допомогою системних викликів
sethostname()таsetdomainname()відповідно. Ці зміни є локальними для простору імен і не впливають на інші простори імен або хост-систему. - Процеси можуть переміщуватися між просторами імен за допомогою системного виклику
setns()або створювати нові простори імен за допомогоюunshare()абоclone()з прапорцемCLONE_NEWUTS. Коли процес переходить у новий простір імен або створює його, він починає використовувати hostname і NIS domain name, пов’язані з тим простором імен.
Лабораторія:
Створення різних просторів імен
CLI
sudo unshare -u [--mount-proc] /bin/bash
Монтування нового екземпляра файлової системи /proc за допомогою параметра --mount-proc гарантує, що новий mount namespace має точний і ізольований вигляд інформації про процеси, специфічної для цього namespace.
Error: bash: fork: Cannot allocate memory
Коли unshare виконується без опції -f, виникає помилка через спосіб, яким Linux обробляє нові PID (Process ID) простори імен. Нижче наведено ключові деталі та рішення:
- Пояснення проблеми:
- Ядро Linux дозволяє процесу створювати нові простори імен за допомогою системного виклику
unshare. Однак процес, який ініціює створення нового PID-простору імен (званий процес “unshare”), не переходить у новий простір імен; у нього переходять тільки дочірні процеси. - Запуск %unshare -p /bin/bash% запускає
/bin/bashв тому ж процесі, що йunshare. Внаслідок цього/bin/bashта його дочірні процеси залишаються в оригінальному PID-просторі імен. - Перший дочірній процес
/bin/bashу новому просторі імен стає PID 1. Коли цей процес завершує роботу, це запускає очищення простору імен, якщо немає інших процесів, оскільки PID 1 має особливу роль приймання orphan processes. Ядро Linux тоді вимкне виділення PID у цьому просторі імен.
- Наслідок:
- Вихід PID 1 у новому просторі імен призводить до очищення прапорця
PIDNS_HASH_ADDING. Це спричиняє збій функціїalloc_pidпри виділенні нового PID під час створення процесу, що породжує помилку “Cannot allocate memory”.
- Рішення:
- Проблему можна вирішити, використавши опцію
-fзunshare. Ця опція змушуєunshareзробити fork нового процесу після створення нового 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
Перевірте, у якому namespace знаходиться ваш процес
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
Знайти всі простори імен UTS
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 namespace
nsenter -u TARGET_PID --pid /bin/bash
Зловживання спільним UTS хоста
Якщо контейнер запущено з --uts=host, він приєднується до UTS namespace хоста замість отримання ізольованого. Маючи можливості, такі як --cap-add SYS_ADMIN, код у контейнері може змінити hostname/NIS name хоста через sethostname()/setdomainname():
docker run --rm -it --uts=host --cap-add SYS_ADMIN alpine sh -c "hostname hacked-host && exec sh"
# Hostname on the host will immediately change to "hacked-host"
Зміна імені хоста може спотворити логи/оповіщення, заплутати виявлення кластера або зламати TLS/SSH конфігурації, які прив’язують перевірку до імені хоста.
Виявлення контейнерів, які ділять UTS з хостом
docker ps -aq | xargs -r docker inspect --format '{{.Id}} UTSMode={{.HostConfig.UTSMode}}'
# Shows "host" when the container uses the host UTS namespace
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


