Sandbox的安全机制 —— 使用 seccomp(1)

char *argv[] = {“/bin/sh”, NULL};

char *envp[] = {NULL};

syscall(SYS_execve, filename, argv, envp); // execve

return 0;

}

编译

gcc -o ban ban.c -l seccomp

须先实现安装

sudo apt install libseccomp-dev libseccomp2 seccomp

运行程序

songyangji@SongyangJi-Ubuntu-DeskStop:~/桌面$ ./ban

错误的系统调用 (核心已转储) # Bad system call (core dumped)

api rule


SCMP_SYS

根据系统调用名获取系统调用号,虽然你可以直接使用 __NR_syscall 直接指定,但是为了跨平台最好使用它获取。

int SCMP_SYS(syscall_name);

scmp_filter_ctx

结构体定义

typedef void * scmp_filter_ctx;

seccmp的过滤器上下文,保存、传递了我们传入的系统调用过滤条件。

seccomp_init

  • 函数说明:

seccomp_init的作用就是初始化 scmp_filter_ctx结构。

需要注意的是,任何其他libseccomp中的函数调用,必须在seccomp_init之后。

  • 函数定义

scmp_filter_ctx seccomp_init(uint32_t def_action);

  • 返回值

成功返回scmp_filter_ctx(过滤器上下文) ctx;

失败返回NULL

  • 参数说明

def_action用于指定默认行为,有效动作值如下:(当线程调用了seccomp过滤规则中没有相关配置规则的系统调用时触发)

  • SCMP_ACT_KILL

线程将会被内核以SIGSYS信号终止;

  • SCMP_ACT_KILL_PROCESS

整个进程被终止;

  • SCMP_ACT_TRAP

线程将会抛出一个SIGSYS信号;

  • SCMP_ACT_ERRNO(uint16_t errno)

线程调用与筛选规则匹配的系统调用时,它将收到一个errno的返回值;

  • SCMP_ACT_TRACE(uint16_t msg_num)

  • SCMP_ACT_LOG

不会对调用系统调用的线程产生任何影响,但系统调用会被记录到日志。

  • SCMP_ACT_ALLOW

不会对调用系统调用的线程产生任何影响。

seccomp_rule_addXXX

函数说明:

这个函数组都会向当前seccomp过滤器添加新的过滤规则。

调用应用程序提供的所有过滤器规则被组合成一个联合,并带有额外的逻辑来消除冗余的系统调用过滤器。

例如,如果添加了一条规则,该规则允许给定的系统调用具有一组特定的参数值,

然后又添加了一条规则,该规则允许相同的系统调用而不管参数值如何,

那么第一个更具体的规则将有效地从过滤器中删除第二个更通用的规则。

函数定义

int seccomp_rule_add(scmp_filter_ctx ctx, uint32_t action,

int syscall, unsigned int arg_cnt, …);

int seccomp_rule_add_exact(scmp_filter_ctx ctx, uint32_t action,

int syscall, unsigned int arg_cnt, …);

int seccomp_rule_add_array(scmp_filter_ctx ctx,

uint32_t

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值