UTS Namespace

Support HackTricks

基本情報

UTS(UNIX Time-Sharing System)名前空間は、ホスト名NIS(Network Information Service)ドメイン名の2つのシステム識別子の隔離を提供するLinuxカーネルの機能です。この隔離により、各UTS名前空間は独自のホスト名とNISドメイン名を持つことができ、特に各コンテナが独自のホスト名を持つ別々のシステムとして表示されるべきコンテナ化シナリオで便利です。

仕組み:

  1. 新しいUTS名前空間が作成されると、親名前空間からホスト名とNISドメイン名のコピーで始まります。これは、作成時に新しい名前空間が親と同じ識別子を共有することを意味します。ただし、名前空間内でのホスト名やNISドメイン名へのその後の変更は、他の名前空間には影響しません。

  2. UTS名前空間内のプロセスは、sethostname()およびsetdomainname()システムコールを使用して、それぞれホスト名とNISドメイン名を変更することができます。これらの変更は名前空間にローカルであり、他の名前空間やホストシステムには影響しません。

  3. プロセスは、setns()システムコールを使用して名前空間間を移動したり、unshare()またはclone()システムコールをCLONE_NEWUTSフラグと共に使用して新しい名前空間を作成したりできます。プロセスが新しい名前空間に移動するか、新しい名前空間を作成すると、その名前空間に関連付けられたホスト名とNISドメイン名を使用し始めます。

ラボ:

異なる名前空間を作成する

CLI

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

新しいインスタンスの /proc ファイルシステムを --mount-proc パラメータを使用してマウントすることで、新しいマウントネームスペースがそのネームスペースに特有のプロセス情報の正確で孤立したビューを持つことを保証します。

エラー: bash: fork: メモリを割り当てることができません

unshare-f オプションなしで実行されると、Linux が新しい PID (プロセス ID) ネームスペースを処理する方法のためにエラーが発生します。重要な詳細と解決策は以下の通りです:

  1. 問題の説明:

  • Linux カーネルは、プロセスが unshare システムコールを使用して新しいネームスペースを作成することを許可します。しかし、新しい PID ネームスペースの作成を開始するプロセス(「unshare」プロセスと呼ばれる)は新しいネームスペースに入らず、その子プロセスのみが入ります。

  • %unshare -p /bin/bash% を実行すると、unshare と同じプロセスで /bin/bash が開始されます。その結果、/bin/bash とその子プロセスは元の PID ネームスペースに存在します。

  • 新しいネームスペース内の /bin/bash の最初の子プロセスは PID 1 になります。このプロセスが終了すると、他にプロセスがない場合、PID 1 が孤児プロセスを引き取る特別な役割を持っているため、ネームスペースのクリーンアップがトリガーされます。Linux カーネルはそのネームスペースでの PID 割り当てを無効にします。

  1. 結果:

  • 新しいネームスペース内の PID 1 の終了は PIDNS_HASH_ADDING フラグのクリーンアップを引き起こします。これにより、新しいプロセスを作成する際に alloc_pid 関数が新しい PID を割り当てることに失敗し、「メモリを割り当てることができません」というエラーが発生します。

  1. 解決策:

  • この問題は、unshare-f オプションを使用することで解決できます。このオプションは、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/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名前空間に入る


<div data-gb-custom-block data-tag="hint" data-style='success'>

Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)

<details>

<summary>Support HackTricks</summary>

* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

</details>

</div>

Last updated