説明できない次の現象を観察しました。CAP_SYS_ADMIN
機能を追加した後は、unshare
書き込みができなくなります/proc/self/setgroups
。
実際にこのファイルに書き込む必要機能がありますが、これはユーザーの名前空間を変更することによって達成されます。なぜ次へ追加親プロセスの機能によってファイルの書き込みがブロックされますか?
me@myhost:~$ unshare -r
root@myhost:~# exit
logout
me@myhost:~$ sudo setcap cap_sys_admin=ep /usr/bin/unshare
me@myhost:~$ unshare -r
unshare: cannot open /proc/self/setgroups: Permission denied
me@myhost:~$ sudo setcap cap_sys_admin= /usr/bin/unshare
me@myhost:~$ unshare -r
root@myhost:~#
ちなみに:私はカーネルバージョン4.4とutil-linux(付属)バージョンunshare
2.27.1でUbuntu 16.04.4 LTSを実行しています。
答え1
ここで何が起こるのかは、「共有解除」プロセスにファイル書き込みsetgroups
(およびuid_maps
、)権限がないことです。gid_maps
外部ユーザーの名前空間。
その名前空間の擬似ファイルは/proc/<PID>
ルートによって所有されており、有効なuidがまだ自分のユーザーであるかのようにそのファイルに書き込む権限がありません。
たとえば、バックグラウンドでプロセスを実行し、実行中にファイルの権限を確認すると、sleep
それを簡単に視覚化できます(そしてまったく同じように動作します)。setgroups
uid_maps
gid_maps
まず、アドインなしでバイナリを使用します。
$ cp /usr/bin/sleep .
$ ./sleep 10 &
[1] 11209
$ ls -l /proc/11209/setgroups
-rw-r--r--. 1 myuser myuser 0 Jul 31 12:33 /proc/11209/setgroups
[1]+ Done ./sleep 10
$
次に、ここにいくつかのファイル機能を追加し、所有権の変更を見てみましょう。
$ sudo setcap cap_net_bind_service=ep sleep
$ ./sleep 10 &
[1] 11220
$ ls -l /proc/11220/setgroups
-rw-r--r--. 1 root root 0 Jul 31 12:34 /proc/11220/setgroups
[1]+ Done ./sleep 10
$
ファイルの所有権は、/proc/<PID>
Linuxカーネルの「dumpable」フラグによって制御されます。このフラグは、権限のあるプロセスで権限のないユーザーに情報が漏洩するのを防ぐために使用されます。
unshare
アドインを実行していますが、まだrootではないユーザーを使用していると思う場合効果的なuid、rootが所有するこれらの擬似ファイルへの書き込みアクセスは、オペレーティングシステムの一般的なアクセス制御によってブロックされます。
PR_GET_DUMPABLE
以下を使用して、「dumpable」フラグの値を確認できます。prctl(2)システムコール。
説明では、PR_SET_DUMPABLE
次のことも確認できます。
通常、このフラグは1に設定されます。ただし、
/proc/sys/fs/suid_dumpable
次の条件では、ファイルに含まれる現在の値(デフォルトは0)にリセットされます。[...]
- プロセスは
execve(2)
ファイル機能を持つプログラムを実行()します。capabilities(7)
)、しかし、取得した許容容量がプロセスですでに許容した容量を超える場合にのみ適用されます。
これがunshare
ファイル機能を備えたバイナリの場合です。
興味深いことに、rootが所有するsetuidバイナリを使用すると、unshare
この問題は発生しません。はい、「dumpable」フラグがクリアされ、その中のファイルは/proc/<PID>
ルートが所有するようになります。しかし、効果的なuidを考えると返品setuid バイナリを実行すると、root アクセスが許可されます。
unshare
この場合、特定の設定を処理できないロジックに関連する他の問題が発生します(おそらく、有効なuidと実際のuidの間の矛盾に関連しています)。
$ cp /usr/bin/unshare .
$ sudo setcap -r unshare
$ sudo chown root:root unshare
$ sudo chmod 4711 unshare
$ ./unshare -r
-bash: cannot set uid to 65534: effective uid 0: Invalid argument
-bash-4.4$
また、「ダンプ可能」フラグのクリアは、ファイル機能が設定されたバイナリを実行するとトリガーされます。他の方法でアドインを入手すると、この問題は発生しない可能性があります。たとえば、「環境」機能を使用することは、新しいユーザーネームスペースの共有をキャンセルするときに問題が発生することなく、ネームスペースの外側でアドインを取得するのに最適な方法です。
(残念ながら、まだ環境機能のためのツールはあまりありません。libcap
サポートは現在、ほとんどのディストリビューションで利用可能な最新のgitバージョン2.25でのみ利用可能です。capsh
かなり低いレベルなので、入手は簡単ではありません。ここ最新の環境機能の使用に関するcapsh
詳細が追加されました。私も試してみましたが、systemd-run
そこでも環境機能を実際に設定することはできませんでした。それにもかかわらず、機能、ルート以外のユーザー、およびユーザーの名前空間が必要な場合は、それらを調べる必要があります。 )