13 KiB
Docker --privileged
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricks swagを手に入れましょう。
- 💬 Discordグループまたはtelegramグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- **ハッキングのトリックを共有するには、hacktricks repoとhacktricks-cloud repo**にPRを提出してください。
影響
特権付きコンテナを実行すると、次の保護が無効になります:
/devのマウント
特権付きコンテナでは、すべてのデバイスに/dev/
でアクセスできます。したがって、ホストのディスクをマウントすることで脱出することができます。
{% tabs %} {% tab title="デフォルトのコンテナ内部" %}
# docker run --rm -it alpine sh
ls /dev
console fd mqueue ptmx random stderr stdout urandom
core full null pts shm stdin tty zero
{% tab title="特権コンテナ内部" %}
# docker run --rm --privileged -it alpine sh
ls /dev
cachefiles mapper port shm tty24 tty44 tty7
console mem psaux stderr tty25 tty45 tty8
core mqueue ptmx stdin tty26 tty46 tty9
cpu nbd0 pts stdout tty27 tty47 ttyS0
[...]
{% endtab %} {% endtabs %}
読み取り専用のカーネルファイルシステム
カーネルファイルシステムは、プロセスがカーネルの実行方法を変更するメカニズムを提供します。デフォルトでは、コンテナプロセスがカーネルを変更することは望ましくありませんので、コンテナ内でカーネルファイルシステムを読み取り専用でマウントします。
{% tabs %} {% tab title="デフォルトのコンテナ内部" %}
# docker run --rm -it alpine sh
mount | grep '(ro'
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
cpuset on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cpu on /sys/fs/cgroup/cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpu)
cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct)
{% tab title="特権コンテナ内部" %}
# docker run --rm --privileged -it alpine sh
mount | grep '(ro'
{% endtab %} {% endtabs %}
カーネルファイルシステムのマスキング
/procファイルシステムはネームスペースに対応しており、特定の書き込みが許可されるため、読み取り専用でマウントされません。ただし、/procファイルシステムの特定のディレクトリは、書き込みから保護される必要があり、一部の場合は読み取りからも保護される必要があります。これらの場合、コンテナエンジンは潜在的に危険なディレクトリに対してtmpfsファイルシステムをマウントし、コンテナ内のプロセスがそれらを使用できないようにします。
{% hint style="info" %} tmpfsは、すべてのファイルを仮想メモリに格納するファイルシステムです。tmpfsはハードドライブにファイルを作成しません。したがって、tmpfsファイルシステムをアンマウントすると、それに存在するすべてのファイルが永久に失われます。 {% endhint %}
{% tabs %} {% tab title="デフォルトのコンテナ内部" %}
# docker run --rm -it alpine sh
mount | grep /proc.*tmpfs
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,size=65536k,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
{% tab title="特権コンテナ内部" %}
# docker run --rm --privileged -it alpine sh
mount | grep /proc.*tmpfs
{% endtab %} {% endtabs %}
Linuxの機能
コンテナエンジンは、デフォルトではコンテナ内で何が行われるかを制御するために、制限された数の機能でコンテナを起動します。特権の場合は、すべての機能にアクセスできます。機能については、以下を参照してください。
{% content-ref url="../linux-capabilities.md" %} linux-capabilities.md {% endcontent-ref %}
{% tabs %} {% tab title="デフォルトのコンテナ内部" %}
# docker run --rm -it alpine sh
apk add -U libcap; capsh --print
[...]
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
[...]
{% tab title="特権コンテナ内部" %}
# docker run --rm --privileged -it alpine sh
apk add -U libcap; capsh --print
[...]
Current: =eip cap_perfmon,cap_bpf,cap_checkpoint_restore-eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read
[...]
{% endtab %} {% endtabs %}
--privileged
mode gives all capabilities to the container, but it is not recommended for security reasons. Instead, you can use the --cap-add
flag to add specific capabilities to the container and the --cap-drop
flag to remove specific capabilities.
Seccomp
Seccompは、コンテナが呼び出すことができるシスコールを制限するために役立ちます。Dockerコンテナを実行すると、デフォルトのSeccompプロファイルが有効になりますが、特権モードでは無効になります。Seccompについて詳しくはこちらを参照してください:
{% content-ref url="seccomp.md" %} seccomp.md {% endcontent-ref %}
{% tabs %} {% tab title="デフォルトのコンテナ内部" %}
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 2
Seccomp_filters: 1
{% tab title="特権コンテナ内部" %}
# docker run --rm --privileged -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 0
Seccomp_filters: 0
{% endtab %} {% endtabs %}
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
また、Docker(または他のCRIs)がKubernetesクラスターで使用される場合、seccompフィルターはデフォルトで無効になっていることに注意してください。
AppArmor
AppArmorは、コンテナを制限された一部のリソースとプログラムごとのプロファイルに制約するためのカーネルの拡張機能です。--privileged
フラグを使用して実行すると、この保護は無効になります。
{% content-ref url="apparmor.md" %} apparmor.md {% endcontent-ref %}
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
--privileged
フラグを使用すると、SELinuxラベルが無効化され、コンテナはコンテナエンジンが実行されたときのラベルで実行されます。このラベルは通常unconfined
であり、コンテナエンジンが持つラベルに完全なアクセス権限を持ちます。ルートレスモードでは、コンテナはcontainer_runtime_t
で実行されます。ルートモードでは、spc_t
で実行されます。
{% content-ref url="../selinux.md" %} selinux.md {% endcontent-ref %}
# You can manually disable selinux in docker with
--security-opt label:disable
影響を受けないもの
ネームスペース
ネームスペースは--privileged
フラグによって影響を受けません。セキュリティ制約が有効になっていないため、システム上のすべてのプロセスやホストネットワークを見ることはありません。ユーザーは、**--pid=host
、--net=host
、--ipc=host
、--uts=host
**のコンテナエンジンフラグを使用して個々のネームスペースを無効にすることができます。
{% tabs %} {% tab title="デフォルトの特権付きコンテナ内部" %}
# docker run --rm --privileged -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:00 sh
18 root 0:00 ps -ef
{% tab title="ホスト内 --pid=host コンテナ" %}
# docker run --rm --privileged --pid=host -it alpine sh
ps -ef
PID USER TIME COMMAND
1 root 0:03 /sbin/init
2 root 0:00 [kthreadd]
3 root 0:00 [rcu_gp]ount | grep /proc.*tmpfs
[...]
{% endtab %} {% endtabs %}
ユーザーネームスペース
コンテナエンジンはデフォルトではユーザーネームスペースを使用しません。ただし、ルートレスコンテナは常にユーザーネームスペースを使用してファイルシステムをマウントし、単一のUID以上を使用します。ルートレスの場合、ユーザーネームスペースは無効にすることはできません。ルートレスコンテナを実行するためには、ユーザーネームスペースが必要です。ユーザーネームスペースは特定の特権を防止し、セキュリティを向上させます。
参考文献
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- サイバーセキュリティ企業で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
- The PEASS Familyを見つけてください。独占的なNFTのコレクションです。
- 公式のPEASS&HackTricksのグッズを手に入れましょう。
- 💬 Discordグループまたはテレグラムグループに参加するか、Twitterでフォローしてください🐦@carlospolopm。
- ハッキングのトリックを共有するには、hacktricksリポジトリとhacktricks-cloudリポジトリにPRを提出してください。