gpt4 book ai didi

linux - 限制监听端口访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:13 27 4
gpt4 key购买 nike

我正在尝试创建一个沙箱来运行不受信任的用户代码,并且我希望允许用户在网络套接字上进行监听(在 Linux 上)。但我想限制他们可以监听的端口。我试过 apparmor,但 apparmor 只提供了一个选项来完全禁用 tcp 连接。我需要一个更细粒度的政策。

我也尝试过 ptrace,但只能拦截 sys_socketcall 系统调用,但无法获取端口号。此外,我知道 ptrace 并不完全安全,因此这不是一个合适的解决方案。

这是我一直试图用来拦截提供给绑定(bind)的端口号的代码:

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);
}

但它会出现段错误,因为在获取指向传递给系统调用的 sockaddr 结构的指针时,我一定是做错了什么。根据http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html ECX 中的第二个参数是指向参数列表的指针,其中参数是 [socket_fd, sockaddr*]。但它不起作用。为什么?

有没有比使用 ptrace 更好的方法来做到这一点?

最佳答案

SELinux 允许您非常严格地限制进程,包括端口访问。它甚至带有 sandbox命令可以在非常受限的沙箱域中运行进程,然后您可以将其替换为自定义域,以便根据需要提供对文件和端口的访问。

关于linux - 限制监听端口访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20373816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com