Online Playground 是怎么实现的?如何安全地执行任意代码?

刚刚发现 Try It Online 支持 Emacs Lisp:Try It Online ,这是它的部分实现:

其它部分也用 Shell 实现,不过我看不明白。要安全执行任意代码,至少要:

  1. 限制文件系统的访问
  2. 限制网络请求
  3. 限制 ram、cpu 使用量
  4. 限制执行时间(Try It Online 用 timeout 命令实现)

有没有同学了解过要怎么实现?特别是针对 Linux 系统安全方面,我也想实现个能在线执行 Emacs Lisp 的网页,服务器端架设在 Linux 里。

P.S. 另一个支持 Emacs Lisp 的是 https://repl.it/ ,它的功能更强大,不是支持 Batch,而是支持交互界面,不过我没有这个要求,Batch mode 足够了。

扔在容器里,坏了就重新开一个w

tg 上的这种 bot 都可以 rm -rf /

不太了解容器,在容器里执行任意危险操作最多把容器搞挂,不会对host机器有任何影响?

chroot

这里面奇葩语言真多。。。

关键在这个文件:

直接使用 cgroups 应该比 docker 更省开销。

1 个赞

第一次听说 cgroups,看了半小时也没看出个所以然来,只知道它能限制资源使用。

这个文件我能看出有限制 cpu 和 memory,但貌似也没有限制网络,但是我 试了 以下代码:

(with-current-buffer (url-retrieve-synchronously "http://example.com")
  (message "%s" (buffer-string)))

提示:

Contacting host: example.com:80
example.com/80 Name or service not known

不知道是不是 https://tio.run/ 屏蔽了服务器里主动发起的网络请求。

还有文件系统访问,它好像也没限制,ls -al / 能看到结果,不过好像也没问题,用户没有权限。所以应该新建个用户,就能限制文件系统访问。

应该不是容器,容器内核是共享的,安全性有限

cgroup 主要就是限制资源的,同样学容器的方案,网络对应的是 namespace

Try it online 实现,权限控制用 SELinux sandbox,资源控制用 cgroups。

感觉是类似这样(应该运行不了,还没搞明白 SELinux 和 cgroups 分别怎么用):

systemd-run -p CPUQuota=10% \
            -p MemoryHigh=100M \
            sandbox \
            timeout 5s \
            emacs -Q --eval '(print (+ 1 2 3))

systemd 集成了 cgroups,