相关疑难解决方法(0)

使用ptrace()取消系统调用

出于某些安全目的,我使用ptrace来获取系统调用号码,如果这是一个危险的调用(例如10 for unlink),我想取消这个系统调用.

这是测试程序的源代码del.c.编译gcc -o del del.c.

#include <stdio.h>
#include <stdlib.h>
int main()
{
    remove("/root/abc.out");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是安全管理器源代码test.c.编译gcc -o test test.c.

#include <signal.h>
#include <syscall.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <errno.h>
#include <sys/user.h>
#include <sys/reg.h>
#include <sys/syscall.h>

int main()
{
    int i;
    pid_t child;
    int status;
    long orig_eax;
    child = fork();
    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        execl("/root/del", "del",  NULL);
    }
    else {
        i = …
Run Code Online (Sandbox Code Playgroud)

c linux ptrace

9
推荐指数
1
解决办法
3579
查看次数

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

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

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

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

  • PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE为了避免(一些)比赛coditions时,fork()荷兰国际集团
  • 默认情况下禁止所有系统调用,并组成允许的系统调用的白名单
  • 确保*at()系统调用变量(例如openat)得到适当保护

我还应该注意什么?

linux ptrace sandbox

5
推荐指数
1
解决办法
2380
查看次数

标签 统计

linux ×2

ptrace ×2

c ×1

sandbox ×1