Linux ptrace如何不安全或包含竞争条件?

我想通过ptrace()实现一个沙箱,我开始一个进程,它的所有子进程都会创建(包括孙子等). ptrace()父进程,即主管.将是一个简单的C或Python程序,从概念上讲,它将限制文件系统访问(基于路径名和访问方向(读或写)和套接字访问(例如禁止套接字创建).

我应该注意什么,以便ptrace()d进程及其子进程(递归)将无法绕过沙箱?主管应该在fork()时间做些什么特别的事情以避免竞争条件?是否可以读取例如文件名的参数.从没有竞争条件的子进程重命名()?

这是我已经计划做的事情:

> PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE在fork()时避免(某些)种族编码
>默认情况下禁止所有系统调用,并组成允许的系统调用的白名单
>确保正确保护* at()系统调用变体(例如openat)

我还应该注意什么?

最佳答案
主要问题是许多系统调用参数(如文件名)作为用户空间指针传递给内核.任何允许同时运行且对指针指向的内存具有写访问权限的任务可以在主管检查这些参数并在内核对其进行操作之前有效地修改这些参数.当内核跟随指针时,指向的内容可能已被另一个可访问该内存的可调度任务(进程或线程)故意更改.例如:

Thread 1                           Supervisor             Thread 2
-----------------------------------------------------------------------------------------------------
strcpy(filename,"/dev/null");
open(filename,O_RDONLY);
                                   Check filename - OK
                                                          strcpy(filename,"/home/user/.ssh/id_rsa");
(in kernel) opens "/home/user/.ssh/id_rsa"

阻止这种情况的一种方法禁止使用CLONE_VM标志调用clone(),另外防止创建可写的MAP_SHARED内存映射(或至少跟踪它们,以便拒绝任何尝试直接引用来自此类数据的系统调用一个映射).在允许系统调用继续之前,您还可以将任何此类参数复制到非共享跳出缓冲区中.这将有效地防止任何线程应用程序在沙箱中运行.

另一种方法是SIGSTOP跟踪每个潜在危险系统调用中的其他进程,等待它们实际停止,然后允许系统调用继续进行.返回后,然后SIGCONT它们(除非它们已经停止).不用说,这可能会对性能产生重大影响.

(在堆栈上传递的syscall参数和共享打开文件表也存在类似的问题).

相关文章

文件查找(find) 1 find 简单的说,就是实时查找指定的内容或条件。特点:最新、最快、最准确。 用法:...
非交互式添加分区 方法一 添加/deb/sdb 下的分区,其实位置为1到1000M,第二个分区位置为1001至3000M,...
编译安装httpd 1 去官网下载源码包 为避免非法软件,一定要去官网下载http://www.apache.org httpd-2.4...
gdisk用法 gdisk - InteractiveGUIDpartitiontable (GPT) manipulator GPTfdisk (akagdisk) isatext-mo...
1 一定用快捷键 这里简单的说下几个常用的快捷按键。 1.1 移动光标快捷键 Crtl + a 光标回到命令行...
bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径。如果test命令中列出的条件成立...