我正在尝试创建一个沙箱来运行不受信任的用户代码,并且我希望允许用户监听网络套接字(在Linux上)。但我想限制他们可以监听的端口。我已经尝试过apparmor,但是apparmor只提供了一个完全禁用tcp连接的选项。我需要一个更细粒度的策略。
我也尝试过ptrace,但只能拦截sys_socketcall系统调用,但无法获得端口号。此外,我知道ptrace不是完全安全的,所以这不是一个合适的解决方案。
下面是我一直尝试用来截获绑定端口号的代码:
params[0] = ptrace(PTRACE_PEEKUSER,
child, 4 * EBX,
NULL);
params[1] = ptrace(PTRACE_PEEKUSER,
child, 4 * ECX,
NULL);
params[2] = ptrace(PTRACE_PEEKUSER,
child, 4 * EDX,
NULL);
printf("SYS_socketcall called with %u\n", (int)params[0]);
if(params[0] == 2){ // SYS_BIND
int call = params[0];
int *args = (intptr_t*)params[1];
int socket = args[0];
struct sockaddr_in *addr = (struct sockaddr_in*)args[1];
int len = args[2];
//struct sockaddr_in *addr = (struct sockaddr_in*)args[1];
printf("BIND CALLED WITH call: %d, fd: %d, addr: %p\n", call, socket, addr);
}但它出现了分段,因为我在获取传递给syscall的sockaddr结构的指针时肯定做错了什么。根据http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html的说法,ECX中的第二个参数是指向参数列表的指针,其中参数是socket_fd,sockaddr*。但它不起作用。为什么?
有没有比ptrace更好的方法呢?
发布于 2013-12-04 19:23:43
SELinux将允许您非常严格地限制进程,包括端口访问。它甚至附带了一个sandbox命令,该命令可以在一个非常受限的沙箱域中运行一个进程,然后您可以将其替换为自定义域,以便根据需要提供对文件和端口的访问。
https://stackoverflow.com/questions/20373816
复制相似问题