User Namespace
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ένα user namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει απομόνωση των αναγνωριστικών χρηστών και ομάδων, επιτρέποντας σε κάθε user namespace να έχει το δικό του σύνολο αναγνωριστικών χρηστών και ομάδων. Αυτή η απομόνωση επιτρέπει σε διαδικασίες που εκτελούνται σε διαφορετικά user namespaces να έχουν διαφορετικά προνόμια και ιδιοκτησία, ακόμη και αν μοιράζονται τα ίδια αναγνωριστικά χρηστών και ομάδων αριθμητικά.
Τα user namespaces είναι ιδιαίτερα χρήσιμα στην κοντεντοποίηση, όπου κάθε κοντέινερ θα πρέπει να έχει το δικό του ανεξάρτητο σύνολο αναγνωριστικών χρηστών και ομάδων, επιτρέποντας καλύτερη ασφάλεια και απομόνωση μεταξύ των κοντέινερ και του συστήματος φιλοξενίας.
Όταν δημιουργείται ένα νέο user namespace, ξεκινά με ένα κενό σύνολο αναγνωριστικών χρηστών και ομάδων. Αυτό σημαίνει ότι οποιαδήποτε διαδικασία εκτελείται στο νέο user namespace θα έχει αρχικά κανένα προνόμιο εκτός του namespace.
Τα αναγνωριστικά μπορούν να καθοριστούν μεταξύ των αναγνωριστικών χρηστών και ομάδων στο νέο namespace και εκείνων στο γονικό (ή κεντρικό) namespace. Αυτό επιτρέπει στις διαδικασίες στο νέο namespace να έχουν προνόμια και ιδιοκτησία που αντιστοιχούν σε αναγνωριστικά χρηστών και ομάδων στο γονικό namespace. Ωστόσο, τα αναγνωριστικά μπορούν να περιοριστούν σε συγκεκριμένα εύρη και υποσύνολα αναγνωριστικών, επιτρέποντας λεπτομερή έλεγχο των προνομίων που χορηγούνται στις διαδικασίες στο νέο namespace.
Μέσα σε ένα user namespace, οι διαδικασίες μπορούν να έχουν πλήρη προνόμια root (UID 0) για λειτουργίες μέσα στο namespace, ενώ εξακολουθούν να έχουν περιορισμένα προνόμια εκτός του namespace. Αυτό επιτρέπει στα κοντέινερ να εκτελούνται με δυνατότητες παρόμοιες με του root μέσα στο δικό τους namespace χωρίς να έχουν πλήρη προνόμια root στο σύστημα φιλοξενίας.
Οι διαδικασίες μπορούν να μετακινούνται μεταξύ namespaces χρησιμοποιώντας την κλήση συστήματος setns()
ή να δημιουργούν νέα namespaces χρησιμοποιώντας τις κλήσεις συστήματος unshare()
ή clone()
με την σημαία CLONE_NEWUSER
. Όταν μια διαδικασία μετακινείται σε ένα νέο namespace ή δημιουργεί ένα, θα αρχίσει να χρησιμοποιεί τα αναγνωριστικά χρηστών και ομάδων που σχετίζονται με αυτό το namespace.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων /proc
αν χρησιμοποιήσετε την παράμετρο --mount-proc
, διασφαλίζετε ότι η νέα namespace τοποθέτησης έχει μια ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace.
Για να χρησιμοποιήσετε το user namespace, ο Docker daemon πρέπει να ξεκινήσει με --userns-remap=default
(Στο ubuntu 14.04, αυτό μπορεί να γίνει τροποποιώντας το /etc/default/docker
και στη συνέχεια εκτελώντας sudo service docker restart
)
Είναι δυνατόν να ελέγξετε τον χάρτη χρηστών από το κοντέινερ docker με:
Ή από τον κεντρικό υπολογιστή με:
Επίσης, μπορείτε μόνο να εισέλθετε σε άλλο namespace διαδικασίας αν είστε root. Και δεν μπορείτε να εισέλθετε σε άλλο namespace χωρίς έναν περιγραφέα που να δείχνει σε αυτό (όπως το /proc/self/ns/user
).
Στην περίπτωση των namespaces χρηστών, όταν δημιουργείται ένα νέο namespace χρηστών, η διαδικασία που εισέρχεται στο namespace αποκτά ένα πλήρες σύνολο δυνατοτήτων εντός αυτού του namespace. Αυτές οι δυνατότητες επιτρέπουν στη διαδικασία να εκτελεί προνομιακές λειτουργίες όπως mounting filesystems, δημιουργία συσκευών ή αλλαγή ιδιοκτησίας αρχείων, αλλά μόνο εντός του πλαισίου του namespace χρηστών της.
Για παράδειγμα, όταν έχετε τη δυνατότητα CAP_SYS_ADMIN
εντός ενός namespace χρηστών, μπορείτε να εκτελείτε λειτουργίες που συνήθως απαιτούν αυτή τη δυνατότητα, όπως το mounting filesystems, αλλά μόνο εντός του πλαισίου του namespace χρηστών σας. Οποιεσδήποτε λειτουργίες εκτελείτε με αυτή τη δυνατότητα δεν θα επηρεάσουν το σύστημα φιλοξενίας ή άλλα namespaces.
Επομένως, ακόμη και αν η απόκτηση μιας νέας διαδικασίας μέσα σε ένα νέο namespace χρηστών θα σας δώσει όλες τις δυνατότητες πίσω (CapEff: 000001ffffffffff), στην πραγματικότητα μπορείτε μόνο να χρησιμοποιήσετε αυτές που σχετίζονται με το namespace (mount για παράδειγμα) αλλά όχι όλες. Έτσι, αυτό από μόνο του δεν είναι αρκετό για να ξεφύγετε από ένα κοντέινερ Docker.
hacking tricks by submitting PRs to the** HackTricks and HackTricks Cloud github repos.
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)