Docker --privileged

Support HackTricks

Τι Επηρεάζει

Όταν εκτελείτε ένα κοντέινερ ως privileged, αυτές είναι οι προστασίες που απενεργοποιείτε:

Mount /dev

Σε ένα privileged κοντέινερ, όλες οι ** συσκευές μπορούν να προσπελαστούν στο /dev/**. Επομένως, μπορείτε να escape κάνοντας mount τον δίσκο του 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

Σύστημα αρχείων πυρήνα μόνο για ανάγνωση

Τα συστήματα αρχείων πυρήνα παρέχουν έναν μηχανισμό για μια διαδικασία να τροποποιήσει τη συμπεριφορά του πυρήνα. Ωστόσο, όταν πρόκειται για διαδικασίες κοντέινερ, θέλουμε να αποτρέψουμε την πραγματοποίηση οποιωνδήποτε αλλαγών στον πυρήνα. Επομένως, τοποθετούμε τα συστήματα αρχείων πυρήνα ως μόνο για ανάγνωση εντός του κοντέινερ, διασφαλίζοντας ότι οι διαδικασίες του κοντέινερ δεν μπορούν να τροποποιήσουν τον πυρήνα.

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

Απόκρυψη πάνω από τα συστήματα αρχείων πυρήνα

Το /proc σύστημα αρχείων είναι επιλεκτικά εγγράψιμο, αλλά για λόγους ασφαλείας, ορισμένα μέρη είναι προστατευμένα από πρόσβαση εγγραφής και ανάγνωσης, επικαλύπτοντάς τα με tmpfs, διασφαλίζοντας ότι οι διαδικασίες κοντέινερ δεν μπορούν να έχουν πρόσβαση σε ευαίσθητες περιοχές.

tmpfs είναι ένα σύστημα αρχείων που αποθηκεύει όλα τα αρχεία στη εικονική μνήμη. Το tmpfs δεν δημιουργεί κανένα αρχείο στον σκληρό σας δίσκο. Έτσι, αν αποσυνδέσετε ένα σύστημα αρχείων tmpfs, όλα τα αρχεία που βρίσκονται σε αυτό χάνονται για πάντα.

# 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

Οι μηχανές κοντέινερ εκκινούν τα κοντέινερ με περιορισμένο αριθμό δυνατοτήτων για να ελέγχουν τι συμβαίνει μέσα στο κοντέινερ από προεπιλογή. Οι προνομιακές έχουν όλες τις δυνατότητες προσβάσιμες. Για να μάθετε για τις δυνατότητες διαβάστε:

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

Μπορείτε να χειριστείτε τις δυνατότητες που είναι διαθέσιμες σε ένα κοντέινερ χωρίς να τρέχετε σε --privileged λειτουργία χρησιμοποιώντας τις σημαίες --cap-add και --cap-drop.

Seccomp

Seccomp είναι χρήσιμο για να περιορίσει τις syscalls που μπορεί να καλέσει ένα κοντέινερ. Ένα προεπιλεγμένο προφίλ seccomp είναι ενεργοποιημένο από προεπιλογή όταν τρέχουν κοντέινερ docker, αλλά σε privileged mode είναι απενεργοποιημένο. Μάθετε περισσότερα για το Seccomp εδώ:

# 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

Επίσης, σημειώστε ότι όταν χρησιμοποιούνται Docker (ή άλλες CRIs) σε ένα Kubernetes cluster, το seccomp filter είναι απενεργοποιημένο από προεπιλογή

AppArmor

AppArmor είναι μια βελτίωση του πυρήνα για να περιορίσει containers σε ένα περιορισμένο σύνολο πόρων με προφίλ ανά πρόγραμμα. Όταν εκτελείτε με την επιλογή --privileged, αυτή η προστασία είναι απενεργοποιημένη.

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

SELinux

Η εκτέλεση ενός κοντέινερ με την επιλογή --privileged απενεργοποιεί τις ετικέτες SELinux, προκαλώντας να κληρονομήσει την ετικέτα της μηχανής κοντέινερ, συνήθως unconfined, παρέχοντας πλήρη πρόσβαση παρόμοια με αυτή της μηχανής κοντέινερ. Σε λειτουργία χωρίς δικαιώματα root, χρησιμοποιεί container_runtime_t, ενώ σε λειτουργία root, εφαρμόζεται το spc_t.

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

Τι Δεν Επηρεάζεται

Namespaces

Τα Namespaces ΔΕΝ επηρεάζονται από την επιλογή --privileged. Ακόμα και αν δεν έχουν ενεργοποιηθεί οι περιορισμοί ασφαλείας, δεν βλέπουν όλες τις διεργασίες στο σύστημα ή το δίκτυο του host, για παράδειγμα. Οι χρήστες μπορούν να απενεργοποιήσουν μεμονωμένα namespaces χρησιμοποιώντας τις επιλογές --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

Χώρος ονομάτων χρήστη

Από προεπιλογή, οι μηχανές κοντέινερ δεν χρησιμοποιούν χώρους ονομάτων χρήστη, εκτός από τα κοντέινερ χωρίς δικαιώματα root, τα οποία τα απαιτούν για την τοποθέτηση συστήματος αρχείων και τη χρήση πολλαπλών UIDs. Οι χώροι ονομάτων χρήστη, που είναι αναπόσπαστο μέρος των κοντέινερ χωρίς δικαιώματα root, δεν μπορούν να απενεργοποιηθούν και ενισχύουν σημαντικά την ασφάλεια περιορίζοντας τα δικαιώματα.

Αναφορές

Support HackTricks

Last updated