Seccomp
Reading time: 7 minutes
tip
AWS рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ:HackTricks Training AWS Red Team Expert (ARTE)
GCP рд╣реИрдХрд┐рдВрдЧ рд╕реАрдЦреЗрдВ рдФрд░ рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреЗрдВ!
- рд╣рдорд╛рд░реЗ ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ рд╣рдорд╛рд░реЗ Twitter ЁЯРж @hacktricks_live** рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред**
- рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ HackTricks рдФрд░ HackTricks Cloud рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PRs рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред
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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
#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
рдпрд╣ рдореЛрдб рдХрдирдлрд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрд░реНрдХрд▓реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
#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 рдиреАрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:
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 рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
docker run -it --security-opt seccomp=default.json modified-ubuntu strace uname
note
рдпрджрд┐ рдЖрдк Docker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ strace
рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЙрди syscalls рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг Seccomp рдиреАрддрд┐
Seccomp рдлреАрдЪрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдПрдХ Seccomp рдкреНрд░реЛрдлрд╛рдЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ тАЬchmodтАЭ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИред
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "chmod",
"action": "SCMP_ACT_ERRNO"
}
]
}
рдЙрдкрд░реЛрдХреНрдд рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдордиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЛ "рдЕрдиреБрдорддрд┐" рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ "chmod" рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд▓реА рд╕реВрдЪреА рдмрдирд╛рдИ рд╣реИред рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдбреНрд░реЙрдк рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЪрдпрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлреЗрдж рд╕реВрдЪреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ "chmod" рдХреЙрд▓ рдХреЛ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реБрдП рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ seccomp рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
$ 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" рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
"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 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ
- рд╕рджрд╕реНрдпрддрд╛ рдпреЛрдЬрдирд╛рдПрдБ рджреЗрдЦреЗрдВ!
- рд╣рдорд╛рд░реЗ ЁЯТм Discord рд╕рдореВрд╣ рдпрд╛ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рд╕рдореВрд╣ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдпрд╛ рд╣рдорд╛рд░реЗ Twitter ЁЯРж @hacktricks_live** рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред**
- рд╣реИрдХрд┐рдВрдЧ рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ рдФрд░ HackTricks рдФрд░ HackTricks Cloud рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдореЗрдВ PRs рд╕рдмрдорд┐рдЯ рдХрд░реЗрдВред