我想通过ptrace()
创建一个我启动的进程以及它的所有子进程(包括孙子进程等)来实现一个沙盒。父进程,ptrace()
即主管。将是一个简单的 C 或 Python 程序,从概念上讲,它将限制文件系统访问(基于路径名和访问方向(读或写)和套接字访问(例如,不允许创建套接字)。
我应该注意什么,以使ptrace()
d 进程及其子进程(递归)无法绕过沙箱?主管有什么特别的事情应该做fork()
以避免竞争条件吗?rename()
是否可以在没有竞争条件的情况下从子进程中读取 eg 的文件名参数?
这是我已经计划做的事情:
PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE
避免(某些)比赛fork()
规则- 默认禁止所有系统调用,并组成允许系统调用的白名单
- 确保
*at()
系统调用变体(例如openat
)得到适当保护
我还应该注意什么?