Docker --privileged
Reading time: 7 minutes
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.
Cosa Influisce
Quando esegui un contenitore come privilegiato, queste sono le protezioni che stai disabilitando:
Monta /dev
In un contenitore privilegiato, tutti i dispositivi possono essere accessibili in /dev/
. Pertanto puoi uscire 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
File system del kernel in sola lettura
I file system del kernel forniscono un meccanismo per un processo per modificare il comportamento del kernel. Tuttavia, quando si tratta di processi container, vogliamo impedire loro di apportare modifiche al kernel. Pertanto, montiamo i file system del kernel come sola lettura all'interno del container, garantendo che i processi del container 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 accesso in scrittura e lettura sovrapponendole con tmpfs, garantendo che i processi del container non possano accedere ad aree sensibili.
[!NOTE] > tmpfs è un file system che memorizza tutti i file nella memoria virtuale. tmpfs non crea alcun file sul tuo disco rigido. Quindi, se smonti un file system tmpfs, tutti i file in esso contenuti andranno 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)
Capacità di Linux
I motori dei container avviano i container con un numero limitato di capacità per controllare cosa avviene all'interno del container per impostazione predefinita. Quelli privilegiati hanno tutte le capacità accessibili. Per saperne di più sulle capacità, leggi:
# 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
[...]
Puoi manipolare le capacità disponibili per un container senza eseguire in modalità --privileged
utilizzando i flag --cap-add
e --cap-drop
.
Seccomp
Seccomp è utile per limitare le syscalls che un container può chiamare. Un profilo seccomp predefinito è abilitato per impostazione predefinita quando si eseguono container docker, ma in modalità privilegiata è disabilitato. Scopri di più su Seccomp qui:
# 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 CRI) sono utilizzati in un cluster Kubernetes, il filtraggio 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 esegui con il flag --privileged
, questa protezione è disabilitata.
# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined
SELinux
Eseguire un container con il flag --privileged
disabilita le etichette SELinux, facendogli ereditare l'etichetta del motore del container, tipicamente unconfined
, concedendo accesso completo simile a quello del motore del container. In modalità senza root, utilizza container_runtime_t
, mentre in modalità root, viene applicato spc_t
.
# You can manually disable selinux in docker with
--security-opt label:disable
Cosa Non Influisce
Namespace
I namespace NON sono influenzati dal flag --privileged
. Anche se non hanno i vincoli di sicurezza abilitati, non vedono tutti i processi sul sistema o sulla rete host, per esempio. Gli utenti possono disabilitare singoli namespace utilizzando i flag dei motori container --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
Spazio dei nomi utente
Per impostazione predefinita, i motori dei container non utilizzano spazi dei nomi utente, tranne che per i container senza root, che li richiedono per il montaggio del file system e l'uso di più UID. Gli spazi dei nomi utente, fondamentali per i container senza root, non possono essere disabilitati e migliorano significativamente la sicurezza limitando i privilegi.
Riferimenti
tip
Impara e pratica l'Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica l'Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos di github.