linux安全之seccomp

本文深入介绍了Linux的seccomp技术,从早期的strict模式到filter模式的演变。seccomp主要用于限制进程的系统调用,提供安全计算环境。在strict模式下,仅允许四个基本系统调用;而在filter模式下,通过Berkeley Packet Filter实现精细控制。设置seccomp使用prctl系统调用,拦截系统调用则在syscall_trace_enter函数中进行。filter模式下,用户可以定义复杂的过滤规则,根据返回值决定系统调用的执行与否。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

    seccomp按照字面意思可以理解为security computing,最早是作用于网格计算,主要通过限制进程的系统调用来完成部分沙箱隔离功能。

    通过man prctl可以发现,seccomp的引入是在内核2.6.23,早期的seccomp主要限制read、write、exit以及sigreturn四个系统调用。内核3.5版本引入filter模式,将seccomp分成strict和filter两种。其中strict依旧限制四种系统调用,而filter模式则借助了Berkeley Pakcet Filter来进行更细致的指令和参数控制。

 

STRICT模式

    我们可以查阅2.6.32内核代码来了解strict模式下的系统调用控制是如何实现的。

设置

    seccomp是通过prctl系统调用来进行设置的。

    具体使用: prctl(PR_SET_SECCOMP, 1,  0, 0, 0),第二个参数设置为1即可。

    通过sys_prctl进行追踪,在prctl_set_seccomp函数中,将当前进程结构(struct task_struct结构)中的seccomp中的mode标记设置为1,并将thread_info中flag设置为TIF_SECCOMP。

    我们可以由此猜测,只要将对应的进程task_struct结构中的对应标记mode置位,则可以进行进程系统调用限制。程序可通过prctl给自己做限制,如果想限制其他程序,则需要在自己制作的测试驱动中,通过对不同的测试程序设置mode,来测试该功能,参考如下:

read_lock(&tasklck);
for_each_process(p) {
    if (p->pid == seccomp_pid) {
        p_pid_address = &(p->seccomp.mode);
        ori_seccomp_mode = *p_pid_address;
        *p_pid_address = 1;
        break;
    }
 }
read_unlock(&tasklck);

 

拦截

    每个系统调用都会陷入系统调用控制函数syscall_trace_enter中,该函数中调用了secure_computing,系统调用号作为

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值