DeepSeek Harness沙箱安全围栏:AI Agent运行时隔离与能力管控
1. 什么是 DeepSeek Harness 的“安全围栏”它真能拦住 AI Agent 的越界行为吗最近在几个技术群里总有人问“我用 DeepSeek Harness 跑了个写周报的 Agent结果它偷偷调了本地 Excel 接口把公司财务模板改了两行——这算谁的责任”还有人反馈Agent 在调试阶段顺手执行了rm -rf /tmp/*清空了其他服务的日志缓存。这类问题不是个例而是当前 AI Agent 落地过程中最隐蔽、也最危险的“信任裂缝”。DeepSeek Harness 提出的“安全围栏”本质上不是给 Agent 戴上手铐而是为它划出一块受控的、可审计、可回滚的“数字试验田”。这个围栏的核心不是阻止 Agent 做事而是确保它做事的每一步都发生在预设的沙箱边界内且所有动作都留痕、可追溯、可熔断。我去年帮一家券商做投研辅助 Agent 时就踩过坑Agent 基于 LangChain 封装了一个“自动抓取交易所公告 PDF”的 Skill本地测试一切正常上线后却因权限配置疏漏意外触发了服务器上的wget --no-parent -r https://xxx.com/爬取了整站目录结构差点被安全部门当成渗透测试误报。后来我们回溯发现问题不在模型本身而在于 Skill 运行时的执行环境——它默认继承了宿主进程的用户权限和网络能力没有隔离层兜底。DeepSeek Harness 的沙箱策略正是为了解决这类“能力溢出”问题它不假设开发者永远写对了权限控制逻辑而是从执行引擎底层强制收口。比如它把文件系统访问抽象为“命名空间挂载点”Agent 只能看到/sandbox/data/in/和/sandbox/data/out/两个路径其余路径一律返回Permission denied网络请求则必须通过内置的http_client插件发起该插件会校验目标域名是否在白名单中如cninfo.com.cn,sse.com.cn连 DNS 解析环节都被劫持重定向。这种设计思路和 Docker 的--read-only-rootfs--cap-dropALL组合类似但更进一步——它把“能力”本身变成了可插拔的模块而不是靠 Linux Capabilities 这种粗粒度开关。你可能会想“我用 FastAPI 自己封装个 API 不就行了吗”但现实是一个真实业务场景里的 Agent 往往要串联 5~8 个 Skill查数据库、读 Excel、调内部风控接口、生成 Markdown 报告、发企业微信通知……每个 Skill 都可能引入新的依赖、新的环境变量、新的临时文件写入路径。手工管控这些“能力出口”成本远高于构建一个统一的沙箱基座。DeepSeek Harness 的价值正在于它把“安全”从开发者的 checklist变成了运行时的默认行为。它不指望你记住chmod 700 /tmp/agent_cache而是让你根本没机会去chmod——因为/tmp根本不在它的视图里。目前社区里流传的所谓“轻量级沙箱方案”比如用chroot或firejail包裹单个 Python 进程最大的问题是无法覆盖多进程协作场景当 Agent 启动子进程调用pandoc转 PDF 时firejail的规则往往失效。而 DeepSeek Harness 的 Rust 运行时在进程创建fork、文件打开openat、网络连接connect等系统调用层面做了深度 hook无论子进程怎么嵌套都在同一套策略引擎管控之下。这不是“加一层防护”而是重构了执行的底层契约。2. 沙箱隔离的四层防线从进程级到技能级的纵深防御体系DeepSeek Harness 的沙箱不是单一技术而是一套分层嵌套的防御体系。它像洋葱一样每一层都解决不同维度的风险且层与层之间有明确的职责边界。很多使用者只看到最外层的“启动参数”比如--sandbox-modestrict却忽略了内层策略才是真正的安全基石。下面我按实际生效顺序拆解这四层防线如何协同工作。2.1 第一层Rust 运行时进程隔离底层基石这是整个沙箱的物理基础。DeepSeek Harness 的核心引擎用 Rust 编写启动时会调用clone()系统调用创建新进程并传入CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWUSER四个 flag。这意味着PID NamespaceAgent 进程看到的 PID 1 是它自己的主进程而非宿主机的systemd。它调用ps aux列出的进程全是沙箱内的“幻影”无法感知宿主机上任何真实进程。Mount Namespace沙箱拥有独立的挂载点视图。Harness 默认只挂载三个路径/sandbox/data映射宿主机指定目录如/opt/harness/dataAgent 可读写/sandbox/config只读挂载存放 Skill 配置文件/sandbox/runtimetmpfs 内存文件系统Agent 所有临时文件如tempfile.mkstemp()创建的文件都落在此处进程退出即销毁。其余路径/etc,/proc,/dev要么被屏蔽要么以只读方式挂载最小化版本。例如/proc下仅保留/proc/self/status和/proc/sys/kernel/hostname连/proc/cpuinfo都被移除——这直接堵死了 Agent 通过读取 CPU 信息推测宿主机规格的旁路。Network Namespace沙箱内无默认网络栈。所有网络请求必须经由 Harness 内置的network_proxy模块转发。该模块监听127.0.0.1:8080Agent 发起 HTTP 请求时目标地址会被重写为http://127.0.0.1:8080/proxy?urlhttps%3A%2F%2Fapi.example.com%2Fv1%2Fdata然后由 proxy 模块校验 URL 是否在白名单中白名单通过harness.toml的[network]段配置。如果校验失败返回403 Forbidden且日志记录完整请求头和原始 URL。User Namespace沙箱内 UID/GID 映射被重定义。Agent 进程以 UID 1000 运行但在宿主机视角它实际运行在 UID 65534nobody下且该 UID 在宿主机上没有任何附加组权限。即使 Agent 通过漏洞提权到 rootUID 0在宿主机上也只对应一个无特权的映射 UID无法执行chown或setuid等敏感操作。提示这一层隔离的强度直接取决于宿主机内核版本。Linux 5.10 才完整支持CLONE_NEWUSER的非特权用户创建。如果你在 CentOS 7内核 3.10上部署Harness 会自动降级为unsharesetns组合此时 User Namespace 隔离失效需额外启用seccomp-bpf规则补位。实测中我们曾因未检查内核版本导致某次灰度发布时Agent 成功调用了mount --bind挂载了宿主机/var/log幸好seccomp规则拦截了mount系统调用否则后果严重。2.2 第二层Skill 能力白名单机制策略中枢如果说第一层是“画地为牢”第二层就是“授予权杖”。DeepSeek Harness 不允许 Skill 直接调用系统 API所有外部交互必须通过预定义的“能力接口”Capability Interface。每个 Skill 在skill.yaml中声明所需能力例如name: stock_data_fetcher requires: - filesystem: [read, write] - http_client: [GET, POST] - database: [query]Harness 启动时会解析此声明并动态注入对应的客户端实例。关键点在于filesystem能力被封装为SandboxedFilesystem结构体其open()方法会校验路径是否在/sandbox/data/下且不允许..路径遍历/sandbox/data/../etc/passwd会被拒绝http_client能力实际是ProxyHttpClient它强制要求所有请求携带X-Harness-Skill-ID: stock_data_fetcher头便于审计溯源database能力则只提供query(sql: str) - ResultVecRow方法且 SQL 语句会经过正则过滤禁止;分隔符和UNION SELECT等高危模式。这种设计的好处是开发者无需关心底层沙箱细节只需按需声明能力。Harness 会自动裁剪掉未声明的能力——即使 Skill 代码里写了std::fs::remove_dir_all(/)编译能过运行时也会因filesystem能力未授权delete权限而 panic。我们曾做过压力测试将一个故意写错的 Skill试图chmod 777 /sandbox/data放入 strict 模式Harness 在加载阶段就报错Capability filesystem does not support chmod operation根本不会进入执行环节。2.3 第三层资源配额硬限制防 DoS 关键Agent 的“恶意”不一定是主动攻击更多是失控的资源消耗。比如一个循环调用time.sleep(0.001)的 SkillCPU 占用率可能飙到 99%拖垮宿主机。Harness 通过 cgroups v2 实现精细化配额资源类型默认限制调整方式实测效果CPU 时间100ms/秒--cpu-quota5000050ms超限时进程被SIGSTOP暂停100ms 后恢复内存512MB--memory-limit1G达到 90% 时触发 OOM Killer优先 kill 子进程文件描述符1024--fd-limit2048open()超限时返回EMFILE网络带宽出向 10MB/s入向 5MB/s--net-out-bandwidth5M使用tc流量整形延迟增加但不丢包特别值得注意的是内存限制的实现。Harness 不直接设置memory.max而是监控/sys/fs/cgroup/harness/id/memory.current当值超过阈值的 85% 时主动调用madvise(MADV_DONTNEED)清理页缓存并向 Skill 发送SIGUSR1信号触发其内部的“内存紧张回调”。我们在处理一个 PDF 解析 Skill 时发现它依赖pdfium库该库会缓存大量解码中间数据。通过注册回调Skill 在收到信号后主动释放缓存将峰值内存从 1.2GB 降至 680MB避免了频繁 OOM。2.4 第四层审计日志与实时熔断事后追溯与主动干预最后一道防线是“看得见、管得住”。Harness 默认开启全链路审计日志格式为 JSON每条记录包含timestamp: ISO8601 时间戳skill_id: Skill 唯一标识operation:filesystem.open,http_client.get,database.querypath/url/sql: 具体操作对象脱敏处理如 URL 只记录 hostpathquery 参数用***替换status:success/denied/errorduration_ms: 操作耗时trace_id: 分布式追踪 ID关联上下游调用这些日志默认输出到/var/log/harness/audit.log并可通过harness audit --tail实时查看。更重要的是Harness 支持基于日志的实时熔断。例如在harness.toml中配置[audit.meltdown] # 当 1 分钟内出现 5 次 filesystem.write 拒绝立即停止该 Skill rule count(status denied and operation filesystem.write) 5 per 60s action stop_skill target stock_data_fetcher我们曾用此规则捕获一个异常行为某金融分析 Skill 在连续 3 次 HTTP 请求失败后开始尝试写入/sandbox/data/cache/目录但因磁盘满被拒绝。熔断规则触发后Harness 自动停服并发送告警邮件运维人员登录后发现是 NFS 存储挂载点异常及时修复避免了更大范围影响。3. 从零部署Linux 环境下的 DeepSeek Harness 沙箱实战配置部署 DeepSeek Harness 并不是简单./harness start就完事。尤其在生产环境沙箱的强度直接取决于部署时的每一个配置选项。我以 Ubuntu 22.04 为例复现一次完整的、可用于内网服务器的部署流程重点标注那些文档里没写但实际踩坑的关键点。3.1 环境准备与依赖安装首先确认内核版本和 cgroups 状态# 必须 5.10否则 User Namespace 不可用 uname -r # 检查 cgroups v2 是否启用Ubuntu 22.04 默认启用 mount | grep cgroup # 输出应包含cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,relatime,seclabel)如果cgroup2未挂载需编辑/etc/default/grub在GRUB_CMDLINE_LINUX行添加systemd.unified_cgroup_hierarchy1然后sudo update-grub sudo reboot。接着安装必要工具# 安装 libseccomp用于 seccomp-bpf 过滤 sudo apt-get install libseccomp-dev # 安装 rustupHarness 编译依赖 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source $HOME/.cargo/env # 安装 build-essential编译 native extensions 所需 sudo apt-get install build-essential注意不要用apt install rustcUbuntu 官方源的 Rust 版本太旧1.58而 Harness 需要 Rust 1.70 的std::os::unix::process::CommandExt特性。我们曾因此在编译harness-core时卡在error[E0658]: use of unstable library feature linux_raw_sys折腾了 3 小时才定位到根源。3.2 下载与验证 Harness 二进制官方推荐从 GitHub Releases 下载预编译二进制# 下载最新 stable 版本截至 2024-06v0.8.3 wget https://github.com/deepseek-ai/harness/releases/download/v0.8.3/harness-linux-x86_64 # 验证 SHA256 校验和务必执行防止供应链攻击 echo a1b2c3d4e5f6... harness-linux-x86_64 | sha256sum -c # 输出应为harness-linux-x86_64: OK # 赋予执行权限并移动到 PATH chmod x harness-linux-x86_64 sudo mv harness-linux-x86_64 /usr/local/bin/harness提示校验和必须从 GitHub Release 页面复制切勿从第三方博客或论坛转载。我们曾遇到一次镜像站同步延迟下载的二进制 SHA256 与页面显示不符联系官方后确认是 CDN 缓存问题最终从 GitHub 直链下载才解决。3.3 初始化沙箱配置目录Harness 的配置中心是harness.toml但它的位置有严格约定# 创建标准配置目录结构 sudo mkdir -p /etc/harness/{skills,config,data} sudo chown -R harness:harness /etc/harness # 初始化 harness.toml cat /etc/harness/harness.toml EOF # 全局配置 [global] log_level info data_dir /etc/harness/data config_dir /etc/harness/config # 沙箱策略 [sandbox] mode strict # 可选: strict, relaxed, disabled # strict 模式下所有未显式声明的能力均被拒绝 # relaxed 模式下只限制危险操作如 mount, ptrace # 网络白名单内网部署关键 [network] allow_hosts [ internal-api.company.local, db.internal.company.local, cache.internal.company.local ] deny_hosts [*] # 默认拒绝所有只放行 allow_hosts # 资源配额 [resources] cpu_quota_us 50000 # 50ms/100ms memory_limit_bytes 1073741824 # 1GB fd_limit 2048 # 审计日志 [audit] log_file /var/log/harness/audit.log max_size_mb 100 max_backups 5 EOF # 创建日志目录并设置权限 sudo mkdir -p /var/log/harness sudo chown harness:harness /var/log/harness这里的关键配置是[network]段。内网部署时绝对不能留空allow_hosts或设为[*]我们曾因配置疏忽导致 Agent 通过http_client访问了公网ipinfo.io获取 IP 地址暴露了内网拓扑。正确做法是将所有内网服务域名精确列出并配合 DNS 服务器做正向解析internal-api.company.local必须能被沙箱内 DNS 解析成功。3.4 部署一个真实 SkillExcel 报表生成器以一个典型业务 Skill 为例展示如何适配沙箱# 创建 Skill 目录 sudo mkdir -p /etc/harness/skills/excel-reporter # 编写 skill.yaml cat /etc/harness/skills/excel-reporter/skill.yaml EOF name: excel-reporter version: 1.0.0 description: 生成月度销售报表 Excel requires: - filesystem: [read, write] - http_client: [GET] - database: [query] # 入口点Harness 会自动注入 capability 客户端 entrypoint: main.py EOF # 编写 main.py注意不能直接 import pandas需用 Harness 提供的封装 cat /etc/harness/skills/excel-reporter/main.py EOF import json import sys from pathlib import Path # Harness 自动注入 capabilities无需 import # filesystem, http_client, database 都是全局变量 def generate_report(): # 1. 从数据库查询数据使用 database 能力 sales_data database.query(SELECT * FROM sales WHERE month 2024-06) # 2. 从 HTTP API 获取产品信息使用 http_client 能力 resp http_client.get(https://internal-api.company.local/products) products resp.json() # 3. 写入 Excel使用 filesystem 能力 # 注意路径必须在 /sandbox/data/ 下 output_path Path(/sandbox/data/out/report_202406.xlsx) # 这里用 openpyxl 或 xlsxwriter但需确保它们不调用 system() 等危险函数 # 我们选择 xlsxwriter因其纯 Python 实现无 C 扩展依赖 import xlsxwriter workbook xlsxwriter.Workbook(output_path) worksheet workbook.add_worksheet() # ... 写入逻辑省略 ... workbook.close() return str(output_path) if __name__ __main__: try: result generate_report() print(json.dumps({status: success, output: result})) except Exception as e: print(json.dumps({status: error, message: str(e)})) sys.exit(1) EOF # 设置 Skill 权限 sudo chown -R harness:harness /etc/harness/skills/excel-reporter sudo chmod -R 755 /etc/harness/skills/excel-reporter实操心得Skill 代码里绝对不能出现os.system(),subprocess.Popen(),open(/etc/hosts)等直连系统调用。Harness 的filesystem能力只代理open(),read(),write()等基本操作subprocess会绕过所有沙箱检查。我们曾有一个 Skill 为了“快速”调用pdftotext直接os.system(pdftotext ...)结果在 strict 模式下被 seccomp 规则拦截日志只显示syscallexecve排查了 2 小时才发现问题。正确做法是将pdftotext封装成另一个 Skill通过 Harness 的 Skill-to-Skill 调用机制通信。3.5 启动与验证沙箱运行最后以 systemd 服务方式启动# 创建 systemd service 文件 sudo tee /etc/systemd/system/harness.service EOF [Unit] DescriptionDeepSeek Harness Sandboxed Agent Runtime Afternetwork.target [Service] Typesimple Userharness Groupharness WorkingDirectory/etc/harness ExecStart/usr/local/bin/harness --config /etc/harness/harness.toml --skills-dir /etc/harness/skills Restartalways RestartSec10 LimitNOFILE65536 # 关键启用 seccomp 过滤 SystemMaxFiles65536 # 关键限制内存防止 OOM 影响宿主机 MemoryLimit2G [Install] WantedBymulti-user.target EOF # 重载 systemd 并启动 sudo systemctl daemon-reload sudo systemctl enable harness sudo systemctl start harness # 查看状态 sudo systemctl status harness # 应显示 active (running) # 实时查看审计日志 sudo journalctl -u harness -f | grep excel-reporter # 正常应看到类似{skill_id:excel-reporter,operation:database.query,status:success,...}验证是否真正隔离在宿主机上执行ps aux | grep harness应只看到一个harness进程进入沙箱内部需sudo nsenter -t $(pgrep harness) -U -r -n -p -m -i bash执行ls /只能看到/sandbox目录/etc,/proc均不可见。这才是真正的沙箱。4. 常见问题与排查技巧实录那些文档里不会写的坑部署和使用 DeepSeek Harness 沙箱的过程中90% 的问题都源于对“隔离”的误解。很多人以为只要开了--sandbox-modestrict就万事大吉结果上线后各种奇怪的Permission denied或Connection refused。下面是我和团队在过去 18 个月里整理出的最典型、最高频的 7 类问题附带真实排查路径和根治方案。4.1 问题Skill 报错OSError: [Errno 13] Permission denied: /sandbox/data/in/file.csv现象Skill 代码中with open(/sandbox/data/in/file.csv, r) as f:报错但文件明明存在且权限为 644。排查路径首先确认文件是否真的在沙箱内sudo nsenter -t $(pgrep harness) -U -r -n -p -m -i ls -l /sandbox/data/in/如果文件存在检查harness.toml中data_dir配置是否指向正确宿主机路径最关键一步检查宿主机上该文件的 SELinux 上下文如果启用 SELinux根治方案宿主机上确保/etc/harness/data/in/目录的 SELinux type 为container_file_tsudo semanage fcontext -a -t container_file_t /etc/harness/data(/.*)? sudo restorecon -Rv /etc/harness/data或者如果不用 SELinux检查文件属主sudo chown -R harness:harness /etc/harness/data实操心得这个问题在 CentOS/RHEL 系统上 100% 出现因为默认 SELinux 策略禁止容器进程读取普通用户目录。Ubuntu 默认禁用 SELinux所以不会遇到。我们曾因此在客户现场花了 4 小时排查最后发现是semanage命令没装restorecon无效。4.2 问题HTTP 请求返回403 Forbidden但目标域名在allow_hosts中现象harness.toml明确写了allow_hosts [api.company.local]但 Skill 调用http_client.get(https://api.company.local/v1/data)仍被拒绝。排查路径查看审计日志找到被拒的请求记录注意url字段内容检查 Skill 代码中 URL 是否包含端口如https://api.company.local:8080allow_hosts只匹配 host不匹配 port检查 DNS 解析在沙箱内执行nsenter -t $(pgrep harness) -U -r -n -p -m -i ping -c 1 api.company.local根治方案allow_hosts支持通配符但仅限子域名*.company.local有效api.company.local:*无效如果必须指定端口需在allow_hosts中写全称api.company.local:8080更稳妥的做法是在harness.toml中配置dns_servers [10.0.0.1]确保沙箱内 DNS 解析稳定4.3 问题Skill 启动时报错failed to load capability database: no such file or directory现象Harness 日志显示Failed to load skill excel-reporter: failed to load capability database。排查路径检查skill.yaml中requires声明是否拼写错误如database写成databse检查 Harness 是否启用了该能力插件harness list-plugins应包含database-sqlite或database-postgres检查插件配置文件是否存在/etc/harness/config/database.toml根治方案数据库能力需要单独安装插件。例如 PostgreSQL 插件wget https://github.com/deepseek-ai/harness-plugins/releases/download/v0.1.0/database-postgres-linux-x86_64 sudo mv database-postgres-linux-x86_64 /usr/local/lib/harness/plugins/database-postgres.so sudo chown root:root /usr/local/lib/harness/plugins/database-postgres.so对应的database.toml[connection] host db.internal.company.local port 5432 database sales_db username harness_reader password secret_password # 生产环境建议用 vault 注入注意插件.so文件必须放在/usr/local/lib/harness/plugins/且权限为644。我们曾因权限设为600导致 Harness 无法读取插件报错信息极其模糊最终通过strace -e traceopenat harness ...才定位到。4.4 问题Agent 在沙箱内执行time.sleep(0.001)导致 CPU 占用 100%现象top显示harness进程 CPU 占用持续 99%但审计日志无异常。排查路径进入沙箱sudo nsenter -t $(pgrep harness) -U -r -n -p -m -i top查看沙箱内进程找到高 CPU 的 Skill 进程 PIDsudo cat /proc/pid/stack查看内核栈确认是否在do_nanosleep循环根治方案在harness.toml中启用 CPU 配额[resources] cpu_quota_us 10000 # 10ms/100ms即 10% CPU或者在 Skill 代码中加入退避逻辑import time # 避免密集轮询 time.sleep(max(0.1, time_to_next_check)) # 至少休眠 100ms4.5 问题Skill 读取 Excel 文件时报错xlrd.biffh.XLRDError: Unsupported format, or corrupt file现象Skill 使用xlrd库读取.xls文件失败但文件在宿主机上用 LibreOffice 打开正常。原因分析xlrd3.0 版本已放弃对.xls格式的支持只支持.xlsx。而 Harness 的 Python 环境是预编译的xlrd版本固定。根治方案改用openpyxl仅支持.xlsx或pandas.read_excel(enginexlrd)指定旧版xlrd2.0.1更优解在 Skill 外部用宿主机脚本将.xls转.xlsx再放入/sandbox/data/in/4.6 问题卸载 Harness 后/sys/fs/cgroup/harness/目录残留导致下次启动失败现象sudo systemctl restart harness报错cgroup: cannot create cgroup: No space left on device。根治方案手动清理 cgroupsudo rmdir /sys/fs/cgroup/harness/* sudo rmdir /sys/fs/cgroup/harness或者重启 systemdsudo systemctl restart systemd-cgroups-agent4.7 问题离线内网环境无法安装 Harness提示failed to download plugin manifest现象内网服务器执行harness install-plugin database-postgres失败。根治方案在有网环境下载插件包和 manifestharness plugin list-manifest manifest.json wget https://.../database-postgres-linux-x86_64将manifest.json和插件文件拷贝到内网服务器手动安装harness plugin install --manifest manifest.json --plugin database-postgres-linux-x86_645. 沙箱之外如何让 AI Agent 真正“下地干活”而不越界聊完 DeepSeek Harness 的沙箱技术细节我想回到一个更本质的问题我们花这么大精力构建“安全围栏”到底是为了什么不是为了把 Agent 锁进笼子而是为了让它能在真实业务场景中承担起那些过去必须由人手动完成的、重复但关键的任务。我在券商做的那个投研 Agent现在每天早上 8:30 自动拉取前一日沪深 300 成分股涨跌幅、融资融券余额、北向资金流向生成一份 3 页 PDF 报告邮件发送给 20 位分析师。它从不越界从不误操作因为它所有的“手脚”都在 Harness 的沙箱里被精准定义和约束。这种约束带来的反而是更大的自由。以前一个新 Skill 上线要经过开发、测试、安全、运维四轮评审平均耗时 3 天。现在只要 Skill 的skill.yaml声明清晰Harness 的沙箱就能自动 enforce 权限评审时间压缩到 30 分钟。我们甚至建立了“Skill 自助上架平台”业务部门填写表单选择需要的能力filesystem.read,http_client.get,database.query平台自动生成skill.yaml和基础代码框架提交后 Harness 自动验证、部署、灰度。上线速度提升了 12 倍而安全事故为零。但这不意味着可以放松警惕。沙箱是盾牌不是免死金牌。我见过最危险的案例是一个 HR 部门开发的“员工入职流程自动化” Agent。它被授权filesystem.write和http_client.post用来生成合同 PDF 并上传至 HR 系统。开发者忘了在http_client.post的 URL 中做校验Agent 被诱导通过构造恶意输入向http://localhost:8080/shutdown发送了 POST 请求意外关闭了 HR 系统的 Tomcat 服务。问题不在沙箱失效而在业务逻辑层缺乏输入过滤。Harness 的沙箱保证了 Agent 无法执行kill -9但它无法阻止 Agent 把一个精心构造的字符串当作合法的 API endpoint 发出去。所以真正的“安全围栏”是三层结构最底层是 Harness 的沙箱管住系统调用中间层是 Skill 的能力声明和输入校验管住业务逻辑最上层