safe_eval
(可能不)安全地运行 Python 和 NodeJS 代码
警告
代码均在本地使用 bubblewrap 沙箱运行,虽然有一定的措施,但不排除有未发现的安全隐患,请自行斟酌是否禁用此命令。
同时提醒用户,IdhagnBot只是一只小猫咪,别整天想着对他做奇怪的事情。(这话说出来不太对劲的)
用户说明
发送 /python <代码>
或者 /javascript <代码>
即可运行代码,代码可以换行。
运行有一定的时间、内存、输出和进程数限制,并且不接受标准输入。
/python
在沙箱中运行Python代码命令
/python <代码>
代码可以换行,不会自动输出最后的结果
限制:
不能访问沙箱外文件
只能使用Python标准库
进程限制为 128 个
时间限制为 10 秒
内存限制为 128.0 M
输出限制为 1024 字节
权限节点
safe_eval.python
/python print("Hello, World!")
示例
退出代码:0
标准输出:
Hello, World!
标准错误:(空)
/python
import os
while True:
os.fork()
退出代码:1
标准输出:(空)
标准错误:(末尾没有换行)
BlockingIOError: [Errno 11] Resource temporarily unavailable
(部分内容省略)
/python
import time
time.sleep(100)
退出代码:-9(超时)
标准输出:(空)
标准错误:(空)
/python
import random
a = bytearray()
while True:
a.extend(random.randbytes(1048576))
退出代码:1
标准输出:(空)
标准错误:
Traceback (most recent call last):
File "//do_eval.py", line 8, in <module>
exec(data["code"], {}, {})
File "<string>", line 4, in <module>
MemoryError
/javascript
在沙箱中运行NodeJS代码命令
/node <代码>
代码可以换行,不会自动输出最后的结果
限制:
不能访问沙箱外文件
只能使用Node标准库
进程限制为 128 个
时间限制为 10 秒
内存限制为 512.0 M
输出限制为 1024 字节
该命令有以下别名:js、node
别名
权限节点
/js
、/node
权限节点
safe_eval.javascript
/javascript console.log("Hello, World!");
示例
退出代码:0
标准输出:
Hello, World!
标准错误:(空)
搭建说明
safe_eval 需要安装 bubblewrap,执行 JavaScript 还需要安装 node 和 npm。
pacman -S bubblewrap nodejs npm
这个模块使用 bubblewrap 来创建沙箱,并使用 rlimit 来限制进程数和内存,因此只支持 Linux。对于 Python 会使用标准库 resources,对于 NodeJS,在首次启动时会调用 npm i posix
来安装 posix 库。
禁用命令
你可以在 configs/plugins.yaml 的黑名单上加入 safe_eval
,禁用 safe_eval 插件的加载,或者调整命令的权限,或者直接删掉 safe_eval 目录。
configs/plugins.yaml
blacklist:
- safe_eval
configs/permission.yaml
roles: # 禁用权限节点
default:
entries:
- node: safe_eval # 还记得权限是树形的吗?
value: false
commands: # 或者覆盖权限等级(可以二选一)
safe_eval.python: # 这里必须两个都写
level: super
safe_eval.javascript:
level: super