📢 Release 1.0.0-beta.12(2026-08-12)现已推出
Arcadia

隔离运行(沙箱)

该功能目前处于实验性

arcadia run <name/path/url> --sandbox

沙箱模式仍支持使用 arcadia stop 终止运行中的代码文件,但不支持守护进程 arcadia rund 模式。

什么是沙箱?

沙箱是一种将代码进程放入受限独立环境中运行的隔离机制。启用后,代码只能访问自身文件目录和必要的系统运行库,除这些路径外无法读取其它目录中的文件,也无法调试其它进程。特别适合运行来自不可信来源的代码文件。

此功能由 Sandlock 驱动,Arcadia CLI 仅作为 Sandlock 的包装器,沙箱已成为 AI Agent 运行的默认环境配置。

预设配置

启用沙箱功能后,代码进程将按以下预设配置运行,这是沙箱的基准隔离状态,可通过下方的自定义配置选项进一步调整:

  • 文件系统:仅可读写代码文件所在目录与 /tmp,可读取系统运行库等只读挂载,其余目录不可访问
  • 网络:默认禁止访问本机与内网地址,公网访问正常
  • 端口绑定:默认禁止监听任何端口
  • 环境变量:全量继承当前运行环境的所有变量,与正常运行一致
  • 进程可见性:与宿主共享 PID 命名空间,/proc 中仍可见宿主进程;沙箱通过 seccomp 阻断对其它进程的调试等危险操作

自定义配置项

以下选项均需配合 --sandbox 使用,用于在预设配置基础上进行自定义调整。

选项选项值描述
--sandbox-net-allow出站白名单,仅放行匹配规则的出站连接(指定后取代默认网络预设),可多次使用,与其余出站控制选项互斥
--sandbox-net-deny出站黑名单,在默认屏蔽本地的基础上追加屏蔽匹配规则的出站连接,可多次使用,可与 --sandbox-net-deny-local 叠加,与 --sandbox-net-allow--sandbox-net-deny-all 互斥
--sandbox-net-deny-all完全断网,阻断所有出站网络连接,与其余出站控制及 HTTP 过滤选项互斥(端口绑定不受影响)
--sandbox-net-deny-local屏蔽局域网与本机,阻断本地回环、私网网段及云元数据地址段(169.254.0.0/16)及 IPv6 回环、ULA、链路本地地址,可与 --sandbox-net-deny 叠加,与 --sandbox-net-allow--sandbox-net-deny-all 互斥
--sandbox-net-allow-bind允许绑定指定 TCP 端口,支持端口列表与区间(如 80808080,9000-9005),与出站控制独立,可多次使用
--sandbox-net-allow-bind-all允许绑定任意端口,放行所有 TCP 端口绑定监听,与 --sandbox-net-allow-bind 互斥
--sandbox-http-allowHTTP 请求白名单,仅放行匹配的 HTTP/HTTPS 请求(格式:"METHOD host/path"),可多次使用,与 --sandbox-http-deny 互斥
--sandbox-http-denyHTTP 请求黑名单,屏蔽匹配的 HTTP/HTTPS 请求(格式:"METHOD host/path"),可多次使用,与 --sandbox-http-allow 互斥
--sandbox-max-memory内存上限,限制进程最大内存用量,支持 M(兆字节)和 G(吉字节)单位(不区分大小写)
--sandbox-clear-env清空环境变量,移除所有继承的环境变量(仅保留最小系统路径),可配合 --sandbox-env 补充注入
--sandbox-env注入环境变量,向进程追加自定义环境变量(KEY=VALUE),可多次使用
--sandbox-allow-env-whitelist环境变量白名单,仅保留逗号分隔的指定变量(隐式启用清空),与 --sandbox-clear-env 互斥
--sandbox-allow-env-blacklist环境变量黑名单,排除逗号分隔的指定变量(其余正常继承),与 --sandbox-clear-env--sandbox-allow-env-whitelist 互斥
--sandbox-allow-read允许只读访问,在预设挂载之外追加只读目录,可多次使用
--sandbox-allow-write允许读写访问,在预设挂载之外追加读写目录,可多次使用
--sandbox-opts透传底层参数,将原始参数直接传递给 sandlock(选项名与值写在同一字符串内),可多次使用

使用示例

更新沙箱引擎

Arcadia CLI 会在首次使用沙箱功能时自动下载并安装 Sandlock,但不会自动检查新版本。如若首次下载失败,可尝试使用该命令进行安装。

download_url="https://github.com/multikernel/sandlock/releases/latest/download/sandlock-$(arch)-unknown-linux-gnu.tar.gz"
query_url="https://api.github.com/repos/multikernel/sandlock/releases/latest"
target_dir="${ARCADIA_DIR}/src/shell/sandbox"
sandlock_path="${target_dir}/sandlock"
[ -x "${sandlock_path}" ] && current_version="$(${sandlock_path} --version | awk -F ' ' '{print$NF}')" || current_version=""

[[ -x "${sandlock_path}" && "$(curl -s "${query_url}" | jq -r ".tag_name" | sed 's|^v||g')" == "${current_version}" ]] &&
    echo "Sandlock 已是最新版本 ${current_version}" ||
    {
        git -C "${target_dir}" ls-files --others --exclude-standard -z |
            tr '\0' '\n' |
            sed "s|^|${target_dir}/|" |
            tr '\n' ' ' |
            xargs -r rm -f
        wget -q --show-progress -O - "${download_url}" | tar -xzf - -C "${target_dir}"
        chmod a+x "${target_dir}/sandlock"
        echo "Sandlock 已安装"
    }

若频繁使用沙箱功能,建议定期手动更新,后续可能会调整安装策略。