权限与审核
模块运行在宿主的权限管控之下。能力在 manifest 里声明,宿主在加载时静态审核、运行时动态拦截。声明越少审核越顺,用不到的不写。
五类权限
| 权限 | 覆盖的行为 | 典型场景 |
|---|---|---|
fs | 文件读写(open、删除、重命名、建目录等) | 读写配置、导出报表 |
net | 网络访问(socket、urllib、requests、邮件协议等) | 调 HTTP API、发邮件 |
process | 启动子进程(subprocess、os.system、多进程) | 调 adb / ffmpeg |
native | 调用原生代码(ctypes、cffi、内存映射) | 调 DLL |
eval | 动态执行(eval、exec、compile、动态导入) | 脚本/模板引擎 |
{ "permissions": ["process", "fs"] }声明原则
- 最小权限:用不到就不声明。权限会展示给宿主与审核方,权限越多审核越严。
- 按需补齐:用
subprocess必须声明process,用requests必须声明net,否则加载审核或运行时被拒。 - fs 基本是必需的:严格安全模式下,Python 导入模块本身就要
open读文件。没声明fs,加载阶段就会报未声明权限 'fs',已拦截 open。这不是你的代码在读写文件,是解释器在工作。 - 别碰沙箱逃逸特征:读取
__builtins__、__globals__、__subclasses__这类属性的代码会被直接拒收。 eval/exec能不用就不用;确属必需,声明eval并在交付说明里解释用途。
宿主可能运行在严格的安全模式下(平台方决定)。严格模式除了拦截权限,还会校验跨模块调用是否声明了依赖。
被拒了怎么排查
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 模块加载失败,提示需要某权限 | 代码用了对应能力但没声明 | 在 permissions 补齐 |
| 运行时报"未声明权限" | 通过动态导入/延迟调用绕过了静态扫描,运行时被拦 | 补齐权限,或改用声明过的实现方式 |
未声明权限 'fs',已拦截 open | 严格模式下 manifest 没写 fs | manifest "permissions": ["fs"] |
| 提示沙箱逃逸特征 | 访问了 __globals__ / __subclasses__ 等 | 改写代码,不碰这些属性 |
| 提示存在多个模块类 | 入口文件里有多个模块基类子类 | 显式写 MODULE = YourClass |
| 提示动态执行需权限 | 用了 eval/exec/compile/__import__ | 改写;必需则声明 eval 并说明用途 |
MethodNotFound: 模块 'x' 未注册处理器 'y' | 定义了方法但没注册 | setup(ctx) 里 ctx.register_handler("y", self._y) |