Docker --privileged
Reading time: 10 minutes
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
影響するもの
特権コンテナを実行すると、無効にする保護は次のとおりです。
/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 -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)
カーネルファイルシステムのマスキング
/proc ファイルシステムは選択的に書き込み可能ですが、セキュリティのために、特定の部分は tmpfs でオーバーレイされ、コンテナプロセスが機密エリアにアクセスできないように保護されています。
[!NOTE] > 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)
Linuxの能力
コンテナエンジンは、デフォルトでコンテナ内で何が行われるかを制御するために、限られた数の能力でコンテナを起動します。特権のあるものは、すべての 能力にアクセスできます。能力について学ぶには、次を読んでください:
# 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
[...]
--privileged
モードで実行せずに、--cap-add
および --cap-drop
フラグを使用して、コンテナに利用可能な機能を操作できます。
Seccomp
Seccomp は、コンテナが呼び出すことができる syscalls を 制限 するのに役立ちます。デフォルトの seccomp プロファイルは、docker コンテナを実行する際にデフォルトで有効ですが、特権モードでは無効になります。Seccomp についての詳細はこちらをご覧ください:
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp: 2
Seccomp_filters: 1
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
また、Kubernetes クラスターで Docker(または他の CRI)が使用されるとき、seccomp フィルターはデフォルトで無効になります。
AppArmor
AppArmor は、コンテナ を 制限された リソース のセットに制限するためのカーネル拡張です。これは プログラムごとのプロファイル を使用します。--privileged
フラグを使用して実行すると、この保護は無効になります。
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
--privileged
フラグを使用してコンテナを実行すると、SELinux ラベルが無効になり、通常は unconfined
のコンテナエンジンのラベルを継承し、コンテナエンジンと同様の完全なアクセスを許可します。ルートレスモードでは container_runtime_t
が使用され、ルートモードでは spc_t
が適用されます。
# 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
ユーザー名前空間
デフォルトでは、コンテナエンジンはユーザー名前空間を利用しませんが、rootlessコンテナはファイルシステムのマウントや複数のUIDを使用するためにそれを必要とします。 ユーザー名前空間はrootlessコンテナに不可欠であり、無効にすることはできず、特権を制限することでセキュリティを大幅に向上させます。
参考文献
tip
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
Azureハッキングを学び、実践する:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksをサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。