本文主要对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工程化)