Seccomp

Reading time: 7 minutes

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Basic Information

Seccomp, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм Secure Computing mode рд╣реИ, Linux kernel рдХреА рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдПрдХ рд╕реАрдорд┐рдд рд╕реЗрдЯ (exit(), sigreturn(), read(), рдФрд░ write() рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдЦреБрд▓реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░) рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ SIGKILL рдпрд╛ SIGSYS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрдВрддреНрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрдирд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

Seccomp рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: PR_SET_SECCOMP рдХреЗ рд╕рд╛рде prctl(2) рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╛ Linux kernels 3.17 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдХреЗ рд▓рд┐рдП, seccomp(2) рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред /proc/self/seccomp рдореЗрдВ рд▓рд┐рдЦрдХрд░ seccomp рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдкреБрд░рд╛рдирд╛ рддрд░реАрдХрд╛ prctl() рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХ рд╕реБрдзрд╛рд░, seccomp-bpf, рдПрдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдиреАрддрд┐ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ Berkeley Packet Filter (BPF) рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ OpenSSH, vsftpd, рдФрд░ Chrome OS рдФрд░ Linux рдкрд░ Chrome/Chromium рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдЬреИрд╕реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд▓рдЪреАрд▓реЗ рдФрд░ рдХреБрд╢рд▓ syscall рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдм рдЕрдкреНрд░рдЪрд▓рд┐рдд systrace рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

Original/Strict Mode

рдЗрд╕ рдореЛрдб рдореЗрдВ Seccomp рдХреЗрд╡рд▓ syscalls exit(), sigreturn(), read() рдФрд░ write() рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЦреБрд▓реЗ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп syscall рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ 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_strict int main(int argc, char **argv) { int output = open("output.txt", O_WRONLY); const char *val = "test"; //enables strict seccomp mode printf("Calling prctl() to set seccomp strict mode...\n"); prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT); //This is allowed as the file was already opened printf("Writing to an already open file...\n"); write(output, val, strlen(val)+1); //This isn't allowed printf("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

рдпрд╣ рдореЛрдб рдХрдирдлрд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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 -lseccomp void main(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 -9 printf("this process is %d\n", getpid()); }

Seccomp in Docker

Seccomp-bpf рдХрд╛ рд╕рдорд░реНрдерди Docker рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ syscalls рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЬрд┐рд╕рд╕реЗ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреНрд╡рд╛рд░рд╛ рдмреНрд▓реЙрдХ рдХрд┐рдП рдЧрдП syscalls рдХреЛ https://docs.docker.com/engine/security/seccomp/ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ seccomp рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдпрд╣рд╛рдБ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ https://github.com/moby/moby/blob/master/profiles/seccomp/default.jsonред
рдЖрдк рдПрдХ рд╡рд┐рднрд┐рдиреНрди seccomp рдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

bash
docker run --rm \ -it \ --security-opt seccomp=/path/to/seccomp/profile.json \ hello-world

рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХрдВрдЯреЗрдирд░ рдХреЛ рдХреБрдЫ syscall рдЬреИрд╕реЗ uname рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк https://github.com/moby/moby/blob/master/profiles/seccomp/default.json рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рд╕реВрдЪреА рд╕реЗ uname рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдмрд╛рдЗрдирд░реА рдПрдХ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рди рдХрд░реЗ, рддреЛ рдЖрдк strace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рдЗрдирд░реА рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ syscalls рдХреА рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ uname рдХреЗ syscalls рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

bash
docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname

note

рдпрджрд┐ рдЖрдк Docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ strace рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрди syscalls рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг Seccomp рдиреАрддрд┐

Example from here

Seccomp рдлреАрдЪрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ Seccomp рдкреНрд░реЛрдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ тАЬchmodтАЭ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред

json
{ "defaultAction": "SCMP_ACT_ALLOW", "syscalls": [ { "name": "chmod", "action": "SCMP_ACT_ERRNO" } ] }

рдЙрдкрд░реЛрдХреНрдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдордиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдЕрдиреБрдорддрд┐" рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ "chmod" рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд▓реА рд╕реВрдЪреА рдмрдирд╛рдИ рд╣реИред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреНрд░реЙрдк рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЪрдпрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлреЗрдж рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ "chmod" рдХреЙрд▓ рдХреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реБрдП рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ seccomp рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

bash
$ docker run --rm -it --security-opt seccomp:/home/smakam14/seccomp/profile.json busybox chmod 400 /etc/hosts chmod: /etc/hosts: Operation not permitted

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ "docker inspect" рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:

json
"SecurityOpt": [ "seccomp:{\"defaultAction\":\"SCMP_ACT_ALLOW\",\"syscalls\":[{\"name\":\"chmod\",\"action\":\"SCMP_ACT_ERRNO\"}]}" ]

tip

AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ