我正在尝试使用 Amazon Lambda 来托管一个编程学习平台,我必须在其中执行简单的不受信任的 Python 代码。
我最近以一种简单的方式隔离用户代码的尝试是用于seccomp
禁用除从文件读取和写入stdout
/之外stderr
的任何内容,代码如下所示:
from pyseccomp import *
f = SyscallFilter(defaction=KILL)
f.add_rule(ALLOW, "open",
Arg(1, MASKED_EQ, os.O_RDONLY,
os.O_RDONLY | os.O_RDWR | os.O_WRONLY))
f.add_rule(ALLOW, "openat",
Arg(2, MASKED_EQ, os.O_RDONLY,
os.O_RDONLY | os.O_RDWR | os.O_WRONLY))
f.add_rule(ALLOW, "read")
f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stdout.fileno()))
f.add_rule(ALLOW, "write", Arg(0, EQ, sys.stderr.fileno()))
f.add_rule(ALLOW, "close")
f.add_rule(ALLOW, "getdents64")
f.add_rule(ALLOW, "exit_group")
f.add_rule(ALLOW, "rt_sigaction")
f.add_rule(ALLOW, "sigaltstack")
f.add_rule(ALLOW, "brk")
f.add_rule(ALLOW, "lseek")
f.add_rule(ALLOW, "fstat")
f.add_rule(ALLOW, "mmap")
f.add_rule(ALLOW, "mprotect")
f.add_rule(ALLOW, "stat")
f.add_rule(ALLOW, "ioctl", Arg(1, EQ, 0x5401)) # TCGETS
f.add_rule(ALLOW, "fcntl")
f.load()
这在本地运行良好,但在 Amazon Lambda 上,它没有找到该seccomp
库。
我尝试将libseccomp.2
我的 Debian 稳定机器包含在 Amazon Lambda 函数中,并且代码一直运行到f.load()
,但随后失败
Traceback (most recent call last):
File "sandbox.py", line 32, in <module>
f.load()
File "/var/task/pyseccomp.py", line 335, in load
_check_status(_libseccomp.seccomp_load(self._filter))
File "/var/task/pyseccomp.py", line 183, in _check_status
raise _build_oserror(-res)
PermissionError: [Errno 1] Operation not permitted
seccomp_load
返回是否EPERM
意味着我根本无法在 Amazon Lambda 上使用 seccomp,或者我做错了什么。