hacktricks/linux-hardening/privilege-escalation/docker-security/docker-privileged.md
2023-07-07 23:42:27 +00:00

13 KiB
Raw Blame History

Docker --privileged

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

影響

特権付きコンテナを実行すると、次の保護が無効になります:

/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または他のCRIsKubernetesクラスターで使用される場合、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 🎥