如果我想禁止在文件系统上执行程序,我可以使用noexecmount 选项。
但是,这不适用于通过dlopen(). 那么使用 nacl 或 seccomp 的方法是什么?(这是用于不受信任的字节码沙盒,我不希望用户能够执行他们上传的共享库)
同时,像 gconv 这样的库需要能够执行它们的.so模块。
以编程方式 fork()ing 或 exec()uting 其他程序已被禁用。
如果我想禁止在文件系统上执行程序,我可以使用noexecmount 选项。
但是,这不适用于通过dlopen(). 那么使用 nacl 或 seccomp 的方法是什么?(这是用于不受信任的字节码沙盒,我不希望用户能够执行他们上传的共享库)
同时,像 gconv 这样的库需要能够执行它们的.so模块。
以编程方式 fork()ing 或 exec()uting 其他程序已被禁用。
但是,这不适用于动态库。
它确实适用于动态库。如果共享对象位于使用 noexec 选项挂载的分区上,则无法加载它,否则noexec将毫无用处。
$ grep -E '/tmp |ext4' /proc/mounts
/dev/mapper/root_crypt / ext4 rw,nodev,noatime,data=ordered 0 0
tmpfs /tmp tmpfs rw,nosuid,nodev,noexec,noatime,size=2031200k 0 0
$ cat > main.c
#include <stdio.h>
void main(void)
{
printf("%d\n", getpid());
}
$ gcc -o main main.c
$ ./main
4950
$ cat > shared.c
int getpid(void)
{
return 1;
}
$ gcc -shared -fPIC -o shared.so shared.c
$ LD_PRELOAD=./shared.so ./main
1
$ mv shared.so /tmp
$ LD_PRELOAD=/tmp/shared.so ./main
ERROR: ld.so: object '/tmp/shared.so' from LD_PRELOAD cannot be preloaded (failed to map segment from shared object): ignored.
4978
如果您想使用 seccomp 来防止执行不受信任的共享对象,您可以通过限制对 、 和显然的调用来做到mmap()这mprotect()一点execve()。确保该过程不能用PROT_EXEC. mmap()限制文件是不够的,因为可以通过文件描述符传递任意数据,并且mprotect()可以更改任意内存页的权限以使其可执行。此外,由于此示例是黑名单而不是白名单,因此您还必须拒绝访问某些ptrace()参数,因为它们可用于突破 seccomp 沙箱。
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(mmap), 1,
SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
if (rc == -1)
goto out;
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCESS), SCMP_SYS(mprotect), 1,
SCMP_A2(SCMP_CMP_MASKED_EQ, PROT_EXEC, PROT_EXEC));
if (rc == -1)
goto out;
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EACCESS), SCMP_SYS(execve), 0);
if (rc == -1)
goto out;
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
SCMP_A0(SCMP_CMP_EQ, PTRACE_POKEUSER));
if (rc == -1)
goto out;
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
SCMP_A0(SCMP_CMP_EQ, PTRACE_SETREGS));
if (rc == -1)
goto out;
rc = seccomp_rule_add(ctx, SCMP_ACT_ERRNO(EPERM), SCMP_SYS(ptrace), 1,
SCMP_A0(SCMP_CMP_EQ, PTRACE_SETREGSET));
if (rc == -1)
goto out;
可能有一些方法可以绕过我没有考虑过的这个 seccomp 片段,所以这只是为了让您了解它需要什么。
我从来没有使用过 NaCl,所以我不能说你会如何限制它的执行。