Docker --privileged

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Cosa viene influenzato

Quando esegui un container come privilegiato, queste sono le protezioni che disabiliti:

Montaggio di /dev

In un container privilegiato, tutti i dispositivi possono essere accessibili in /dev/. Pertanto, è possibile evadere montando il disco dell'host.

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

Sistemi di file del kernel in sola lettura

I sistemi di file del kernel forniscono un meccanismo per un processo per modificare il comportamento del kernel. Tuttavia, quando si tratta di processi del contenitore, vogliamo impedire loro di apportare modifiche al kernel. Pertanto, montiamo i sistemi di file del kernel come sola lettura all'interno del contenitore, garantendo che i processi del contenitore non possano modificare il kernel.

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

Mascheramento dei file system del kernel

Il file system /proc è selettivamente scrivibile ma, per motivi di sicurezza, alcune parti sono protette da accessi in scrittura e lettura sovrapponendole con tmpfs, garantendo che i processi del contenitore non possano accedere ad aree sensibili.

tmpfs è un file system che memorizza tutti i file nella memoria virtuale. tmpfs non crea alcun file sul disco rigido. Quindi, se smonti un file system tmpfs, tutti i file presenti al suo interno vengono persi per sempre.

# 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 capabilities

I motori dei container avviano i container con un numero limitato di capabilities per controllare ciò che accade all'interno del container per impostazione predefinita. Quelli privilegiati hanno tutte le capabilities accessibili. Per saperne di più sulle capabilities, leggi:

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

È possibile manipolare le capacità disponibili per un contenitore senza eseguire la modalità --privileged utilizzando i flag --cap-add e --cap-drop.

Seccomp

Seccomp è utile per limitare le chiamate di sistema che un contenitore può effettuare. Un profilo Seccomp predefinito è abilitato di default quando si eseguono contenitori Docker, ma in modalità privilegiata è disabilitato. Per saperne di più su Seccomp, clicca qui:

pageSeccomp
# 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

Inoltre, nota che quando Docker (o altri CRIs) vengono utilizzati in un cluster Kubernetes, il filtro seccomp è disabilitato per impostazione predefinita.

AppArmor

AppArmor è un miglioramento del kernel per confinare i container a un insieme limitato di risorse con profili per programma. Quando si esegue con il flag --privileged, questa protezione viene disabilitata.

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

SELinux

L'esecuzione di un container con il flag --privileged disabilita le etichette SELinux, facendo sì che erediti l'etichetta del motore del container, di solito unconfined, concedendo pieno accesso simile al motore del container. In modalità senza privilegi, viene utilizzato container_runtime_t, mentre in modalità root viene applicato spc_t.

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

Cosa non viene influenzato

Namespaces

I namespace NON sono influenzati dal flag --privileged. Anche se non hanno abilitate le restrizioni di sicurezza, non vedono tutti i processi del sistema o la rete dell'host, ad esempio. Gli utenti possono disabilitare i singoli namespace utilizzando i flag --pid=host, --net=host, --ipc=host, --uts=host dei motori dei container.

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

Spazio dei nomi utente

Di default, i motori di container non utilizzano gli spazi dei nomi utente, ad eccezione dei container senza privilegi, che li richiedono per il montaggio del file system e l'utilizzo di più UID. Gli spazi dei nomi utente, fondamentali per i container senza privilegi, non possono essere disabilitati e migliorano significativamente la sicurezza limitando i privilegi.

Riferimenti

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Last updated