首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不一致的seccomp行为

不一致的seccomp行为
EN

Stack Overflow用户
提问于 2018-03-19 11:59:12
回答 1查看 476关注 0票数 3

我正在努力使用Linux的seccomp来包含不同的应用程序,我遇到了一个我无法解释的矛盾。

我已经尝试给你足够清楚的例子来重现这个问题。

我正在创建一个“保护模块”,它不允许进程调用set_robust_list (为了降低问题)。然后,我运行使用LD_PRELOAD注入这个“保护模块”的进程,并期望该进程在进行系统调用时停止。

我正在基于以下代码创建一个共享对象:

代码语言:javascript
复制
#include <seccomp.h>
#include <sys/prctl.h>

static void  __attribute__((constructor))  Initialization(void) {
   scmp_filter_ctx ctx;
   prctl(PR_SET_NO_NEW_PRIVS, 1);
   ctx = seccomp_init(SCMP_ACT_ALLOW); 
   seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(set_robust_list), 0);
   seccomp_load(ctx);
}

我正在用gcc -shared seccompdemo.c -lseccomp -o libseccompdemo.so构建它。

为了测试它,我正在构建这个可执行文件:

代码语言:javascript
复制
#define _GNU_SOURCE       
#include <unistd.h>
#include <sys/syscall.h>  

int main() {
   syscall(SYS_set_robust_list,0,0);
   return 0;
}

我要用gcc set_robust_list.c -o set_robust_list来做这个。

然后,与预期的一样,我使用上面的so运行这个可执行文件,它会被一个信号杀死:

代码语言:javascript
复制
$ LD_PRELOAD=./libseccompdemo.so ./set_robust_list
Bad system call (core dumped)

问题是当我试图用Java做同样的事情时。

我在java it上调用相同的“保护模块”,尽管我知道正在从strace调用set_robust_list,但它似乎不能工作:

代码语言:javascript
复制
$ LD_PRELOAD=./libseccompdemo.so java FileWriterTest /tmp/hosts < /etc/hosts
$ echo $?
0

请参见strace输出,它证明java正在调用‘set_鲁棒_list’:

代码语言:javascript
复制
$ strace -f java FileWriterTest /tmp/hosts < /etc/hosts 2>&1 | grep set_robust_list
set_robust_list(0x7f0b168af660, 24)     = 0
[pid 12847] set_robust_list(0x7f0b168ad9e0, 24 <unfinished ...>
[pid 12847] <... set_robust_list resumed> ) = 0
[pid 12848] set_robust_list(0x7f0b12b259e0, 24) = 0

我确实看到,java调用clone系统调用本质上是为了创建线程。我想可能seccomp过滤器不是继承的,但是根据它们的文档。

,我很高兴有人能解释一下为什么这不起作用。

这里需要参考的是Java代码:

代码语言:javascript
复制
import java.io.FileOutputStream;
import java.io.IOException;

public class FileWriterTest {

    public static void main(String[] args) {            
        try {
            FileOutputStream f = new FileOutputStream(args[0]);
            f.write(System.in.readAllBytes());
        }
        catch (IOException e) {
            System.out.format("Caught exception: "+e.toString());
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-21 17:44:08

Bad system call (core dumped)消息是您的shell,它告诉您由于SIGSYS信号而退出子进程。但是,如果SIGSYS被阻塞,系统调用将返回一个错误,该错误将以特定于应用程序的方式处理。

我猜pthread_create在执行时会阻塞信号,因此set_robust_list只能在SIGSYS阻塞的情况下调用,而不像您的示例代码那样不修改信号掩码。

无论如何,它不应该真正影响您想要完成的任务:将一个System.out.println("Hello from Java!");添加到您的java main中,如果预加载segcomp过滤器,您将看到它不会打印,因为main从未按预期的方式调用。

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

https://stackoverflow.com/questions/49362446

复制
相关文章

相似问题

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