Seccomp
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)
Seccomp, που σημαίνει Secure Computing mode, είναι μια λειτουργία ασφαλείας του Linux kernel που έχει σχεδιαστεί για να φιλτράρει τις κλήσεις συστήματος. Περιορίζει τις διαδικασίες σε ένα περιορισμένο σύνολο κλήσεων συστήματος (exit()
, sigreturn()
, read()
, και write()
για ήδη ανοιχτούς περιγραφείς αρχείων). Αν μια διαδικασία προσπαθήσει να καλέσει οτιδήποτε άλλο, τερματίζεται από τον πυρήνα χρησιμοποιώντας SIGKILL ή SIGSYS. Αυτός ο μηχανισμός δεν εικονικοποιεί τους πόρους αλλά απομονώνει τη διαδικασία από αυτούς.
Υπάρχουν δύο τρόποι για να ενεργοποιηθεί το seccomp: μέσω της κλήσης συστήματος prctl(2)
με PR_SET_SECCOMP
, ή για πυρήνες Linux 3.17 και άνω, την κλήση συστήματος seccomp(2)
. Η παλαιότερη μέθοδος ενεργοποίησης του seccomp γράφοντας στο /proc/self/seccomp
έχει καταργηθεί υπέρ του prctl()
.
Μια βελτίωση, seccomp-bpf, προσθέτει τη δυνατότητα φιλτραρίσματος κλήσεων συστήματος με μια προσαρμόσιμη πολιτική, χρησιμοποιώντας κανόνες Berkeley Packet Filter (BPF). Αυτή η επέκταση αξιοποιείται από λογισμικό όπως το OpenSSH, vsftpd, και τους περιηγητές Chrome/Chromium σε Chrome OS και Linux για ευέλικτο και αποδοτικό φιλτράρισμα κλήσεων συστήματος, προσφέροντας μια εναλλακτική λύση στο πλέον μη υποστηριζόμενο systrace για Linux.
Σε αυτή τη λειτουργία, το Seccomp επιτρέπει μόνο τις κλήσεις συστήματος exit()
, sigreturn()
, read()
και write()
σε ήδη ανοιχτούς περιγραφείς αρχείων. Αν γίνει οποιαδήποτε άλλη κλήση συστήματος, η διαδικασία σκοτώνεται χρησιμοποιώντας SIGKILL
Αυτός ο τρόπος επιτρέπει φιλτράρισμα των κλήσεων συστήματος χρησιμοποιώντας μια ρυθμιζόμενη πολιτική που υλοποιείται χρησιμοποιώντας κανόνες Berkeley Packet Filter.
Seccomp-bpf υποστηρίζεται από Docker για να περιορίσει τις syscalls από τα κοντέινερ, μειώνοντας αποτελεσματικά την επιφάνεια επίθεσης. Μπορείτε να βρείτε τις syscalls που αποκλείονται από προεπιλογή στο https://docs.docker.com/engine/security/seccomp/ και το προφίλ seccomp προεπιλογής μπορείτε να το βρείτε εδώ https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Μπορείτε να εκτελέσετε ένα κοντέινερ docker με μια διαφορετική πολιτική seccomp με:
Αν θέλετε για παράδειγμα να απαγορεύσετε σε ένα κοντέινερ να εκτελεί κάποιο syscall όπως το uname
, μπορείτε να κατεβάσετε το προεπιλεγμένο προφίλ από https://github.com/moby/moby/blob/master/profiles/seccomp/default.json και απλά να αφαιρέσετε τη συμβολοσειρά uname
από τη λίστα.
Αν θέλετε να βεβαιωθείτε ότι κάποιο δυαδικό αρχείο δεν λειτουργεί μέσα σε ένα docker κοντέινερ, μπορείτε να χρησιμοποιήσετε το strace για να καταγράψετε τα syscalls που χρησιμοποιεί το δυαδικό αρχείο και στη συνέχεια να τα απαγορεύσετε.
Στο παρακάτω παράδειγμα ανακαλύπτονται οι syscalls του uname
:
Αν χρησιμοποιείτε Docker μόνο για να εκκινήσετε μια εφαρμογή, μπορείτε να προφίλ την με strace
και να επιτρέψετε μόνο τις syscalls που χρειάζεται
Για να απεικονίσουμε τη δυνατότητα Seccomp, ας δημιουργήσουμε ένα προφίλ Seccomp που απενεργοποιεί την κλήση συστήματος “chmod” όπως παρακάτω.
Στο παραπάνω προφίλ, έχουμε ορίσει την προεπιλεγμένη ενέργεια σε “allow” και έχουμε δημιουργήσει μια μαύρη λίστα για να απενεργοποιήσουμε το “chmod”. Για να είμαστε πιο ασφαλείς, μπορούμε να ορίσουμε την προεπιλεγμένη ενέργεια σε drop και να δημιουργήσουμε μια λευκή λίστα για να ενεργοποιούμε επιλεκτικά τις κλήσεις συστήματος. Η παρακάτω έξοδος δείχνει την κλήση “chmod” να επιστρέφει σφάλμα επειδή είναι απενεργοποιημένη στο προφίλ seccomp.
Ακολουθεί η έξοδος που δείχνει το “docker inspect” που εμφανίζει το προφίλ:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)