刚刚发现 Try It Online 支持 Emacs Lisp:Try It Online ,这是它的部分实现:
其它部分也用 Shell 实现,不过我看不明白。要安全执行任意代码,至少要:
- 限制文件系统的访问
- 限制网络请求
- 限制 ram、cpu 使用量
- 限制执行时间(Try It Online 用
timeout
命令实现)
有没有同学了解过要怎么实现?特别是针对 Linux 系统安全方面,我也想实现个能在线执行 Emacs Lisp 的网页,服务器端架设在 Linux 里。
P.S. 另一个支持 Emacs Lisp 的是 https://repl.it/ ,它的功能更强大,不是支持 Batch,而是支持交互界面,不过我没有这个要求,Batch mode 足够了。
Nasy
2
扔在容器里,坏了就重新开一个w
tg 上的这种 bot 都可以 rm -rf /
的
不太了解容器,在容器里执行任意危险操作最多把容器搞挂,不会对host机器有任何影响?
关键在这个文件:
直接使用 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,