函数说明:
这个函数组都会向当前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 action, int syscall,
unsigned int arg_cnt,
const struct scmp_arg_cmp *arg_array);
int seccomp_rule_add_exact_array(scmp_filter_ctx ctx,
uint32_t action, int syscall,
unsigned int arg_cnt,
const struct scmp_arg_cmp *arg_array);
参数说明
-
- action有效动作值如下:(当线程调用了
seccomp
过滤规则中有相关配置规则的系统调用时触发)
- action有效动作值如下:(当线程调用了
-
SCMP_ACT_KILL
线程将会被内核终止;
- 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
不会对调用系统调用的线程产生任何影响(也就是允许调用这个system call)。
- SCMP_ACT_NOTIFY
略
-
- arg_cnt 指定规则配置的系统调用的参数的匹配情况的个数(因为后面是一个变长数组)
-
- 边长数组的元素是
scmp_arg_cmp
结构体,定义如下。
- 边长数组的元素是
系统调用的参数比较规则相关定义:
/**
- Comparison operators
*/
enum scmp_compare {
_SCMP_CMP_MIN = 0,
SCMP_CMP_NE = 1, /**< not equal */
SCMP_CMP_LT = 2, /**< less than */
SCMP_CMP_LE = 3, /**< less than or equal */
SCMP_CMP_EQ = 4, /**< equal */
SCMP_CMP_GE = 5, /**< greater than or equal */
SCMP_CMP_GT = 6, /**< greater than */
SCMP_CMP_MASKED_EQ = 7, /**< masked equality */
_SCMP_CMP_MAX,
};
/**
- Argument datum
*/
typedef uint64_t scmp_datum_t;
/**
- Argument / Value comparison definition
*/
struct scmp_arg_cmp {
unsigned int arg; /**< argument number, starting at 0 */
enum scmp_compare op; /**< the comparison op, e.g. SCMP_CMP_* */
scmp_datum_t datum_a;
scmp_datum_t datum_b;
};
有效比较操作值( op )如下:
- SCMP_CMP_NE
参数值不等于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_NE , datum )
- SCMP_CMP_LT
参数值小于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_LT , datum )
- SCMP_CMP_LE
参数值小于或等于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_LE , datum )
- SCMP_CMP_EQ
参数值等于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_EQ , datum )
- SCMP_CMP_GE
参数值大于或等于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_GE , datum )
- SCMP_CMP_GT
参数值大于基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_GT , datum )
- SCMP_CMP_MASKED_EQ
当掩码参数值等于掩码基准值时匹配,例如:
SCMP_CMP( arg , SCMP_CMP_MASKED_EQ , mask , datum )
注意,scmp_arg_cmp 此结构不能直接生成,需要调用它提供的宏生成,有如下宏:
struct scmp_arg_cmp SCMP_CMP(unsigned int arg,
enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A0(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A1(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A2(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A3(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A4(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A5(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_CMP64(unsigned int arg,
enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A0_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A1_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A2_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A3_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A4_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A5_64(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_CMP32(unsigned int arg,
enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A0_32(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A1_32(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A2_32(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A3_32(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A4_32(enum scmp_compare op, …);
struct scmp_arg_cmp SCMP_A5_32(enum scmp_compare op, …);
解释一下上面的这么多宏的功能分类依据,A{0-5}中的0、1、2、3、4、5用于指定系统调用的那个参数,
32还是64自然是指定32位机器还是64位机器,
SCMP_CMP的第一个参数unsigned int arg
的功能就是A{$arg_num}
中的$arg_num
,
所有宏的第一个参数op
就是用于指定比较的规则,如上已经介绍过。
返回值
函数成功时返回零;
失败时返回负的errno值。
举例
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 1, SCMP_CMP(1, SCMP_CMP_MASKED_EQ, O_WRONLY | O_RDWR, 0))
指定open(const *path, int oflags)
系统调用的oflags
参数如果既没有O_WRONLY,也没有O_RDWR(二进制对应位),就是允许的,
换言之这条规则禁用掉了 open的 w、rw。
seccomp_load
- 函数说明:
将ctx提供的seccomp过滤器加载到内核中;
如果函数成功,新的 seccomp 过滤器将在函数返回时处于活动状态
- 函数定义
int seccomp_load(scmp_filter_ctx ctx);
- 返回值
成功时返回0,失败时返回以下错误码:
-ECANCELED
There was a system failure beyond the control of the
library.
-EFAULT
Internal libseccomp failure.
-EINVAL
Invalid input, either the context or architecture token is invalid.
-ENOMEM
The library was unable to allocate enough memory.
-ESRCH
Unable to load the filter due to thread issues.
seccomp_release(3)
- 函数说明:
释放ctx 中的 seccomp 过滤器结构的内存,该过滤器首先由seccomp_init(3)或seccomp_reset(3)初始化,
并释放与给定 seccomp 过滤器上下文关联的任何内存。
加载到内核中的任何 seccomp过滤器不受影响。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
3520)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-oOLAgsaQ-1711080253521)]
总结
无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。
[外链图片转存中…(img-Sa1KyQ9m-1711080253521)]