Linux Capabilities
RootedCON είναι το πιο σχετικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο είναι ένας ζωηρός σημείο συνάντησης για επαγγελματίες τεχνολογίας και κυβερνοασφάλειας σε κάθε ειδικότητα.\
Ικανότητες Linux
Οι ικανότητες του Linux διαιρούν τα δικαιώματα του root σε μικρότερες, διακριτές μονάδες, επιτρέποντας στις διεργασίες να έχουν ένα υποσύνολο των δικαιωμάτων. Αυτό μειώνει τους κινδύνους μην παρέχοντας πλήρη δικαιώματα root χωρίς λόγο.
Το πρόβλημα:
Οι κανονικοί χρήστες έχουν περιορισμένες άδειες, επηρεάζοντας εργασίες όπως η ανοίγματος ενός δικτυακού socket που απαιτεί πρόσβαση root.
Σύνολα ικανοτήτων:
Κληρονομημένες (CapInh):
Σκοπός: Καθορίζει τις ικανότητες που κληρονομούνται από τη γονική διεργασία.
Λειτουργικότητα: Όταν δημιουργείται μια νέα διεργασία, κληρονομεί τις ικανότητες από τη γονική της διεργασία σε αυτό το σύνολο. Χρήσιμο για τη διατήρηση ορισμένων δικαιωμάτων σε όλες τις διεργασίες.
Περιορισμοί: Μια διεργασία δεν μπορεί να αποκτήσει ικανότητες που η γονική της διεργασία δεν είχε.
Ενεργές (CapEff):
Σκοπός: Αντιπροσωπεύει τις πραγματικές ικανότητες που μια διεργασία χρησιμοποιεί σε κάθε στιγμή.
Λειτουργικότητα: Είναι το σύνολο των ικανοτήτων που ελέγχονται από τον πυρήνα για να χορηγήσει άδεια για διάφορες λειτουργίες. Για αρχεία, αυτό το σύνολο μπορεί να είναι ένα σημαία που υποδεικνύει εάν οι επιτρεπόμενες ικανότητες του αρχείου θα θεωρηθούν ενεργές.
Σημασία: Το ενεργό σύνολο είναι κρίσιμο για άμεσους ελέγχους δικαιωμάτων, λειτουργώντας ως το ενεργό σύνολο ικανοτήτων που μια διεργασία μπορεί να χρησιμοποιήσει.
Επιτρεπόμενες (CapPrm):
Σκοπός: Καθορίζει το μέγιστο σύνολο ικανοτήτων που μια διεργασία μπορεί να έχει.
Λειτουργικότητα: Μια διεργασία μπορεί να αναβαθμίσει μια ικανότητα από το σύνολο των επιτρεπόμενων στο ενεργό της σύνολο, δίνοντάς της τη δυνατότητα να χρησιμοποιήσει αυτήν την ικανότητα. Μπορεί επίσης να απορρίψει ικανότητες από το σύνολο των επιτρεπόμενων.
Όριο: Λειτουργεί ως άνω όριο για τις ικανότητες που μια διεργασία μπορεί να έχει, εξασφαλίζοντας ότι μια διεργασία δεν υπερβαίνει το προκαθορισμένο πεδίο δικαιωμάτων της.
Οριοθέτηση (CapBnd):
Σκοπός: Τίθεται ένα όριο στις ικανότητες που μια διεργασία μπορεί ποτέ να αποκτήσει κατά τη διάρκεια του κύκλου ζωής της.
Λειτουργικότητα: Ακόμη κι αν μια διεργασ
Για περισσότερες πληροφορίες, ελέγξτε:
Δυνατότητες Διεργασιών και Εκτελέσιμων Αρχείων
Δυνατότητες Διεργασιών
Για να δείτε τις δυνατότητες για μια συγκεκριμένη διεργασία, χρησιμοποιήστε το αρχείο status στον κατάλογο /proc. Καθώς παρέχει περισσότερες λεπτομέρειες, ας περιορίσουμε τις πληροφορίες μόνο σχετικά με τις δυνατότητες του Linux. Σημειώστε ότι για όλες τις εκτελούμενες διεργασίες, οι πληροφορίες δυνατοτήτων διατηρούνται ανά νήμα, ενώ για τα εκτελέσιμα αρχεία στο σύστημα αρχείων αποθηκεύονται σε επεκταμένα χαρακτηριστικά.
Μπορείτε να βρείτε τις δυνατότητες που έχουν καθοριστεί στο αρχείο /usr/include/linux/capability.h
Μπορείτε να βρείτε τις δυνατότητες της τρέχουσας διεργασίας με την εντολή cat /proc/self/status
ή με την εντολή capsh --print
και των άλλων χρηστών στο /proc/<pid>/status
Αυτή η εντολή θα πρέπει να επιστρέψει 5 γραμμές σε περισσότερα συστήματα.
CapInh = Κληρονομημένες δυνατότητες
CapPrm = Επιτρεπόμενες δυνατότητες
CapEff = Αποτελεσματικές δυνατότητες
CapBnd = Σύνολο περιορισμού
CapAmb = Σύνολο περιβάλλοντος δυνατοτήτων
Αυτοί οι δεκαεξαδικοί αριθμοί δεν έχουν νόημα. Χρησιμοποιώντας το εργαλείο capsh μπορούμε να τους αποκωδικοποιήσουμε σε ονόματα δυνατοτήτων.
Ας ελέγξουμε τώρα τις δυνατότητες (capabilities) που χρησιμοποιεί το ping
:
Αν και αυτό λειτουργεί, υπάρχει και ένας άλλος και πιο εύκολος τρόπος. Για να δείτε τις δυνατότητες ενός εκτελούμενου διεργασίας, απλά χρησιμοποιήστε το εργαλείο getpcaps ακολουθούμενο από το αναγνωριστικό διεργασίας (PID) της. Μπορείτε επίσης να παρέχετε μια λίστα από αναγνωριστικά διεργασίας.
Ας ελέγξουμε εδώ τις δυνατότητες του tcpdump
αφού έχουμε δώσει στο δυαδικό αρκετές δυνατότητες (cap_net_admin
και cap_net_raw
) για να καταγράφει το δίκτυο (το tcpdump εκτελείται στη διεργασία 9562):
Όπως μπορείτε να δείτε, οι δυνατότητες που δίνονται αντιστοιχούν στα αποτελέσματα των 2 τρόπων ανάκτησης των δυνατοτήτων ενός δυαδικού αρχείου. Το εργαλείο getpcaps χρησιμοποιεί τη συστημική κλήση capget() για να ελέγξει τις διαθέσιμες δυνατότητες για ένα συγκεκριμένο νήμα. Αυτή η συστημική κλήση χρειάζεται μόνο να παρέχει το PID για να λάβει περισσότερες πληροφορίες.
Δυνατότητες Δυαδικών Αρχείων
Τα δυαδικά αρχεία μπορούν να έχουν δυνατότητες που μπορούν να χρησιμοποιηθούν κατά την εκτέλεσή τους. Για παράδειγμα, είναι πολύ συνηθισμένο να βρεθεί το δυαδικό αρχείο ping
με τη δυνατότητα cap_net_raw
:
Μπορείτε να αναζητήσετε δυνατότητες σε δυαδικά αρχεία χρησιμοποιώντας:
Απόρριψη δυνατοτήτων με το capsh
Εάν απορρίψουμε τις δυνατότητες CAP_NET_RAW για το ping, τότε η εργαλειοθήκη ping δεν θα λειτουργεί πλέον.
Εκτός από την ίδια την έξοδο της εντολής capsh, η ίδια η εντολή tcpdump θα πρέπει επίσης να εμφανίσει ένα σφάλμα.
/bin/bash: /usr/sbin/tcpdump: Η λειτουργία δεν επιτρέπεται
Το σφάλμα δείχνει ότι η εντολή ping δεν επιτρέπεται να ανοίξει ένα socket ICMP. Τώρα ξέρουμε με βεβαιότητα ότι αυτό λειτουργεί όπως αναμενόταν.
Αφαίρεση Ικανοτήτων
Μπορείτε να αφαιρέσετε ικανότητες από ένα δυαδικό αρχείο με τη χρήση της εντολής
Δυνατότητες Χρήστη
Φαίνεται είναι δυνατόν να ανατεθούν δυνατότητες και σε χρήστες. Αυτό πιθανώς σημαίνει ότι κάθε διεργασία που εκτελείται από τον χρήστη θα μπορεί να χρησιμοποιεί τις δυνατότητες του χρήστη.
Βασισμένο σε αυτό, αυτό και αυτό, πρέπει να διαμορφωθούν μερικά αρχεία για να δοθούν σε έναν χρήστη συγκεκριμένες δυνατότητες, αλλά το αρχείο που αναθέτει τις δυνατότητες σε κάθε χρήστη θα είναι το /etc/security/capability.conf
.
Παράδειγμα αρχείου:
Ικανότητες Περιβάλλοντος
Με τη συγγραφή του παρακάτω προγράμματος, είναι δυνατόν να εκκινήσετε ένα κέλυφος bash μέσα σε ένα περιβάλλον που παρέχει ικανότητες.
Μέσα στο bash που εκτελείται από το μεταγλωττισμένο δυναμικό δυνατοτήτων είναι δυνατό να παρατηρηθούν οι νέες δυνατότητες (ένας κανονικός χρήστης δεν θα έχει καμία δυνατότητα στην ενότητα "current").
Μπορείτε μόνο να προσθέσετε δυνατότητες που υπάρχουν και στα επιτρεπόμενα και στα κληρονομούμενα σύνολα.
Δυνατότητες ευαισθητοποίησης/αμόρφωτων δυνατοτήτων
Οι ευαισθητοποιημένες δυνατότητες δεν θα χρησιμοποιήσουν τις νέες δυνατότητες που δίνονται από το περιβάλλον, ενώ οι αμόρφωτες δυνατότητες θα τις χρησιμοποιήσουν καθώς δεν θα τις απορρίψουν. Αυτό καθιστά τις αμόρφωτες δυνατότητες ευάλωτες μέσα σε ένα ειδικό περιβάλλον που χορηγεί δυνατότητες σε δυαδικά αρχεία.
Δυνατότητες υπηρεσίας
Από προεπιλογή, μια υπηρεσία που εκτελείται ως root θα έχει ανατεθεί όλες τις δυνατότητες, και σε ορισμένες περιπτώσεις αυτό μπορεί να είναι επικίνδυνο. Για τον λόγο αυτό, ένα αρχείο διαμόρφωσης της υπηρεσίας επιτρέπει να καθορίσετε τις δυνατότητες που θέλετε να έχει, και τον χρήστη που πρέπει να εκτελεί την υπηρεσία για να αποφευχθεί η εκτέλεση μιας υπηρεσίας με περιττά προνόμια:
Δυνατότητες σε Εμπορεύματα Docker
Από προεπιλογή, το Docker αναθέτει μερικές δυνατότητες στα εμπορεύματα. Είναι πολύ εύκολο να ελέγξετε ποιες είναι αυτές οι δυνατότητες εκτελώντας:
RootedCON είναι το πιο σχετικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή να προωθήσει την τεχνική γνώση, αυτό το συνέδριο είναι ένας ζωντανός συνάντησης για επαγγελματίες τεχνολογίας και κυβερνοασφάλειας σε κάθε ειδικότητα.
Απόκτηση Προνομίων/Απόδραση από Εμποδίσματα Επιπέδου Χρήστη
Οι δυνατότητες είναι χρήσιμες όταν θέλετε να περιορίσετε τις δικές σας διεργασίες μετά από προνομιούχες λειτουργίες (π.χ. μετά την ρύθμιση του chroot και τη σύνδεση σε ένα socket). Ωστόσο, μπορούν να εκμεταλλευτούνται περνώντας τους κακόβουλες εντολές ή ορίζοντας κακόβουλα ορίσματα που εκτελούνται ως root.
Μπορείτε να επιβάλετε δυνατότητες σε προγράμματα χρησιμοποιώντας την εντολή setcap
και να ελέγξετε αυτές χρησιμοποιώντας την εντολή getcap
:
Το +ep
σημαίνει ότι προσθέτετε τη δυνατότητα ("-" θα την αφαιρούσε) ως Αποτελεσματική και Επιτρεπόμενη.
Για να αναγνωρίσετε προγράμματα σε ένα σύστημα ή φάκελο με δυνατότητες:
Παράδειγμα εκμετάλλευσης
Στο παρακάτω παράδειγμα, το δυαδικό αρχείο /usr/bin/python2.6
θεωρείται ευάλωτο για προνομιούχα ανόδο.
Δυνατότητες που απαιτούνται από το tcpdump
για να επιτραπεί σε οποιονδήποτε χρήστη να καταγράφει πακέτα:
These capabilities can be set using the setcap
command:
Alternatively, you can use the getcap
command to check the current capabilities of the tcpdump
binary:
If the capabilities are not set correctly, you can use the setcap
command to add them:
Remember to use caution when granting capabilities to binaries, as it can introduce security risks if not done properly.
Η ειδική περίπτωση των "άδειων" δυνατοτήτων
Από τα έγγραφα: Σημειώστε ότι μπορείτε να αναθέσετε άδεια σύνολα δυνατοτήτων σε ένα αρχείο προγράμματος και, ως εκ τούτου, είναι δυνατόν να δημιουργήσετε ένα πρόγραμμα set-user-ID-root που αλλάζει το αποτελεσματικό και το αποθηκευμένο set-user-ID της διεργασίας που εκτελεί το πρόγραμμα σε 0, αλλά δεν παρέχει καμία δυνατότητα σε αυτήν τη διεργασία. Ή, απλά, αν έχετε ένα δυαδικό αρχείο που:
δεν ανήκει στον ριζικό χρήστη
δεν έχει οριστεί το
SUID
/SGID
έχει άδειο σύνολο δυνατοτήτων (π.χ.:
getcap myelf
επιστρέφειmyelf =ep
)
τότε αυτό το δυαδικό αρχείο θα εκτελεστεί ως ριζικός χρήστης.
CAP_SYS_ADMIN
CAP_SYS_ADMIN
είναι μια ισχυρή δυνατότητα του Linux, συχνά ισοδυναμούμενη με ένα επίπεδο root λόγω των εκτεταμένων διοικητικών προνομίων της, όπως η προσάρτηση συσκευών ή η επεξεργασία χαρακτηριστικών του πυρήνα. Ενώ είναι απαραίτητη για τα containers που προσομοιώνουν ολόκληρα συστήματα, η CAP_SYS_ADMIN
προκαλεί σημαντικές προκλήσεις ασφαλείας, ειδικά σε περιβάλλοντα με εφαρμογές σε containers, λόγω της δυνατότητάς της για ανέλιξη προνομίων και παραβίαση του συστήματος. Επομένως, η χρήση της απαιτεί αυστηρές αξιολογήσεις ασφαλείας και προσεκτική διαχείριση, με έμφαση στην απόρριψη αυτής της δυνατότητας σε εφαρμογές που τρέχουν σε συγκεκριμένα containers, για να τηρηθεί η αρχή του ελάχιστου προνομίου και να ελαχιστοποιηθεί η επιθετική επιφάνεια.
Παράδειγμα με δυαδικό αρχείο
Χρησιμοποιώντας τη γλώσσα προγραμματισμού Python μπορείτε να τοποθετήσετε έναν τροποποιημένο αρχείο passwd πάνω από το πραγματικό passwd αρχείο:
Και τέλος προσαρτήστε το τροποποιημένο αρχείο passwd
στο /etc/passwd
:
Και θα μπορείτε να su
ως root χρησιμοποιώντας τον κωδικό πρόσβασης "password".
Παράδειγμα με περιβάλλον (Docker breakout)
Μπορείτε να ελέγξετε τις ενεργοποιημένες δυνατότητες μέσα στον docker container χρησιμοποιώντας:
Μέσα στην προηγούμενη έξοδο μπορείτε να δείτε ότι η δυνατότητα SYS_ADMIN είναι ενεργοποιημένη.
Προσάρτηση (Mount)
Αυτό επιτρέπει στον docker container να προσαρτήσει το δίσκο του κεντρικού συστήματος και να έχει ελεύθερη πρόσβαση σε αυτόν:
Πλήρης πρόσβαση
Στην προηγούμενη μέθοδο καταφέραμε να αποκτήσουμε πρόσβαση στον δίσκο του docker host. Στην περίπτωση που ανακαλύψετε ότι ο host εκτελεί έναν διακομιστή ssh, μπορείτε να δημιουργήσετε έναν χρήστη μέσα στον δίσκο του docker host και να αποκτήσετε πρόσβαση μέσω SSH:
CAP_SYS_PTRACE
Αυτό σημαίνει ότι μπορείτε να δραπετεύσετε από τον container εισάγοντας ένα shellcode μέσα σε κάποια διεργασία που εκτελείται μέσα στον host. Για να έχετε πρόσβαση στις διεργασίες που εκτελούνται μέσα στον host, ο container πρέπει να εκτελεστεί τουλάχιστον με την επιλογή --pid=host
.
Το CAP_SYS_PTRACE
παρέχει τη δυνατότητα χρήσης λειτουργιών αποσφαλμάτωσης και ανίχνευσης κλήσεων συστήματος που παρέχονται από τις ptrace(2)
και τις κλήσεις cross-memory attach όπως οι process_vm_readv(2)
και process_vm_writev(2)
. Παρόλο που είναι ισχυρό για διαγνωστικούς και παρακολούθησης σκοπούς, αν το CAP_SYS_PTRACE
είναι ενεργοποιημένο χωρίς περιοριστικά μέτρα όπως ένα φίλτρο seccomp στην ptrace(2)
, μπορεί να υπονομεύσει σημαντικά την ασφάλεια του συστήματος. Συγκεκριμένα, μπορεί να εκμεταλλευτείται για να παρακάμψει άλλους περιορισμούς ασφαλείας, ιδίως αυτούς που επιβάλλονται από το seccomp, όπως αποδεικνύουν αποδείξεις (PoC) όπως αυτή.
Παράδειγμα με δυαδικό αρχείο (python)
Παράδειγμα με δυαδικό αρχείο (gdb)
gdb
με δυνατότητα ptrace
:
Δημιουργήστε ένα shellcode με το msfvenom για να εισαχθεί στη μνήμη μέσω του gdb.
Αντικαταστήστε το <your_ip>
με τη διεύθυνση IP του επιθέτου σας και το <your_port>
με τη θύρα που θέλετε να χρησιμοποιήσετε. Αυτή η εντολή θα δημιουργήσει ένα αρχείο με το όνομα "shellcode" που περιέχει το shellcode που μπορείτε να εισάγετε στη μνήμη μέσω του gdb.
Αποσφαλμάτωση ενός διεργασίας root με το gdb και αντιγραφή-επικόλληση των προηγουμένως δημιουργημένων γραμμών gdb:
Αντιγράψτε και επικολλήστε τις παρακάτω γραμμές gdb:
Συνεχίστε την αποσφαλμάτωση της διεργασίας root με τις εντολές gdb που χρειάζεστε.
Παράδειγμα με περιβάλλον (Docker breakout) - Άλλη κατάχρηση του gdb
Εάν έχει εγκατασταθεί το GDB (ή μπορείτε να το εγκαταστήσετε με την εντολή apk add gdb
ή apt install gdb
για παράδειγμα), μπορείτε να αποσφαλματώσετε ένα διεργασία από τον κεντρικό υπολογιστή και να την καλέσετε να εκτελέσει τη συνάρτηση system
. (Αυτή η τεχνική απαιτεί επίσης τη δυνατότητα SYS_ADMIN
).**
Δε θα μπορείτε να δείτε την έξοδο της εκτελούμενης εντολής, αλλά θα εκτελεστεί από αυτήν τη διεργασία (έτσι πάρτε ένα αντίστροφο κέλυφος).
Εάν λάβετε το σφάλμα "Δεν υπάρχει σύμβολο "system" στο τρέχον περιβάλλον.", ελέγξτε το προηγούμενο παράδειγμα φόρτωσης ενός shellcode σε ένα πρόγραμμα μέσω του gdb.
Παράδειγμα με περιβάλλον (Docker breakout) - Εισαγωγή Shellcode
Μπορείτε να ελέγξετε τις ενεργοποιημένες δυνατότητες μέσα στον εμπλεκόμενο δοχείο Docker χρησιμοποιώντας:
Απαρίθμηση των διεργασιών που εκτελούνται στο σύστημα ps -eaf
Πάρτε την αρχιτεκτονική
uname -m
Βρείτε ένα shellcode για την αρχιτεκτονική (https://www.exploit-db.com/exploits/41128)
Βρείτε ένα πρόγραμμα για να εισαγάγετε το shellcode στη μνήμη μιας διεργασίας (https://github.com/0x00pf/0x00sec_code/blob/master/mem_inject/infect.c)
Τροποποιήστε το shellcode μέσα στο πρόγραμμα και μεταγλωττίστε το
gcc inject.c -o inject
Εισαγάγετέ το και αποκτήστε το shell σας:
./inject 299; nc 172.17.0.1 5600
CAP_SYS_MODULE
Το CAP_SYS_MODULE
επιτρέπει σε μια διεργασία να φορτώνει και να απενεργοποιεί πυρήνας (init_module(2)
, finit_module(2)
και delete_module(2)
κλήσεις συστήματος), προσφέροντας άμεση πρόσβαση στις βασικές λειτουργίες του πυρήνα. Αυτή η δυνατότητα παρουσιάζει κρίσιμους κινδύνους ασφάλειας, καθώς επιτρέπει την ανέλιξη προνομιακών δικαιωμάτων και την πλήρη συμβιβασμό του συστήματος μέσω τροποποιήσεων στον πυρήνα, παρακάμπτοντας έτσι όλα τα μηχανισμούς ασφαλείας του Linux, συμπεριλαμβανομένων των Linux Security Modules και της απομόνωσης των ελαχίστων περιβαλλόντων. Αυτό σημαίνει ότι μπορείτε να εισάγετε/αφαιρέσετε πυρήνας από τον πυρήνα της κεντρικής μονάδας.
Παράδειγμα με δυαδικό
Στο παρακάτω παράδειγμα, το δυαδικό python
έχει αυτήν τη δυνατότητα.
Από προεπιλογή, η εντολή modprobe
ελέγχει τη λίστα εξαρτήσεων και τα αρχεία χαρτογράφησης στον φάκελο /lib/modules/$(uname -r)
.
Για να εκμεταλλευτούμε αυτό, ας δημιουργήσουμε έναν ψεύτικο φάκελο lib/modules:
Στη συνέχεια, μεταγλωττίστε τον πυρήνα του module που μπορείτε να βρείτε 2 παραδείγματα παρακάτω και αντιγράψτε το στον φάκελο αυτό:
Τέλος, εκτελέστε τον απαιτούμενο κώδικα Python για να φορτώσετε αυτήν την πυρήνας ενότητα:
Παράδειγμα 2 με δυαδικό αρχείο
Στο παρακάτω παράδειγμα, το δυαδικό αρχείο kmod
έχει αυτήν τη δυνατότητα.
Που σημαίνει ότι είναι δυνατόν να χρησιμοποιηθεί η εντολή insmod
για να εισαχθεί ένα πυρήνας module. Ακολουθήστε το παρακάτω παράδειγμα για να αποκτήσετε ένα αντίστροφο κέλυφος καταχρώντας αυτή την ικανότητα.
Παράδειγμα με περιβάλλον (Docker breakout)
Μπορείτε να ελέγξετε τις ενεργοποιημένες ικανότητες μέσα στο docker container χρησιμοποιώντας:
Μέσα στην προηγούμενη έξοδο μπορείτε να δείτε ότι η δυνατότητα SYS_MODULE είναι ενεργοποιημένη.
Δημιουργήστε το πυρήνας module που θα εκτελέσει ένα αντίστροφο κέλυφος και το Makefile για να το μεταγλωττίσετε:
Το κενό πριν από κάθε λέξη στο αρχείο Makefile πρέπει να είναι ένα tab, όχι κενά!
Εκτελέστε την εντολή make
για να το μεταγλωττίσετε.
Τέλος, ξεκινήστε το nc
μέσα σε ένα κέλυφος και φορτώστε τον ενότητα από ένα άλλο κέλυφος και θα καταγράψετε το κέλυφος στη διεργασία nc:
Ο κώδικας αυτής της τεχνικής αντιγράφηκε από το εργαστήριο "Κατάχρηση της δυνατότητας SYS_MODULE" από https://www.pentesteracademy.com/
Ένα άλλο παράδειγμα αυτής της τεχνικής μπορεί να βρεθεί στο https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host
CAP_DAC_READ_SEARCH
CAP_DAC_READ_SEARCH επιτρέπει σε ένα διεργασία να παρακάμψει τις άδειες για την ανάγνωση αρχείων και για την ανάγνωση και εκτέλεση καταλόγων. Ο κύριος σκοπός του είναι για αναζήτηση αρχείων ή ανάγνωση αρχείων. Ωστόσο, επιτρέπει επίσης σε μια διεργασία να χρησιμοποιήσει τη συνάρτηση open_by_handle_at(2)
, η οποία μπορεί να έχει πρόσβαση σε οποιοδήποτε αρχείο, συμπεριλαμβανομένων αυτών εκτός του mount namespace της διεργασίας. Το handle που χρησιμοποιείται στην open_by_handle_at(2)
πρέπει να είναι ένα μη διαφανές αναγνωριστικό που αποκτήθηκε μέσω της name_to_handle_at(2)
, αλλά μπορεί να περιλαμβάνει ευαίσθητες πληροφορίες όπως αριθμοί inode που είναι ευάλωτοι σε παρεμβολή. Ο δυνητικός κίνδυνος εκμετάλλευσης αυτής της δυνατότητας, ιδιαίτερα στο πλαίσιο των εμπορευματοκιβωτίων Docker, αποδείχθηκε από τον Sebastian Krahmer με την εκμετάλλευση shocker, όπως αναλύθηκε εδώ. Αυτό σημαίνει ότι μπορείτε να παρακάμψετε τους έλεγχους άδειας ανάγνωσης αρχείων και άδειας ανάγνωσης/εκτέλεσης καταλόγων.
Παράδειγμα με δυαδικό αρχείο
Το δυαδικό αρχείο θα μπορεί να διαβάσει οποιοδήποτε αρχείο. Έτσι, αν ένα αρχείο όπως το tar έχει αυτή τη δυνατότητα, θα μπορεί να διαβάσει το αρχείο shadow:
Παράδειγμα με το binary2
Σε αυτήν την περίπτωση, ας υποθέσουμε ότι το δυαδικό αρχείο python
έχει αυτήν τη δυνατότητα. Για να εμφανίσετε τα αρχεία του συστήματος ως ριζοχρονικός χρήστης, μπορείτε να κάνετε:
Και για να διαβάσετε ένα αρχείο μπορείτε να κάνετε:
Παράδειγμα στο περιβάλλον (Docker breakout)
Μπορείτε να ελέγξετε τις ενεργοποιημένες δυνατότητες μέσα στον docker container χρησιμοποιώντας:
Μέσα στην προηγούμενη έξοδο μπορείτε να δείτε ότι η δυνατότητα DAC_READ_SEARCH είναι ενεργοποιημένη. Ως αποτέλεσμα, ο container μπορεί να αναλύει διεργασίες.
Μπορείτε να μάθετε πώς λειτουργεί η ακόλουθη εκμετάλλευση στο https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3 αλλά για να συνοψίσουμε, η δυνατότητα CAP_DAC_READ_SEARCH όχι μόνο μας επιτρέπει να περιηγηθούμε στο σύστημα αρχείων χωρίς έλεγχο δικαιωμάτων, αλλά αφαιρεί επίσης οποιονδήποτε έλεγχο για την συνάρτηση open_by_handle_at(2) και μπορεί να επιτρέψει στη διεργασία μας να διαβάσει ευαίσθητα αρχεία που έχουν ανοιχτεί από άλλες διεργασίες.
Το αρχικό exploit που καταχράται αυτά τα δικαιώματα για να διαβάσει αρχεία από τον host μπορεί να βρεθεί εδώ: http://stealth.openwall.net/xSports/shocker.c, το ακόλουθο είναι μια τροποποιημένη έκδοση που σας επιτρέπει να υποδείξετε το αρχείο που θέλετε να διαβάσετε ως πρώτο όρισμα και να το αποθηκεύσετε σε ένα αρχείο.
Το exploit χρειάζεται να βρει ένα δείκτη για κάτι που είναι προσαρτημένο στον κεντρικό υπολογιστή. Το αρχικό exploit χρησιμοποιούσε το αρχείο /.dockerinit και αυτή η τροποποιημένη έκδοση χρησιμοποιεί το /etc/hostname. Αν το exploit δεν λειτουργεί, ίσως χρειαστεί να ορίσετε ένα διαφορετικό αρχείο. Για να βρείτε ένα αρχείο που είναι προσαρτημένο στον κεντρικό υπολογιστή, απλά εκτελέστε την εντολή mount:
Ο κώδικας αυτής της τεχνικής αντιγράφηκε από το εργαστήριο "Κατάχρηση της δυνατότητας DAC_READ_SEARCH" από το https://www.pentesteracademy.com/
RootedCON είναι το πιο σχετικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή την προώθηση της τεχνικής γνώσης, αυτό το συνέδριο είναι ένας ζωντανός σημείο συνάντησης για επαγγελματίες τεχνολογίας και κυβερνοασφάλειας σε κάθε ειδικότητα.
CAP_DAC_OVERRIDE
Αυτό σημαίνει ότι μπορείτε να παρακάμψετε τους ελέγχους άδειας εγγραφής σε οποιοδήποτε αρχείο, έτσι μπορείτε να γράψετε οποιοδήποτε αρχείο.
Υπάρχουν πολλά αρχεία που μπορείτε να αντικαταστήσετε για να αναβαθμίσετε τα δικαιώματα, μπορείτε να πάρετε ιδέες από εδώ.
Παράδειγμα με δυαδικό αρχείο
Σε αυτό το παράδειγμα, το vim έχει αυτή τη δυνατότητα, οπότε μπορείτε να τροποποιήσετε οποιοδήποτε αρχείο όπως το passwd, sudoers ή shadow:
Παράδειγμα με το δυαδικό 2
Σε αυτό το παράδειγμα, το δυαδικό python
θα έχει αυτήν τη δυνατότητα. Μπορείτε να χρησιμοποιήσετε το python για να αντικαταστήσετε οποιοδήποτε αρχείο:
Παράδειγμα με περιβάλλον + CAP_DAC_READ_SEARCH (Docker breakout)
Μπορείτε να ελέγξετε τις ενεργοποιημένες δυνατότητες μέσα στον docker container χρησιμοποιώντας:
Καταρχήν, διαβάστε το προηγούμενο τμήμα που καταχράται τη δυνατότητα DAC_READ_SEARCH για να διαβάσει αυθαίρετα αρχεία του υπολογιστή και μεταγλωτίστε την εκμετάλλευση. Στη συνέχεια, μεταγλωτίστε την παρακάτω έκδοση της εκμετάλλευσης shocker που θα σας επιτρέψει να γράψετε αυθαίρετα αρχεία στο σύστημα αρχείων του υπολογιστή:
Για να δραπετεύσετε από το docker container μπορείτε να κατεβάσετε τα αρχεία /etc/shadow
και /etc/passwd
από τον host, να προσθέσετε έναν νέο χρήστη σε αυτά και να χρησιμοποιήσετε το shocker_write
για να τα αντικαταστήσετε. Έπειτα, αποκτήστε πρόσβαση μέσω ssh.
Ο κώδικας αυτής της τεχνικής αντιγράφηκε από το εργαστήριο "Abusing DAC_OVERRIDE Capability" από την https://www.pentesteracademy.com
CAP_CHOWN
Αυτό σημαίνει ότι είναι δυνατή η αλλαγή του ιδιοκτήτη οποιουδήποτε αρχείου.
Παράδειγμα με δυαδικό αρχείο
Ας υποθέσουμε ότι το δυαδικό αρχείο python
έχει αυτήν τη δυνατότητα, μπορείτε να αλλάξετε τον ιδιοκτήτη του αρχείου shadow, να αλλάξετε τον κωδικό root και να αναβαθμίσετε τα δικαιώματα.
Ή με το δυαδικό αρχείο ruby
να έχει αυτήν τη δυνατότητα:
CAP_FOWNER
Αυτό σημαίνει ότι είναι δυνατή η αλλαγή των δικαιωμάτων οποιουδήποτε αρχείου.
Παράδειγμα με δυαδικό αρχείο
Αν ο Python έχει αυτήν τη δυνατότητα, μπορείτε να τροποποιήσετε τα δικαιώματα του αρχείου shadow, να αλλάξετε τον κωδικό root και να αναβαθμίσετε τα δικαιώματα:
CAP_SETUID
Αυτό σημαίνει ότι είναι δυνατόν να οριστεί ο αποτελεσματικός αναγνωριστικός χρήστης της διεργασίας που δημιουργείται.
Παράδειγμα με δυαδικό αρχείο
Εάν η python έχει αυτήν τη δυνατότητα, μπορείτε πολύ εύκολα να την καταχραστείτε για να αναβαθμίσετε τα δικαιώματα σε root:
Άλλος τρόπος:
CAP_SETGID
Αυτό σημαίνει ότι είναι δυνατόν να οριστεί η αποτελεσματική ταυτότητα ομάδας της διεργασίας που δημιουργείται.
Υπάρχουν πολλά αρχεία που μπορείτε να αντικαταστήσετε για να αναβαθμίσετε τα δικαιώματα, μπορείτε να πάρετε ιδέες από εδώ.
Παράδειγμα με δυαδικό αρχείο
Σε αυτήν την περίπτωση, θα πρέπει να αναζητήσετε ενδιαφέροντα αρχεία που μια ομάδα μπορεί να διαβάσει, επειδή μπορείτε να προσωποποιήσετε οποιαδήποτε ομάδα:
Αφού βρείτε ένα αρχείο που μπορείτε να καταχραστείτε (διαβάζοντας ή γράφοντας) για να αναβαθμίσετε τα δικαιώματα, μπορείτε να πάρετε ένα κέλυφος προσωποποιώντας την ενδιαφέρουσα ομάδα με:
Σε αυτήν την περίπτωση, η ομάδα shadow προσποιήθηκε, έτσι ώστε να μπορείτε να διαβάσετε το αρχείο /etc/shadow
:
Αν είναι εγκατεστημένο το docker, μπορείτε να προσομοιώσετε την ομάδα docker και να την καταχραστείτε για να επικοινωνήσετε με το docker socket και να αναβαθμίσετε τα δικαιώματα.
CAP_SETFCAP
Αυτό σημαίνει ότι είναι δυνατόν να ορίσετε δυνατότητες σε αρχεία και διεργασίες
Παράδειγμα με δυαδικό αρχείο
Αν ο Python έχει αυτήν τη δυνατότητα, μπορείτε πολύ εύκολα να την καταχραστείτε για να αναβαθμίσετε τα δικαιώματα σε root:
Σημείωση ότι αν ορίσετε μια νέα δυνατότητα στο δυαδικό αρχείο με το CAP_SETFCAP, θα χάσετε αυτήν τη δυνατότητα.
Αφού αποκτήσετε τη δυνατότητα SETUID, μπορείτε να μεταβείτε στην ενότητά της για να δείτε πώς να αναβαθμίσετε τα δικαιώματα.
Παράδειγμα με περιβάλλον (Docker breakout)
Από προεπιλογή, η δυνατότητα CAP_SETFCAP δίνεται στη διεργασία μέσα στον εμπορευματοκιβώτιο του Docker. Μπορείτε να ελέγξετε αυτό κάνοντας κάτι όπως:
Αυτή η δυνατότητα επιτρέπει να δοθεί οποιαδήποτε άλλη δυνατότητα σε δυαδικά αρχεία, οπότε μπορούμε να σκεφτούμε να δραπετεύσουμε από τον εμποδίζοντα δοχείο καταχρώντας οποιαδήποτε άλλη δυνατότητα που αναφέρεται σε αυτήν τη σελίδα. Ωστόσο, αν προσπαθήσετε να δώσετε, για παράδειγμα, τις δυνατότητες CAP_SYS_ADMIN και CAP_SYS_PTRACE στο δυαδικό αρχείο gdb, θα διαπιστώσετε ότι μπορείτε να τις δώσετε, αλλά το δυαδικό αρχείο δεν θα μπορεί να εκτελεστεί μετά από αυτό.
Από τα έγγραφα: Επιτρεπόμενες: Αυτό είναι ένα περιοριστικό υπερσύνολο για τις αποτελεσματικές δυνατότητες που μπορεί να υιοθετήσει ο νήμα. Είναι επίσης ένα περιοριστικό υπερσύνολο για τις δυνατότητες που μπορούν να προστεθούν στο σύνολο κληρονομήσιμων από ένα νήμα που δεν έχει τη δυνατότητα CAP_SETPCAP στο αποτελεσματικό του σύνολο. Φαίνεται ότι οι επιτρεπόμενες δυνατότητες περιορίζουν αυτές που μπορούν να χρησιμοποιηθούν. Ωστόσο, το Docker παρέχει επίσης τη δυνατότητα CAP_SETPCAP από προεπιλογή, οπότε μπορείτε να ορίσετε νέες δυνατότητες μέσα στο σύνολο κληρονομήσιμων. Ωστόσο, στην τεκμηρίωση αυτής της δυνατότητας: CAP_SETPCAP: […] προσθέτει οποιαδήποτε δυνατότητα από το σύνολο περιορισμού του κλήσης νήματος στο κληρονομήσιμο σύνολο του. Φαίνεται ότι μπορούμε να προσθέσουμε μόνο στο σύνολο κληρονομήσιμων δυνατοτήτων από το σύνολο περιορισμού. Αυτό σημαίνει ότι δεν μπορούμε να προσθέσουμε νέες δυνατότητες όπως CAP_SYS_ADMIN ή CAP_SYS_PTRACE στο σύνολο κληρονομήσιμων για να αναβαθμίσουμε τα δικαιώματα.
CAP_SYS_RAWIO
CAP_SYS_RAWIO παρέχει μια σειρά από ευαίσθητες λειτουργίες, συμπεριλαμβανομένης της πρόσβασης στο /dev/mem
, /dev/kmem
ή /proc/kcore
, τροποποίησης του mmap_min_addr
, πρόσβασης στις κλήσεις συστήματος ioperm(2)
και iopl(2)
, καθώς και διάφορες εντολές δίσκου. Το FIBMAP ioctl(2)
είναι επίσης ενεργοποιημένο μέσω αυτής της δυνατότητας, πράγμα που έχει προκαλέσει προβλήματα στο παρελθόν. Σύμφωνα με τη σελίδα του εγχειριδίου, αυτό επιτρέπει επίσης στον κάτοχο να εκτελεί περιγραφικά μια σειρά λειτουργιών που αφορούν συσκευές.
Αυτό μπορεί να είναι χρήσιμο για ανέλιξη δικαιωμάτων και απόδραση από το Docker.
CAP_KILL
Αυτό σημαίνει ότι είναι δυνατό να τερματιστεί οποιαδήποτε διεργασία.
Παράδειγμα με δυαδικό αρχείο
Ας υποθέσουμε ότι το δυαδικό αρχείο python
έχει αυτή τη δυνατότητα. Εάν μπορούσατε επίσης να τροποποιήσετε κάποια ρύθμιση υπηρεσίας ή ρυθμίσεις socket (ή οποιοδήποτε αρχείο ρυθμίσεων που σχετίζεται με μια υπηρεσία), θα μπορούσατε να τοποθετήσετε μια παρασκηνιακή πόρτα και στη συνέχεια να τερματίσετε τη διεργασία που σχετίζεται με αυτήν την υπηρεσία και να περιμένετε να εκτελεστεί το νέο αρχείο ρυθμίσεων με την παρασκηνιακή σας πόρτα.
Ανόδου Προνομίων με τη χρήση της εντολής kill
Εάν έχετε τις δυνατότητες της εντολής kill και υπάρχει ένα πρόγραμμα node που τρέχει ως root (ή ως διαφορετικός χρήστης), μπορείτε πιθανώς να του στείλετε το σήμα SIGUSR1 και να το κάνετε να ανοίξει τον αποσφαλματωτή του node, όπου μπορείτε να συνδεθείτε.
RootedCON είναι το πιο σχετικό συνέδριο κυβερνοασφάλειας στην Ισπανία και ένα από τα πιο σημαντικά στην Ευρώπη. Με αποστολή να προωθήσει την τεχνική γνώση, αυτό το συνέδριο είναι ένας ζωντανός συνάντησης για επαγγελματίες τεχνολογίας και κυβερνοασφάλειας σε κάθε ειδικότητα.
CAP_NET_BIND_SERVICE
Αυτό σημαίνει ότι είναι δυνατόν να ακούτε σε οποιαδήποτε θύρα (ακόμα και σε προνομιούχες). Δεν μπορείτε να αναβαθμίσετε δικαιώματα απευθείας με αυτήν την ικανότητα.
Παράδειγμα με δυαδικό
Αν η python
έχει αυτήν την ικανότητα, θα μπορεί να ακούει σε οποιαδήποτε θύρα και ακόμα να συνδεθεί από αυτήν σε οποιαδήποτε άλλη θύρα (ορισμένες υπηρεσίες απαιτούν συνδέσεις από συγκεκριμένες προνομιούχες θύρες)
CAP_NET_RAW
Η δυνατότητα CAP_NET_RAW επιτρέπει στις διεργασίες να δημιουργούν RAW και PACKET sockets, επιτρέποντάς τους να δημιουργούν και να στέλνουν αυθαίρετα πακέτα δικτύου. Αυτό μπορεί να οδηγήσει σε κινδύνους ασφαλείας σε περιβάλλοντα εντοπισμένα σε εμπορευματοκιβώτια, όπως παραποίηση πακέτων, εισαγωγή κίνησης και παράκαμψη ελέγχων πρόσβασης στο δίκτυο. Κακόβουλοι δράστες μπορούν να εκμεταλλευτούν αυτό για να παρεμβάλουν στη δρομολόγηση των εμπορευματοκιβωτίων ή να διακινδυνεύσουν την ασφάλεια του δικτύου του οικοδεσπότη, ιδίως χωρίς επαρκείς προστασίες της προστατευτικής πυραμίδας. Επιπλέον, η CAP_NET_RAW είναι ζωτικής σημασίας για προνομιούχα εμπορευματοκιβώτια για να υποστηρίξουν λειτουργίες όπως το ping μέσω αιτημάτων RAW ICMP.
Αυτό σημαίνει ότι είναι δυνατή η καταγραφή της κίνησης του δικτύου. Δεν μπορείτε να αναβαθμίσετε απευθείας τα δικαιώματα με αυτήν τη δυνατότητα.
Παράδειγμα με δυαδικό αρχείο
Εάν το δυαδικό αρχείο tcpdump
έχει αυτήν τη δυνατότητα, θα μπορείτε να το χρησιμοποιήσετε για να καταγράψετε πληροφορίες δικτύου.
Σημείωση ότι αν το περιβάλλον παρέχει αυτή τη δυνατότητα, μπορείτε επίσης να χρησιμοποιήσετε το tcpdump
για να καταγράψετε την κίνηση.
Παράδειγμα με το δυαδικό 2
Το παρακάτω παράδειγμα είναι κώδικας python2
που μπορεί να είναι χρήσιμος για την παρεμπόδιση της κίνησης της διεπαφής "lo" (localhost). Ο κώδικας προέρχεται από το εργαστήριο "The Basics: CAP-NET_BIND + NET_RAW" από το https://attackdefense.pentesteracademy.com/
CAP_NET_ADMIN + CAP_NET_RAW
Η δυνατότητα CAP_NET_ADMIN παρέχει στον κάτοχό τη δυνατότητα να τροποποιεί τις ρυθμίσεις δικτύου, συμπεριλαμβανομένων των ρυθμίσεων του τείχους προστασίας, των πινάκων δρομολόγησης, των δικαιωμάτων socket και των ρυθμίσεων της διεπαφής δικτύου εντός των εκτεθειμένων αρθρωμάτων δικτύου. Επίσης, επιτρέπει την ενεργοποίηση της λειτουργίας προσκόλλησης στις διεπαφές δικτύου, επιτρέποντας την καταγραφή πακέτων σε διαφορετικά αρθρώματα δικτύου.
Παράδειγμα με δυαδικό αρχείο
Ας υποθέσουμε ότι το δυαδικό αρχείο python έχει αυτές τις δυνατότητες.
CAP_LINUX_IMMUTABLE
Αυτό σημαίνει ότι είναι δυνατή η τροποποίηση των χαρακτηριστικών του inode. Δεν μπορείτε να αναβαθμίσετε απευθείας τα δικαιώματα με αυτήν την ικανότητα.
Παράδειγμα με δυαδικό αρχείο
Εάν ανακαλύψετε ότι ένα αρχείο είναι αμετάβλητο και η python έχει αυτήν την ικανότητα, μπορείτε να αφαιρέσετε το αμετάβλητο χαρακτηριστικό και να καταστήσετε το αρχείο τροποποιήσιμο:
Σημείωση ότι συνήθως αυτή η ανεπανόρθωτη ιδιότητα ορίζεται και αφαιρείται χρησιμοποιώντας:
CAP_SYS_CHROOT
CAP_SYS_CHROOT επιτρέπει την εκτέλεση της κλήσης συστήματος chroot(2)
, η οποία μπορεί να επιτρέψει τη διαφυγή από περιβάλλοντα chroot(2)
μέσω γνωστών ευπαθειών:
CAP_SYS_BOOT
CAP_SYS_BOOT όχι μόνο επιτρέπει την εκτέλεση της κλήσης συστήματος reboot(2)
για επανεκκινήσεις του συστήματος, συμπεριλαμβανομένων συγκεκριμένων εντολών όπως LINUX_REBOOT_CMD_RESTART2
που προσαρμόζονται για συγκεκριμένες πλατφόρμες υλικού, αλλά επιτρέπει επίσης τη χρήση των kexec_load(2)
και, από το Linux 3.17 και μετά, kexec_file_load(2)
για τη φόρτωση νέων ή υπογεγραμμένων πυρήνων κατάρρευσης αντίστοιχα.
CAP_SYSLOG
CAP_SYSLOG χωρίστηκε από το ευρύτερο CAP_SYS_ADMIN στο Linux 2.6.37, επιτρέποντας ειδικά τη χρήση της κλήσης syslog(2)
. Αυτή η ικανότητα επιτρέπει την προβολή διευθύνσεων πυρήνα μέσω των διεπαφών /proc
και παρόμοιων όταν η ρύθμιση kptr_restrict
είναι 1, η οποία ελέγχει την αποκάλυψη των διευθύνσεων πυρήνα. Από το Linux 2.6.39, η προεπιλογή για το kptr_restrict
είναι 0, πράγμα που σημαίνει ότι οι διευθύνσεις πυρήνα είναι ορατές, αν και πολλές διανομές το ορίζουν σε 1 (απόκρυψη διευθύνσεων εκτός από το uid 0) ή 2 (απόκρυψη διευθύνσεων πάντα) για λόγους ασφαλείας.
Επιπλέον, το CAP_SYSLOG επιτρέπει την πρόσβαση στην έξοδο dmesg
όταν η ρύθμιση dmesg_restrict
ορίζεται σε 1. Παρά τις αλλαγές αυτές, το CAP_SYS_ADMIN διατηρεί τη δυνατότητα εκτέλεσης λειτουργιών syslog
λόγω ιστορικών προηγούμενων.
CAP_MKNOD
CAP_MKNOD επεκτείνει τη λειτουργικότητα της κλήσης συστήματος mknod
πέρα από τη δημιουργία κανονικών αρχείων, FIFOs (ονομασμένα αγωγούς) ή UNIX domain sockets. Επιτρέπει ειδικά τη δημιουργία ειδικών αρχείων, τα οποία περιλαμβάνουν:
S_IFCHR: Ειδικά αρχεία χαρακτήρων, που είναι συσκευές όπως τερματικά.
S_IFBLK: Ειδικά αρχεία μπλοκ, που είναι συσκευές όπως δίσκοι.
Αυτή η ικανότητα είναι απαραίτητη για διεργασίες που απαιτούν τη δυνατότητα δημιουργίας αρχείων συσκευής, διευκολύνοντας την άμεση αλληλεπίδραση με το υλικό μέσω χαρακτήρων ή μπλοκ συσκευών.
Είναι μια προεπιλεγμένη ικανότητα του docker (https://github.com/moby/moby/blob/master/oci/caps/defaults.go#L6-L19).
Αυτή η ικανότητα επιτρέπει την προνόμιας αύξηση (μέσω πλήρους ανάγνωσης δίσκου) στον κεντρικό υπολογιστή, υπό τις ακόλουθες συνθήκες:
Έχετε αρχική πρόσβαση στον κεντρικό υπολογιστή (Μη προνομιούχος).
Έχετε αρχική πρόσβαση στον εμπορευματοκιβώτιο (Προνομιούχος (EUID 0) και αποτελεσματική
CAP_MKNOD
).Ο κεντρικός υπολογιστής και το εμπορευματοκιβώτιο πρέπει να μοιράζονται το ίδιο περιβάλλον χρήστη.
Βήματα για τη Δημιουργία και Πρόσβαση σε Ένα Αρχείο Μπλοκ σε Ένα Εμπορευματοκιβώτιο:
Στον Κεντρικό Υπολογιστή ως Ένας Κανονικός Χρήστης:
Προσδιορίστε το τρέχον αναγνωριστικό χρήστη σας με την εντολή
id
, π.χ.uid=1000(standarduser)
.Εντοπίστε τη στόχο συσκευή, για παράδειγμα,
/dev/sdb
.
Μέσα στο Εμπορευματοκιβώτιο ως
root
:
Επιστροφή στον Κεντρικό Υπολογιστή:
Αυτή η προσέγγιση επιτρέπει στον κανονικό χρήστη να έχει πρόσβαση και πιθανώς να διαβάσει δεδομένα από το /dev/sdb
μέσω του container, εκμεταλλευόμενος τα κοινόχρηστα namespaces χρηστών και τις άδειες που έχουν οριστεί στη συσκευή.
CAP_SETPCAP
Το CAP_SETPCAP επιτρέπει σε ένα διεργασία να τροποποιήσει τα σύνολα δυνατοτήτων μιας άλλης διεργασίας, επιτρέποντας την προσθήκη ή την αφαίρεση δυνατοτήτων από τα σύνολα των δυνατοτήτων που ισχύουν, κληρονομούνται και επιτρέπονται. Ωστόσο, μια διεργασία μπορεί να τροποποιήσει μόνο τις δυνατότητες που διαθέτει στο δικό της σύνολο των δυνατοτήτων που επιτρέπονται, εξασφαλίζοντας ότι δεν μπορεί να αυξήσει τα προνόμια μιας άλλης διεργασίας πέρα από τα δικά της. Πρόσφατες ενημερώσεις του πυρήνα έχουν αυξήσει τους κανόνες αυτούς, περιορίζοντας το CAP_SETPCAP
ώστε να μειώνει μόνο τις δυνατότητες στο δικό του ή στο σύνολο των δυνατοτήτων που επιτρέπονται στους απογόνους του, με σκοπό τη μείωση των κινδύνων ασφαλείας. Η χρήση απαιτεί την έχουσα CAP_SETPCAP
στο σύνολο των δυνατοτήτων και τις στόχευες δυνατότητες στο επιτρεπόμενο σύνολο, χρησιμοποιώντας την capset()
για τροποποιήσεις. Αυτό περιλαμβάνει την πυρήνα λειτουργία και των περιορισμών του CAP_SETPCAP
, τονίζοντας τον ρόλο του στη διαχείριση προνομίων και την ενίσχυση της ασφάλειας.
Το CAP_SETPCAP είναι μια δυνατότητα του Linux που επιτρέπει σε μια διεργασία να τροποποιήσει τα σύνολα δυνατοτήτων μιας άλλης διεργασίας. Παρέχει τη δυνατότητα προσθήκης ή αφαίρεσης δυνατοτήτων από τα σύνολα των δυνατοτήτων που ισχύουν, κληρονομούνται και επιτρέπονται σε άλλες διεργασίες. Ωστόσο, υπάρχουν ορισμένοι περιορισμοί σχετικά με το πώς μπορεί να χρησιμοποιηθεί αυτή η δυνατότητα.
Μια διεργασία με το CAP_SETPCAP
μπορεί να παραχωρήσει ή να αφαιρέσει δυνατότητες που βρίσκονται στο δικό της επιτρεπόμενο σύνολο δυνατοτήτων. Με άλλα λόγια, μια διεργασία δεν μπορεί να παραχωρήσει μια δυνατότητα σε μια άλλη διεργασία αν δεν διαθέτει αυτήν τη δυνατότητα η ίδια. Αυτός ο περιορισμός εμποδίζει μια διεργασία να αυξήσει τα προνόμια μιας άλλης διεργασίας πέρα από το επίπεδο προνομίων της ίδιας.
Επιπλέον, σε πρόσφατες εκδόσεις του πυρήνα, η δυνατότητα CAP_SETPCAP
έχει περιοριστεί περαιτέρω. Δεν επιτρέπει πλέον σε μια διεργασία να τροποποιήσει αυθαίρετα τα σύνολα δυνατοτήτων άλλων διεργασιών. Αντ' αυτού, επιτρέπει μόνο σε μια διεργασία να μειώσει τις δυνατότητες στο δικό της επιτρεπόμενο σύνολο δυνατοτήτων ή στο επιτρεπόμενο σύνολο δυνατοτήτων των απογόνων της. Αυτή η αλλαγή εισήχθη για να μειωθούν οι πιθανοί κίνδυνοι ασφαλείας που συνδέονται με τη δυνατότητα.
Για να χρησιμοποιήσετε το CAP_SETPCAP
αποτελεσματικά, πρέπει να έχετε τη δυνατότητα στο επιτρεπόμενο σύνολο δυνατοτήτων και τις στόχευες δυνατότητες στο επιτρεπόμενο σύνολο δυνατοτήτων. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε την κλήση συστήματος capset()
για να τροποποιήσετε τα σύνολα δυνατοτήτων άλλων διεργασιών.
Συνολικά, το CAP_SETPCAP
επιτρέπει σε μια διεργασία να τροποποιήσει τα σύνολα δυνατοτήτων άλ
Last updated