本文主要对Dify‑Sandbox的工作流程进行解析,通过多层隔离(文件系统、权限、syscall、网络),Dify‑Sandbox 能在高安全约束下高效运行用户代码。

一.启动与初始化
1.服务器启动
internal/server/server.go 中调用 initConfig(),读取 config.yaml、环境变量、以及 Python 依赖列表(python-requirements.txt)。
2.依赖准备
调用 initDependencies():
-
清空或创建
/var/sandbox/sandbox-python/ -
复制
python.so到沙箱目录 -
安全执行
pip install安装 Python 依赖。
3.拷贝共享库
PreparePythonDependenciesEnv() 会将配置文件中的 .so 文件(如 libssl.so、libcrypto.so)安全地复制到沙箱目录下。
二.安全隔离:chroot + seccomp
在生成临时 Python 脚本时,开头会注入对 python.so 的调用,用于初始化运行时环境,包括环境锁定和安全机制。
1.文件系统隔离
-
在执行 Python 脚本前,通过
syscall.Chroot将根目录切换到沙箱目录(例如sandbox-python/),从而阻断对主机文件系统的访问。 -
为提升安全性,执行后立即降权(
SetNoNewPrivs),避免后续权限提升。
2.系统调用限制(seccomp)
-
在
add_seccomp.go中定义了一个 syscall 白名单列表,用于初始化 seccomp 过滤器。 -
拒绝任何不在白名单中的系统调用,保障沙箱内代码无法执行敏感操作(如读写任意文件、网络挂载等)。
三.运行用户代码
1.接收 HTTP 请求
Gin 框架处理请求,验证 API key、控制 worker 数量。
2.生成脚本与密钥(InitializeEnvironment())
-
生成临时文件,将用户代码写入其中并加密(按 UID/GID)
-
返回临时脚本文件路径和密钥。
3.隔离执行(Run())
-
创建子进程,预加载
python.so,调用DifySeccomp(uid, gid, enable_network): -
切换根目录 (
chroot) -
降权限 (
SetNoNewPrivs) -
应用 seccomp 过滤器
-
脚本在此受限环境中运行,通过传入的密钥解密用户代码并执行
-
捕获 stdout,作为 HTTP 响应内容。
四.网络和依赖管理
1.网络隔离
-
在 Docker Compose 环境中通过单独的沙箱网络 + 代理容器实现网络控制。
-
在 Kubernetes 中则依赖 egress 策略配置。
2.语言与依赖支持
-
多语言支持(Python、Node.js),通过不同 syscall 白名单实现通用 seccomp 控制。
-
Python 依赖由
pip install按需安装,Node.js 目前尚未实现等效功能。
参考文献
[0] Dify‑Sandbox的工作流程:https://z0yrmerhgi8.feishu.cn/wiki/N5rFwF6D0icqZWkxCHgcw1H2nte
[1] dify-sandbox/README.md:https://github.com/langgenius/dify-sandbox/blob/main/README.md
知识星球:Dify源码剖析及答疑,Dify扩展系统源码,AI书籍课程|AI报告论文,公众号付费资料。加微信buxingtianxia21进NLP工程化资料群,以及Dify交流群。
(文:NLP工程化)