Você trabalha em uma empresa de cibersegurança? Gostaria de ver sua empresa anunciada no HackTricks? ou gostaria de ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
Quando você executa um contêiner como privilegiado, estas são as proteções que você está desabilitando:
Montar /dev
Em um contêiner privilegiado, todos os dispositivos podem ser acessados em /dev/. Portanto, você pode escapar ao montar o disco do host.
# docker run --rm -it alpine shls/devconsolefdmqueueptmxrandomstderrstdouturandomcorefullnullptsshmstdinttyzero
# docker run --rm --privileged -it alpine shls/devcachefilesmapperportshmtty24tty44tty7consolemempsauxstderrtty25tty45tty8coremqueueptmxstdintty26tty46tty9cpunbd0ptsstdouttty27tty47ttyS0[...]
Sistemas de arquivos de kernel somente leitura
Os sistemas de arquivos de kernel fornecem um mecanismo para um processo modificar o comportamento do kernel. No entanto, quando se trata de processos de contêineres, queremos impedi-los de fazer quaisquer alterações no kernel. Portanto, montamos os sistemas de arquivos de kernel como somente leitura dentro do contêiner, garantindo que os processos do contêiner não possam modificar o kernel.
# docker run --rm --privileged -it alpine shmount|grep'(ro'
Mascaramento sobre sistemas de arquivos do kernel
O sistema de arquivos /proc é seletivamente gravável, mas por motivos de segurança, certas partes são protegidas contra acesso de escrita e leitura ao serem sobrepostas com tmpfs, garantindo que os processos do contêiner não possam acessar áreas sensíveis.
tmpfs é um sistema de arquivos que armazena todos os arquivos na memória virtual. O tmpfs não cria nenhum arquivo no seu disco rígido. Portanto, se você desmontar um sistema de arquivos tmpfs, todos os arquivos nele serão perdidos para sempre.
# docker run --rm -it alpine shmount|grep/proc.*tmpfstmpfson/proc/acpitypetmpfs (ro,relatime)tmpfson/proc/kcoretypetmpfs (rw,nosuid,size=65536k,mode=755)tmpfson/proc/keystypetmpfs (rw,nosuid,size=65536k,mode=755)
# docker run --rm --privileged -it alpine shmount|grep/proc.*tmpfs
Capacidades do Linux
As engines de contêineres iniciam os contêineres com um número limitado de capacidades para controlar o que acontece dentro do contêiner por padrão. Os contêineres privilegiados têm todas as capacidades acessíveis. Para aprender sobre capacidades, leia:
# docker run --rm -it alpine shapkadd-Ulibcap; 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
[...]
# docker run --rm --privileged -it alpine shapkadd-Ulibcap; capsh--print[...]Current:=eipcap_perfmon,cap_bpf,cap_checkpoint_restore-eipBounding 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
[...]
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:
# docker run --rm -it alpine shgrepSeccomp/proc/1/statusSeccomp:2Seccomp_filters:1
# docker run --rm --privileged -it alpine shgrepSeccomp/proc/1/statusSeccomp:0Seccomp_filters:0
# You can manually disable seccomp in docker with--security-optseccomp=unconfined
Também, observe que quando o Docker (ou outros CRIs) são usados em um cluster Kubernetes, o filtro seccomp é desativado por padrão
AppArmor
AppArmor é um aprimoramento 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.
# You can manually disable seccomp in docker with--security-optapparmor=unconfined
SELinux
Executar um contêiner com a flag --privileged desabilita rótulos SELinux, fazendo com que herde o rótulo do mecanismo do contêiner, normalmente unconfined, concedendo acesso total semelhante ao mecanismo do contêiner. No modo sem privilégios, ele usa container_runtime_t, enquanto no modo root, spc_t é aplicado.
# You can manually disable selinux in docker with--security-optlabel:disable
O que não afeta
Namespaces
Os namespaces NÃO são afetados pela flag --privileged. Mesmo que não tenham as restrições de segurança ativadas, eles não veem todos os processos no sistema ou na rede do host, por exemplo. Os usuários podem desativar namespaces individuais usando as flags dos motores de contêiner --pid=host, --net=host, --ipc=host, --uts=host.
# docker run --rm --privileged -it alpine shps-efPIDUSERTIMECOMMAND1root0:00sh18root0:00ps-ef
Por padrão, os motores de contêineres não utilizam namespaces de usuário, exceto para contêineres sem raiz, que os requerem para montagem de sistema de arquivos e uso de vários UIDs. Os namespaces de usuário, essenciais para contêineres sem raiz, não podem ser desativados e melhoram significativamente a segurança ao restringir privilégios.
Você trabalha em uma empresa de cibersegurança? Gostaria de ver sua empresa anunciada no HackTricks? ou gostaria de ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!