Docker release_agent cgroups escape
Για περισσότερες λεπτομέρειες, ανατρέξτε στην αρχική ανάρτηση του blog. Αυτό είναι απλώς μια περίληψη:
Original PoC:
Η απόδειξη της έννοιας (PoC) δείχνει μια μέθοδο εκμετάλλευσης των cgroups δημιουργώντας ένα αρχείο release_agent
και ενεργοποιώντας την εκτέλεσή του για να εκτελέσει αυθαίρετες εντολές στον οικοδεσπότη του κοντέινερ. Ακολουθεί μια ανάλυση των βημάτων που εμπλέκονται:
Προετοιμάστε το Περιβάλλον:
Δημιουργείται ένας φάκελος
/tmp/cgrp
για να χρησιμεύσει ως σημείο προσάρτησης για το cgroup.Ο ελεγκτής cgroup RDMA προσαρτάται σε αυτόν τον φάκελο. Σε περίπτωση απουσίας του ελεγκτή RDMA, προτείνεται η χρήση του ελεγκτή cgroup
memory
ως εναλλακτική.
Ρύθμιση του Παιδικού Cgroup:
Ένα παιδικό cgroup με όνομα "x" δημιουργείται μέσα στον προσαρτημένο κατάλογο cgroup.
Οι ειδοποιήσεις ενεργοποιούνται για το cgroup "x" γράφοντας 1 στο αρχείο notify_on_release του.
Ρύθμιση του Release Agent:
Η διαδρομή του κοντέινερ στον οικοδεσπότη αποκτάται από το αρχείο /etc/mtab.
Το αρχείο release_agent του cgroup ρυθμίζεται στη συνέχεια για να εκτελεί ένα σενάριο με όνομα /cmd που βρίσκεται στη ληφθείσα διαδρομή του οικοδεσπότη.
Δημιουργία και Ρύθμιση του Script /cmd:
Το script /cmd δημιουργείται μέσα στο κοντέινερ και ρυθμίζεται να εκτελεί ps aux, ανακατευθύνοντας την έξοδο σε ένα αρχείο με όνομα /output στο κοντέινερ. Ο πλήρης δρόμος του /output στον κεντρικό υπολογιστή καθορίζεται.
Ενεργοποίηση της Επίθεσης:
Μια διαδικασία ξεκινά εντός του "x" child cgroup και τερματίζεται αμέσως.
Αυτό ενεργοποιεί τον
release_agent
(το σενάριο /cmd), το οποίο εκτελεί ps aux στον host και γράφει την έξοδο στο /output εντός του container.
Last updated