沙箱
就是把用户态和内核态相互分离开,让用户态的进程,不要影响到内核态,从而保证系统安全
prctl seccomp相当于内核中的一种安全机制,正常情况下,程序可以使用所有的syscall,但是当劫持程序流程之后通过exeve来呼叫syscall得到shell时seccomp边排上了用场,他可以过滤掉某些syscall,只允许使用部分syscall。
prctl函数
int prctl ( int option, unsigned long argv2, unsigned long argv3, unsigned long argv4,unsigned long argv3)
第一个参数,就是它设置的模式
当第一个参数是 22
第二个参数为1的时候,表示允许的系统调用有read,write,exit和sigereturn;
当第二个参数2的时候,表示允许的系统调用 由 第三个参数 指向sock_fprog结构体定义,该结构体成员指针指向的sock_filter 可以 定义过滤任意系统调用和系统调用参数。 sock_filter结构体这里,就是我们要设置规则的地方。
当第一个参数是 38
表示禁用系统调用execve()函数,同时,这个选项 可以通过 fork()函数和 clone()函数继承给子进程。
BPF过滤规则
用到Seccomp-tools这个工具
BPF指令集简介
BPF_LD:加载操作,BPF_H表示按照字节传送,BPF_W表示按照双字来传送,BPF_B表示传送单个字节。
BPF_LDX:从内存中加载byte/half-word/word/double-word。
BPF_ST,BPF_STX:存储操作
BPF_ALU,BPT_ALU64:逻辑操作运算。
BPT_JMP:跳转操作,可以和JGE,JGT,JEQ,JSET一起表示有条件的跳转,和BPF_JA一起表示没有条件的跳转。
从prctl函数开始学习沙箱规则 - Riv4ille - 博客园 (cnblogs.com)
例题(pwnable.tw —— orw)
用seccomp-tools 看一下它的过滤规则,可以发现,只有rt_signreturn,exit_group,exit,open,read,write这几个系统调用是可以被调用的。
seccomp.h对prctl函数进行了封装,有了seccomp_init(),seccomp_rule_add(),seccomp_load()函数来进行沙箱规则的设置。