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.
Original/Strict Mode
Σε αυτή τη λειτουργία, το Seccomp επιτρέπει μόνο τις κλήσεις συστήματοςexit(), sigreturn(), read() και write() σε ήδη ανοιχτούς περιγραφείς αρχείων. Αν γίνει οποιαδήποτε άλλη κλήση συστήματος, η διαδικασία τερματίζεται χρησιμοποιώντας SIGKILL
seccomp_strict.c
#include<fcntl.h>#include<stdio.h>#include<unistd.h>#include<string.h>#include<linux/seccomp.h>#include<sys/prctl.h>//From https://sysdig.com/blog/selinux-seccomp-falco-technical-discussion///gcc seccomp_strict.c -o seccomp_strictintmain(int argc,char**argv){int output =open("output.txt", O_WRONLY);constchar*val ="test";//enables strict seccomp modeprintf("Calling prctl() to set seccomp strict mode...\n");prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);//This is allowed as the file was already openedprintf("Writing to an already open file...\n");write(output, val, strlen(val)+1);//This isn't allowedprintf("Trying to open file for reading...\n");int input =open("output.txt", O_RDONLY);printf("You will not see this message--the process will be killed first\n");}
Seccomp-bpf
Αυτή η λειτουργία επιτρέπει φιλτράρισμα των συστημικών κλήσεων χρησιμοποιώντας μια ρυθμιζόμενη πολιτική που υλοποιείται χρησιμοποιώντας κανόνες Berkeley Packet Filter.
seccomp_bpf.c
#include<seccomp.h>#include<unistd.h>#include<stdio.h>#include<errno.h>//https://security.stackexchange.com/questions/168452/how-is-sandboxing-implemented/175373//gcc seccomp_bpf.c -o seccomp_bpf -lseccompvoidmain(void) {/* initialize the libseccomp context */scmp_filter_ctx ctx =seccomp_init(SCMP_ACT_KILL);/* allow exiting */printf("Adding rule : Allow exit_group\n");seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group),0);/* allow getting the current pid *///printf("Adding rule : Allow getpid\n");//seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getpid), 0);printf("Adding rule : Deny getpid\n");seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(getpid),0);/* allow changing data segment size, as required by glibc */printf("Adding rule : Allow brk\n");seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(brk),0);/* allow writing up to 512 bytes to fd 1 */printf("Adding rule : Allow write upto 512 bytes to FD 1\n");seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write),2,SCMP_A0(SCMP_CMP_EQ,1),SCMP_A2(SCMP_CMP_LE,512));/* if writing to any other fd, return -EBADF */printf("Adding rule : Deny write to any FD except 1 \n");seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EBADF), SCMP_SYS(write),1,SCMP_A0(SCMP_CMP_NE,1));/* load and enforce the filters */printf("Load rules and enforce \n");seccomp_load(ctx);seccomp_release(ctx);//Get the getpid is denied, a weird number will be returned like//this process is -9printf("this process is %d\n", getpid());}
Αν θέλετε για παράδειγμα να απαγορεύσετε σε ένα κοντέινερ να εκτελεί κάποιο syscall όπως το uname, μπορείτε να κατεβάσετε το προεπιλεγμένο προφίλ από https://github.com/moby/moby/blob/master/profiles/seccomp/default.json και απλά να αφαιρέσετε τη συμβολοσειρά uname από τη λίστα.
Αν θέλετε να βεβαιωθείτε ότι κάποιο δυαδικό αρχείο δεν λειτουργεί μέσα σε ένα κοντέινερ docker, μπορείτε να χρησιμοποιήσετε το strace για να καταγράψετε τα syscalls που χρησιμοποιεί το δυαδικό αρχείο και στη συνέχεια να τα απαγορεύσετε.
Στο παρακάτω παράδειγμα ανακαλύπτονται τα syscalls του uname:
Στο παραπάνω προφίλ, έχουμε ορίσει την προεπιλεγμένη ενέργεια σε “allow” και έχουμε δημιουργήσει μια μαύρη λίστα για να απενεργοποιήσουμε το “chmod”. Για να είμαστε πιο ασφαλείς, μπορούμε να ορίσουμε την προεπιλεγμένη ενέργεια σε drop και να δημιουργήσουμε μια λευκή λίστα για να ενεργοποιούμε επιλεκτικά τις κλήσεις συστήματος.
Η παρακάτω έξοδος δείχνει την κλήση “chmod” να επιστρέφει σφάλμα επειδή είναι απενεργοποιημένη στο προφίλ seccomp.
Ακολουθεί η έξοδος που δείχνει το “docker inspect” που εμφανίζει το προφίλ:
"SecurityOpt": ["seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}"<div data-gb-custom-block data-tag="hint" data-style='success'>Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details><summary>Support HackTricks</summary>* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details></div></details></div></details></div></details></div></details></div></details></div></details></div></details></div></details></div></details></div>