跳到主要内容

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