# Docker --privileged {% hint style="success" %} Aprenda e pratique Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Aprenda e pratique Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)! * **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
{% endhint %} ## 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. {% tabs %} {% tab title="Dentro do contĂȘiner padrĂŁo" %} ```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 ``` {% endtab %} {% tab title="Dentro do ContĂȘiner Privilegiado" %} ```bash # 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 %} ### Sistemas de arquivos do kernel somente leitura Os sistemas de arquivos do kernel fornecem um mecanismo para que um processo modifique 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 os 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. {% tabs %} {% tab title="Dentro do contĂȘiner padrĂŁo" %} ```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) ``` {% endtab %} {% tab title="Dentro do ContĂȘiner Privilegiado" %} ```bash # docker run --rm --privileged -it alpine sh mount | grep '(ro' ``` {% endtab %} {% endtabs %} ### Mascarando sobre sistemas de arquivos do kernel O **/proc** sistema de arquivos Ă© seletivamente gravĂĄvel, mas por segurança, certas partes estĂŁo protegidas contra acesso de gravação e leitura, sobrepondo-as com **tmpfs**, garantindo que os processos do contĂȘiner nĂŁo possam acessar ĂĄreas sensĂ­veis. {% hint style="info" %} **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. {% endhint %} {% tabs %} {% tab title="Dentro do contĂȘiner padrĂŁo" %} ```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) ``` {% endtab %} {% tab title="Dentro do ContĂȘiner Privilegiado" %} ```bash # docker run --rm --privileged -it alpine sh mount | grep /proc.*tmpfs ``` {% endtab %} {% endtabs %} ### 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: {% content-ref url="../linux-capabilities.md" %} [linux-capabilities.md](../linux-capabilities.md) {% endcontent-ref %} {% tabs %} {% tab title="Dentro do contĂȘiner padrĂŁo" %} ```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 [...] ``` {% endtab %} {% tab title="Dentro do ContĂȘiner Privilegiado" %} ```bash # 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 %} 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: {% content-ref url="seccomp.md" %} [seccomp.md](seccomp.md) {% endcontent-ref %} {% tabs %} {% tab title="Dentro do contĂȘiner padrĂŁo" %} ```bash # docker run --rm -it alpine sh grep Seccomp /proc/1/status Seccomp: 2 Seccomp_filters: 1 ``` {% endtab %} {% tab title="Dentro do ContĂȘiner Privilegiado" %} ```bash # docker run --rm --privileged -it alpine sh grep Seccomp /proc/1/status Seccomp: 0 Seccomp_filters: 0 ``` {% endtab %} {% endtabs %} ```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. {% content-ref url="apparmor.md" %} [apparmor.md](apparmor.md) {% endcontent-ref %} ```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, aplica-se `spc_t`. {% content-ref url="../selinux.md" %} [selinux.md](../selinux.md) {% endcontent-ref %} ```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`**. {% tabs %} {% tab title="Dentro do contĂȘiner privilegiado padrĂŁo" %} ```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 ``` {% endtab %} {% tab title="Dentro do Container --pid=host" %} ```bash # 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 %} ### Namespace do 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 aumentam significativamente a segurança ao restringir privilĂ©gios. ## ReferĂȘncias * [https://www.redhat.com/sysadmin/privileged-flag-container-engines](https://www.redhat.com/sysadmin/privileged-flag-container-engines) {% hint style="success" %} Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\ Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks * Check the [**subscription plans**](https://github.com/sponsors/carlospolop)! * **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐩 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.** * **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}