首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制侦听端口访问

限制侦听端口访问
EN

Stack Overflow用户
提问于 2013-12-04 19:14:10
回答 1查看 791关注 0票数 1

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

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

下面是我一直尝试用来截获绑定端口号的代码:

代码语言:javascript
复制
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更好的方法呢?

EN

回答 1

Stack Overflow用户

发布于 2013-12-04 19:23:43

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20373816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档