PID Namespace

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Basic Information

Ο PID (Process IDentifier) namespace είναι μια δυνατότητα στον πυρήνα του Linux που παρέχει απομόνωση διεργασιών επιτρέποντας σε μια ομάδα διεργασιών να έχει το δικό της σύνολο μοναδικών PIDs, ξεχωριστό από τους PIDs σε άλλους namespaces. Αυτό είναι ιδιαίτερα χρήσιμο στην κοντενέρωση, όπου η απομόνωση διεργασιών είναι ουσιώδης για την ασφάλεια και τη διαχείριση πόρων.

Όταν δημιουργείται ένα νέο PID namespace, η πρώτη διεργασία σε αυτό το namespace ανατίθεται PID 1. Αυτή η διεργασία γίνεται η "init" διεργασία του νέου namespace και είναι υπεύθυνη για τη διαχείριση άλλων διεργασιών εντός του namespace. Κάθε επόμενη διεργασία που δημιουργείται εντός του namespace θα έχει έναν μοναδικό PID εντός αυτού του namespace, και αυτοί οι PIDs θα είναι ανεξάρτητοι από τους PIDs σε άλλους namespaces.

Από την προοπτική μιας διεργασίας εντός ενός PID namespace, μπορεί να δει μόνο άλλες διεργασίες στο ίδιο namespace. Δεν είναι ενήμερη για διεργασίες σε άλλα namespaces και δεν μπορεί να αλληλεπιδράσει μαζί τους χρησιμοποιώντας παραδοσιακά εργαλεία διαχείρισης διεργασιών (π.χ., kill, wait, κ.λπ.). Αυτό παρέχει ένα επίπεδο απομόνωσης που βοηθά στην αποφυγή παρεμβολών μεταξύ των διεργασιών.

How it works:

  1. Όταν δημιουργείται μια νέα διεργασία (π.χ., χρησιμοποιώντας την κλήση συστήματος clone()), η διεργασία μπορεί να ανατεθεί σε ένα νέο ή υπάρχον PID namespace. Εάν δημιουργηθεί ένα νέο namespace, η διεργασία γίνεται η "init" διεργασία αυτού του namespace.
  2. Ο πυρήνας διατηρεί μια χαρτογράφηση μεταξύ των PIDs στο νέο namespace και των αντίστοιχων PIDs στο γονικό namespace (δηλαδή, το namespace από το οποίο δημιουργήθηκε το νέο namespace). Αυτή η χαρτογράφηση επιτρέπει στον πυρήνα να μεταφράσει τους PIDs όταν είναι απαραίτητο, όπως όταν στέλνει σήματα μεταξύ διεργασιών σε διαφορετικά namespaces.
  3. Οι διεργασίες εντός ενός PID namespace μπορούν να βλέπουν και να αλληλεπιδρούν μόνο με άλλες διεργασίες στο ίδιο namespace. Δεν είναι ενήμερες για διεργασίες σε άλλα namespaces και οι PIDs τους είναι μοναδικοί εντός του namespace τους.
  4. Όταν ένα PID namespace καταστρέφεται (π.χ., όταν η "init" διεργασία του namespace τερματίζεται), όλες οι διεργασίες εντός αυτού του namespace τερματίζονται. Αυτό διασφαλίζει ότι όλοι οι πόροι που σχετίζονται με το namespace καθαρίζονται σωστά.

Lab:

Create different Namespaces

CLI

bash
sudo unshare -pf --mount-proc /bin/bash
Σφάλμα: bash: fork: Cannot allocate memory

Όταν εκτελείται το unshare χωρίς την επιλογή -f, προκύπτει ένα σφάλμα λόγω του τρόπου που διαχειρίζεται το Linux τα νέα PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση παρατίθενται παρακάτω:

  1. Εξήγηση Προβλήματος:
  • Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέα namespaces χρησιμοποιώντας την κλήση συστήματος unshare. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία ενός νέου PID namespace (αναφερόμενη ως διαδικασία "unshare") δεν εισέρχεται στο νέο namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
  • Η εκτέλεση %unshare -p /bin/bash% ξεκινά το /bin/bash στην ίδια διαδικασία με το unshare. Ως εκ τούτου, το /bin/bash και οι παιδικές του διαδικασίες βρίσκονται στο αρχικό PID namespace.
  • Η πρώτη παιδική διαδικασία του /bin/bash στο νέο namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα του namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτό το namespace.
  1. Συνέπεια:
  • Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στον καθαρισμό της σημαίας PIDNS_HASH_ADDING. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης alloc_pid να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
  1. Λύση:
  • Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή -f με το unshare. Αυτή η επιλογή κάνει το unshare να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία του νέου PID namespace.
  • Η εκτέλεση %unshare -fp /bin/bash% διασφαλίζει ότι η εντολή unshare γίνεται PID 1 στο νέο namespace. Το /bin/bash και οι παιδικές του διαδικασίες είναι τότε ασφαλώς περιορισμένες μέσα σε αυτό το νέο namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.

Διασφαλίζοντας ότι το unshare εκτελείται με την επιλογή -f, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο /bin/bash και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.

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

Docker

bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash

Έλεγχος σε ποιο namespace βρίσκονται οι διαδικασίες σας

bash
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr  3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'

Βρείτε όλα τα PID namespaces

bash
sudo find /proc -maxdepth 3 -type l -name pid -exec readlink {} \; 2>/dev/null | sort -u

Σημειώστε ότι ο χρήστης root από το αρχικό (προεπιλεγμένο) PID namespace μπορεί να δει όλες τις διεργασίες, ακόμη και αυτές σε νέους PID namespaces, γι' αυτό μπορούμε να δούμε όλους τους PID namespaces.

Είσοδος σε ένα PID namespace

bash
nsenter -t TARGET_PID --pid /bin/bash

Όταν εισέλθετε σε ένα PID namespace από το προεπιλεγμένο namespace, θα μπορείτε ακόμα να βλέπετε όλες τις διεργασίες. Και η διεργασία από αυτό το PID ns θα μπορεί να δει το νέο bash στο PID ns.

Επίσης, μπορείτε μόνο να εισέλθετε σε άλλο PID namespace αν είστε root. Και δεν μπορείτε να εισέλθετε σε άλλο namespace χωρίς έναν περιγραφέα που να δείχνει σε αυτό (όπως το /proc/self/ns/pid)

References

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks