Docker --privileged

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

O Que Afeta

Quando vocĂȘ executa um contĂȘiner como privilegiado, estas sĂŁo as proteçÔes que vocĂȘ estĂĄ desativando:

Montar /dev

Em um contĂȘiner privilegiado, todos os dispositivos podem ser acessados em /dev/. Portanto, vocĂȘ pode escapar montando o disco do host.

bash
# docker run --rm -it alpine sh
ls /dev
console  fd       mqueue   ptmx     random   stderr   stdout   urandom
core     full     null     pts      shm      stdin    tty      zero

Sistemas de arquivos do kernel somente leitura

Os sistemas de arquivos do kernel fornecem um mecanismo para um processo modificar o comportamento do kernel. No entanto, quando se trata de processos de contĂȘiner, queremos impedir que eles façam quaisquer alteraçÔes no kernel. Portanto, montamos sistemas de arquivos do kernel como somente leitura dentro do contĂȘiner, garantindo que os processos do contĂȘiner nĂŁo possam modificar o kernel.

bash
# 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)

Mascarando sobre sistemas de arquivos do kernel

O sistema de arquivos /proc Ă© seletivamente gravĂĄvel, mas por segurança, certas partes sĂŁo protegidas contra acesso de leitura e gravação, sobrepondo-as com tmpfs, garantindo que os processos do contĂȘiner nĂŁo possam acessar ĂĄreas sensĂ­veis.

[!NOTE] > tmpfs Ă© um sistema de arquivos que armazena todos os arquivos na memĂłria virtual. tmpfs nĂŁo cria nenhum arquivo no seu disco rĂ­gido. Portanto, se vocĂȘ desmontar um sistema de arquivos tmpfs, todos os arquivos que residem nele sĂŁo perdidos para sempre.

bash
# 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)

Capacidades do Linux

Os mecanismos de contĂȘiner lançam os contĂȘineres com um nĂșmero limitado de capacidades para controlar o que acontece dentro do contĂȘiner por padrĂŁo. Os privilegiados tĂȘm todas as capacidades acessĂ­veis. Para aprender sobre capacidades, leia:

Linux Capabilities

bash
# 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
[...]

VocĂȘ pode manipular as capacidades disponĂ­veis para um contĂȘiner sem executar no modo --privileged usando as flags --cap-add e --cap-drop.

Seccomp

Seccomp Ă© Ăștil para limitar as syscalls que um contĂȘiner pode chamar. Um perfil seccomp padrĂŁo Ă© habilitado por padrĂŁo ao executar contĂȘineres docker, mas no modo privilegiado ele Ă© desativado. Saiba mais sobre Seccomp aqui:

Seccomp

bash
# docker run --rm -it alpine sh
grep Seccomp /proc/1/status
Seccomp:	2
Seccomp_filters:	1
bash
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

Além disso, note que quando o Docker (ou outros CRIs) são usados em um cluster Kubernetes, o filtro seccomp estå desativado por padrão.

AppArmor

AppArmor Ă© uma melhoria do kernel para confinar containers a um conjunto limitado de recursos com perfis por programa. Quando vocĂȘ executa com a flag --privileged, essa proteção Ă© desativada.

AppArmor

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

SELinux

Executar um contĂȘiner com a flag --privileged desabilita os rĂłtulos SELinux, fazendo com que ele herde o rĂłtulo do mecanismo de contĂȘiner, tipicamente unconfined, concedendo acesso total semelhante ao do mecanismo de contĂȘiner. No modo sem root, usa container_runtime_t, enquanto no modo root, spc_t Ă© aplicado.

SELinux

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

O Que NĂŁo Afeta

Namespaces

Namespaces NÃO sĂŁo afetados pela flag --privileged. Mesmo que nĂŁo tenham as restriçÔes de segurança habilitadas, eles nĂŁo veem todos os processos no sistema ou na rede do host, por exemplo. Os usuĂĄrios podem desabilitar namespaces individuais usando as flags de engines de contĂȘiner --pid=host, --net=host, --ipc=host, --uts=host.

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

Namespace de usuĂĄrio

Por padrĂŁo, os mecanismos de contĂȘiner nĂŁo utilizam namespaces de usuĂĄrio, exceto para contĂȘineres sem root, que os requerem para montagem de sistema de arquivos e uso de mĂșltiplos UIDs. Os namespaces de usuĂĄrio, essenciais para contĂȘineres sem root, nĂŁo podem ser desativados e melhoram significativamente a segurança ao restringir privilĂ©gios.

ReferĂȘncias

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks