- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Linux 的 seccomp 来包含不同的应用程序,但我遇到了一个我无法解释的不一致问题。
我已尝试为您提供足够清晰的示例以重现该问题。
我正在创建一个“保护器模块”,它不允许进程调用 set_robust_list
(为了演示问题)。然后我运行进程,在其中使用 LD_PRELOAD 注入(inject)这个“保护器模块”,并期望进程在进行此系统调用时停止。
我正在基于这段代码创建一个共享对象:
#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
构建它。
然后为了测试它,我正在构建这个可执行文件:
#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
构建它。
然后正如预期的那样我用上面的命令运行这个可执行文件,它被一个信号杀死:
$ LD_PRELOAD=./libseccompdemo.so ./set_robust_list
Bad system call (core dumped)
问题是当我试图用 Java 做同样的事情时。
我在 java 上调用相同的“保护器模块”它似乎不起作用尽管我知道 Java 正在从 strace 调用 set_robust_list
:
$ LD_PRELOAD=./libseccompdemo.so java FileWriterTest /tmp/hosts < /etc/hosts
$ echo $?
0
查看 strace 输出证明 java 正在调用 'set_robust_list':
$ 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 代码:
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());
}
}
}
最佳答案
Bad system call (core dumped)
消息是您的 shell 告诉您子进程因 SIGSYS
信号而退出。但是,如果 SIGSYS
被阻塞,系统调用将只返回一个错误,该错误将以特定于应用程序的方式进行处理。
我猜 pthread_create
在执行时会阻塞信号,因此 set_robust_list
只会在 SIGSYS
被阻塞的情况下被调用,这与您的示例代码不同修改信号掩码。
无论如何,它不应该真正影响你想要完成的事情:添加一个 System.out.println("Hello from Java!");
到你的 java main
如果预加载 segcomp 过滤器,您将看到它不会打印,因为 main
从未按预期调用。
关于java - 不一致的 seccomp 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49362446/
我正在编写一个受 seccomp 保护的应用程序。 此应用程序使用 fork() 然后使用 execvp() 来运行某些程序。 根据 Linux kernel documentation.,似乎我程序
我正在尝试为不同的系统调用实现陷阱函数。目标是,经纪人将执行它们,然后返回结果。所以客户端不会自己执行命令。 Seccomp 提供了实现这一目标的能力: 我做了什么? 为 SIGSYS 信号初始化信号
在设置严格模式 seccomp 后,流向 EXIT_SUCCESS。在 main 的末尾调用 syscall(SYS_exit, EXIT_SUCCESS); 是正确的做法吗? #include #
所以我偶然发现了一个使用 seccomp 来过滤掉一些系统调用的 C 程序。无论如何,除了暴力破解之外,还有什么可以找出实际允许的系统调用。 提前致谢 最佳答案 如果可以编译C程序,可以调用secco
我最近在用 libcap 和 libseccomp 编写程序,我发现将它们一起使用时会出现问题。 在下面的最小可重现示例中,我首先将当前进程的能力设置为仅 P(inheritable) = CAP_N
问题: docker 在哪里存储它的默认 seccomp 配置文件? 似乎这在任何地方都没有记录(至少我找不到)。我能找到的是github上文件的内容:https://github.com/moby/
这是 pwnable.kr 中的最新问题,asm.c 使用 seccomp 来限制我的系统调用,除了:write()、open()、read() 和 exit()。 asm.c: #include
我有一个现有程序,我想使用 seccomp (v2) 对其进行沙盒处理。 我如何才能找到我需要为该程序允许的 seccomp 规则? 我尝试为 strace -xfc a.out 打印的所有系统调用添
问题:我正在尝试使用 seccomp,但我不明白为什么 gcc 告诉我 seccomp() 函数调用具有隐式声明。 #define _GNU_SOURCE #include // offsetof
我正在使用 Linux 的 seccomp 来包含不同的应用程序,但我遇到了一个我无法解释的不一致问题。 我已尝试为您提供足够清晰的示例以重现该问题。 我正在创建一个“保护器模块”,它不允许进程调用
为什么进入 seccomp 模式的进程总是在退出时被杀死? $ cat simple.c #include #include #include int main( int argc, char
我正在研究 seccomp-bpf 的实现细节,这是从 3.5 版开始引入 Linux 的系统调用过滤机制。我从 Linux 3.10 查看了 kernel/seccomp.c 的源代码,想问一些关于
我正在使用 seccomp 过滤器来限制进程进行的系统调用。最多使用系统调用的白名单来允许和禁止系统调用是可以理解的。我坚持由 seccomp 规则生成的 ptrace 事件的概念。例如,我可以禁止
我现在正在实现在 fork 之后在子进程中运行另一个程序。 int main(int argc, char *argv[]) { pid_t pid = 0; int status;
我有一个函数 f(),它返回 0 或 1 - 0 表示假,1 表示真。我想做的是用 seccomp-bpf 设置一个规则,这样系统调用“fopen”只有在 f( --fopen 的第一个参数 -- )
有没有类似seccomp的东西可以在 Windows 上运行吗? 它应该将所有系统调用限制在一些非常有限的集合中,比如只读取和写入已经打开的文件。 描述为 sandbox for Chromium 的
我在项目中通过 python-prctl 启用了 seccomp。我不太清楚如何彻底退出 - 结果总是被杀死。 我看到一些示例使用 ctypes 或 ffi 来尝试引用 libc,但如果我希望它们使用
我刚刚开始学习 seccomp 过滤器,我正在使用 libseccomp v2.4.4。我试图编写一个基本的白名单过滤器,它只允许写入名为 file1 的文件。但我在 STDOUT 中收到“错误的系统
我想限制一个进程(在 docker 容器中运行)执行某些功能 - 我有 2 个选项,要么限制它的功能,要么我使用 seccomp 配置文件。 我的问题是在什么情况下选择哪个选项?我对这个领域比较陌生,
我有这个 seccomp 个人资料: { "defaultAction": "SCMP_ACT_ALLOW", "architectures": [ "SCMP_ARCH_X86_64",
我是一名优秀的程序员,十分优秀!