Docker --privileged

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

影響

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

/dev をマウント

特権付きコンテナでは、すべてのデバイスに /dev/ でアクセスできます。そのため、ホストのディスクをマウントして脱出することができます。

# docker run --rm -it alpine sh
ls /dev
console  fd       mqueue   ptmx     random   stderr   stdout   urandom
core     full     null     pts      shm      stdin    tty      zero
# 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
[...]

読み取り専用のカーネルファイルシステム

カーネルファイルシステムは、プロセスがカーネルの動作を変更する仕組みを提供します。ただし、コンテナプロセスの場合、カーネルに変更を加えることを防ぎたいです。したがって、コンテナ内でカーネルファイルシステムを読み取り専用でマウントし、コンテナプロセスがカーネルを変更できないようにします。

# 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)
# docker run --rm --privileged -it alpine sh
mount  | grep '(ro'

カーネルファイルシステムのマスキング

/procファイルシステムは選択的に書き込み可能ですが、セキュリティのため、一部の部分はtmpfsでオーバーレイされ、コンテナプロセスが機密領域にアクセスできないように読み書きアクセスが遮断されています。

tmpfsは仮想メモリにすべてのファイルを保存するファイルシステムです。tmpfsはハードドライブにファイルを作成しません。したがって、tmpfsファイルシステムをアンマウントすると、その中にあるすべてのファイルが永遠に失われます。

# 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)
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

また、Docker(または他のCRIs)がKubernetesクラスターで使用される場合、seccompフィルターはデフォルトで無効になります。

AppArmor

AppArmorは、プログラムごとのプロファイルを使用してコンテナ限られたリソースに制限するためのカーネルの拡張機能です。--privilegedフラグを使用して実行すると、この保護が無効になります。

pageAppArmor
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

SELinux

--privileged フラグを使用してコンテナを実行すると、SELinux ラベルが無効になり、通常 unconfined のようなコンテナエンジンのラベルを継承し、コンテナエンジンと同様の完全アクセスが付与されます。ルートレスモードでは container_runtime_t を使用し、ルートモードでは spc_t が適用されます。

pageSELinux
# You can manually disable selinux in docker with
--security-opt label:disable

影響を受けないもの

名前空間

名前空間は--privilegedフラグの影響を受けません。セキュリティ制約が有効になっていないにもかかわらず、システム上のすべてのプロセスやホストネットワークを見ることはできません。ユーザーは、**--pid=host--net=host--ipc=host--uts=host**のコンテナエンジンフラグを使用して個々の名前空間を無効にできます。

# docker run --rm --privileged -it alpine sh
ps -ef
PID   USER     TIME  COMMAND
1 root      0:00 sh
18 root      0:00 ps -ef

ユーザー名前空間

デフォルトでは、コンテナエンジンはユーザー名前空間を利用しません。ただし、ルートレスコンテナでは、ファイルシステムのマウントや複数のUIDの使用に必要とされるため、ユーザー名前空間が使用されます。 ルートレスコンテナには不可欠であり、特権を制限することでセキュリティを大幅に向上させます。

参考文献

htARTE(HackTricks AWS Red Team Expert)を使って、ゼロからヒーローまでAWSハッキングを学びましょう!

Last updated