Dify‑Sandbox的工作流程

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

发表评论