关于 Ephemora Cell MCP — WASM Sandbox
Ephemora Cell 是为 Agent、插件和 MCP 工作负载运行不可信 WASM 代码的隔离执行边界,适合构建 Agent 基础设施的开发者。每次执行均独立运行,并限制资源和能力,同时生成可验证的执行记录;项目也明确区分已发布版本与主分支上的安全控制。
主要功能
- 01隔离运行不可信 WASM 代码
- 02限制燃料、内存、时间、输入输出
- 03按授权控制文件系统与网络能力
- 04生成可签名的执行记录
- 05支持 Python API 与命令行
适用场景
- 01限制 Agent 生成代码的运行资源
- 02在工具或插件中执行不可信模块
- 03审查执行结果、资源消耗与策略
MCP 相关
Ephemora Cell 可作为 MCP 工作负载下方的 WASM 执行后端,为不可信代码提供受限运行环境与执行记录。README 提及 MCP 集成,但未具体列出 MCP 服务端工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
3收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
Ephemora-cell
Ephemora-cell 是一个临时、无状态、能力受限的执行边界,用于运行不可信的 AI 和 Agent 生成的代码。
create → constrain → execute → prove → destroy
每次执行都从干净状态开始,在宿主授予的限制下运行——燃料、内存、时间、I/O、输出大小、文件系统和网络能力——可以生成所发生情况的签名证据,并在结束时不将执行状态带入下一次运行。
证据会留存。执行状态不会。
临时。无状态。能力受限。可验证。
不会隐式继承任何执行状态或权限。具名状态是一种独立、受限的能力,由宿主有意接入——它不是执行持久化,也不是存储(从设计上实现无状态)。
专为 AI Agent、MCP 工具、插件、代码解释器和其他不可信工作负载打造——集成路径为 AI Agent / Application → Tool / Plugin / MCP → Ephemora-cell → WASM module。下图展示了其中一次执行:边界授予了什么、默认拒绝了什么,以及什么会留存。
快速开始 · 强制执行 · 无状态设计 · 安全证据 · 自行评估 · MCP · 基准测试 · 文档
最新版本:v1.1.0 · PyPI · 已签名的 GitHub 版本 · BUSL-1.1。 版本说明:CHANGELOG.md · 支持的版本,以及针对固定版本 wasmtime==49.0.0 运行时在 2026-09-24 和 2026-10-02 出现的 wasmtime 公告波次,已通过实测证据完成分类:SECURITY.md · 最新可复现测量:2026-10-02 解释器来宾运行,见 benchmarks/results/ · 各安装状态下的实测数量:docs/release_assurance.md。
“稳定”所指的内容,以及它不代表什么。 此处的稳定是指公共 API 表面及其发布门槛:它们已发布、有文档说明,并经过机器检查。它并不代表已获准用于生产环境中的不可信工作负载——目前尚无审查人员独立签字认可,固定的 Wasmtime 版本线仍存在相关公告,且修复版 wheel 尚未发布到 PyPI(见 SECURITY.md);最新的隔离控制仅存在于 main 分支,尚未纳入已发布版本。各项控制分别由哪个构建版本提供,按提交列出:docs/release_assurance.md。
Wasmtime 为你提供 WASM 运行时。Cell 在此基础上构建应用层边界——WASM 是实现机制,受控执行不可信代码才是产品:
Wasmtime: Ephemora-cell:
Execute WASM Execute WASM
+ define capabilities
+ enforce budgets (fuel, memory, time, I/O)
+ bound output
+ collect execution metadata
+ produce execution records (sign-ready)
+ integrate with agents and MCP
决定 Agent 执行代码是否安全的问题是:如何让 Agent 运行不可信代码,同时避免这些代码随意访问主机、凭据、网络或无限计算资源? 原始运行时会把这个边界留给你。Cell 就是这个边界——操作者仍可显式授予某项能力,而且每项授权都会记录在本次运行的记录中。
Agent 生成的代码不同于应用代码:它可能存在错误、计算量没有上限、成本超出预期,甚至带有恶意。因此,运行时会强制执行边界,而不是仅作说明(Cell 强制执行的内容);结果也不只是一个返回值:每次执行都会同时回答三个问题,并附加为 _meta.execution,经过规范化(RFC 8785 JCS)且可签名。
| 答案 | 示例字段 | |
|---|---|---|
| RESULT | 返回了什么 | status、stdout、exit_code |
| COST | 耗费了多少 | fuel_consumed、elapsed_ms |
| POLICY | 执行时遵循了哪些规则 | 内存限制、预打开项、网络策略、wasmtime_version |
“可验证,而非仅声称。”是数据,不是口号:改写记录中的任意一个字段,verify() 就会失败——可运行的演示见 python examples/signed_record_demo.py。运行时、安全边界和核算功能,一次 pip install 即可安装。
Cell 并非通用容器的替代品。它面向高频、不可信的 Agent 和 MCP 工作负载,这些工作负载需要精简的能力范围和明确的核算;对于 Agent 基础设施,Cell 也可以作为轻量级执行后端,部署在现有运行框架之下,无需引入新框架。取舍是明确的:通用性不如完整的 Linux 沙箱,但换来更小的执行面、更严格的能力控制和更低的单次调用开销——各执行路径的实测数据见性能。
快速开始
只需三条命令:安装 Cell,运行不受信任的内容,读取经审计的收据。
1 — 安装(使用虚拟环境;在 Ubuntu ≥ 23.04 / Fedora 上,PEP 668 会拒绝直接执行 pip install。Windows:使用 Git Bash 或 WSL,并用 python 代替 python3):
python3 -m venv .venv && source .venv/bin/activate
python -m pip install ephemora-cell
在将下方任何声明视为该版本的特性之前,先检查你实际使用的是哪个构建版本。 已发布版本和当前源代码报告的版本字符串相同(1.1.0),但它们包含的控制措施并不相同——组件隔离门控和用于证明该隔离的收据字段是在版本发布后才加入的:
python -c "from ephemora_cell.execution_report import TRUST_UNKNOWN"; echo $?
# 0 → source at main: the enforcement gate is present
# 1 → published 1.1.0 wheel: no component isolation gate, no attestation fields
任何会用到这些控制措施的操作,都需要从指定提交安装源代码:
git clone https://github.com/MichaelS1011/ephemora-cell.git && cd ephemora-cell
git checkout <full-commit-sha> # pin what you are evaluating; record `git rev-parse HEAD`
python -m pip install -e .
2 — 运行不受信任的内容(仓库附带示例,也可以使用任意 .wasm 文件):
git clone https://github.com/MichaelS1011/ephemora-cell.git && cd ephemora-cell
ephemora-cell run examples/hello.wasm --isolated
(在运行时增加操作系统级进程隔离——对于你未自行构建的代码,建议使用;每种路径的开销都在性能中测量)
Hello from Ephemora Cell!
3 — 读取经审计的收据——同一次运行,采用机器可读格式。这里给一个恶意模块(examples/fuel_bomb.wasm)分配 100 单位燃料预算,并按预算精准停止:
ephemora-cell run examples/fuel_bomb.wasm --fuel 100 --isolated --json
{
"status": "fuel_exhausted",
"exit_code": 0,
"fuel_consumed": 100,
"fuel_budget": 100,
"stdout_bytes": 0
}
用 Python 执行也一样——每个结果都包含状态、成本和捕获的输出(完整接口见 API、CLI 和集成):
from ephemora_cell import run_wasm
result = run_wasm("examples/fuel_bomb.wasm", max_fuel=100)
result.status # <ExecutionStatus.FUEL_EXHAUSTED: 'fuel_exhausted'>
result.fuel_consumed # 100 — the budget, not an estimate
result.stdout # '' — captured output, capped at 10 KB
失败会分级返回,而非导致崩溃:无限循环会返回带有收据的 status: "fuel_exhausted",内存占用过大会返回 memory_exceeded,崩溃则返回非零退出代码——自动评分器和 CI 测试平台任务使用的也是这些状态。在隔离路径中,失败会被限制在一次性工作进程内,并受到操作系统级限制和强制终止机制的约束。
接下来可以了解: Agent/工具隔离 → MCP 集成 · 针对不受信任 PR 的 CI 门控 → 复合操作 · CLI 参考和用法示例(也包含故障排查列表)→ docs/recipes.md。

真实 CLI 会话——每一行都是其上方所打印命令的原样输出。安装的是来自 PyPI 的 1.1.0 wheel;examples/ 和 benchmarks/ 路径来自仓库克隆;最后一个场景需要在执行前安装可选的 tools-signing extra。整个过程是一次执行:全新运行 → 获得的边界(燃料、内存限制、预开放项、allow_fsync: false)→ 恰好在 100 单位预算用尽时停止失控模块 → 根据实时运行时测量拒绝情况,并包含正向控制 → 签名证据可检测出单个字段被改写。演示画面刻意不显示运行时间和吞吐量:这些数据因平台而异,而展示这类数据的演示最终会变成不实声明。
Cell 强制执行的内容
Cell 将来宾代码视为不受信任的代码。主机决定来宾可以访问什么,运行时会在每次执行时强制执行该决定——来宾无法将其关闭;如果扩大了运行权限,收据会予以说明。默认情况下,来宾没有任何隐式访问权限:无法访问网络、任意文件系统或进程创建功能,也无法不受限制地访问环境变量;同时,CPU、内存、时间和输出均受到限制。授予其中任何权限,都是主机明确作出的决定,并会被记录。
- 能力,而非惯例。 授予时会重新验证预开放目录项,宿主不会跟随来宾可写的名称:宿主侧工件读取会使用
O_NOFOLLOW,并在文件描述符级别验证其为常规文件;在共享路径上则采用原子发布(SECURITY.md)。 - 精确核算的资源限制。 Fuel 会在循环耗尽获分配的预算时将其停止;epoch 截止时间则兜住 Fuel 未计入的所有开销;内存、输出和宿主 I/O 工作也各有各自的上限(见下表)。
- 无状态执行。 不创建沙箱目录,不复用引擎先前运行的状态,也不继承权限(从设计上实现无状态)。
- 经中介的出站连接,先认证再执行。 默认情况下,来宾的连接都无法成功——Preview1 不提供套接字接口,WASI 0.2 路径则在调用时拒绝
connect——因此,除非宿主开放连接,否则无事可供中介。在操作人员开放连接时,每项授权都是由信任根中的密钥签名的 DSSE 信封;信任根保存在授权目录之外——随工件一起交付的密钥无法证明该工件的真实性。授权只会收窄操作人员的允许列表,而不会取而代之:逐 URL、逐重定向跳转、逐资源上限,并针对每个请求执行窗口、上限和撤销规则。--egress-grants-required会移除回退机制(ADR-013、docs/egress_patterns.md)。 - 固定已解析的地址。 若某个名称解析为环回、RFC1918、CGNAT、链路本地或元数据空间地址,则会在解析时被拒绝;实际连接的就是经过验证的地址——分类依据是 Cell 自身的地址注册表,而非
ipaddress.is_private(SECURITY.md、DNS 重绑定说明)。 - 签名证据。 收据会对展示给调用方的精确规范字节进行签名,并附带新生成的
report_id和签发时间;由 Cell 外部的验证方判断是否曾见过该收据。有效签名证明的是这些字节,而非执行是安全的;如果受众不符,签名也不授予任何权限——收据不是授权,授权也不是收据(SECURITY.md)。 - 默认采用失败即拒绝。 授权集损坏、账本无法读取、权限目录为空或请求格式错误时,都会产生经过审计的拒绝,而非静默放行;在启动时拒绝的情形下,也会在启动这一安全时机予以拒绝。
安全绝不由用户选择启用。 每次执行——无论在进程内还是隔离环境中——都受强制执行的 Fuel、内存、墙上时钟和输出限制约束:调用方可以设置限制的数值,但不能决定是否存在限制。有两项刻意设置的例外,并会在相关位置明确说明:max_wasm_bytes(一次运行可加载的模块大小——除 interpreter 配置外,所有配置均为 32 MiB;该配置会将上限提高到 512 MiB,以支持用户自带的来宾模块)以及 allow_fsync(是否允许 WASI 同步调用——所有随附配置都不会启用它;只有显式指定 --allow-fsync 才会启用)。两者都会写入签名基线,因此,放宽限制的运行不会被误认为默认运行。基线还会记录超出已配置选项的内容:实际采用的隔离路径(execution_mode)、实际执行的 ABI(abi),以及同步阻断是否确实生效(sync_blockade_enforced)——因此,WASI 0.2 组件运行所经路径不含同步调用陷阱,即使默认设置为 allow_fsync: false,也会将阻断记录为未生效。已配置的策略绝不会被视为已验证的保证(SECURITY.md)。
隔离是对组件强制执行的,而不只是提供选项。 对于 WASI Preview1 模块,进程边界由调用方选择:当模块来自你自己的构建之外(例如 Agent 输出、第三方插件、PR 贡献的代码)时,添加 --isolated(或调用 run_isolated())。对于 WASI 0.2 组件,隔离不可选:任何主机未明确标记为 trusted 的组件——无论是 untrusted 值,还是未指定的 unknown,这两者都会按不可信处理(默认拒绝)——都会在运行入口处由中央门控强制走子进程路径。门控只会提高隔离级别,绝不会降低;如果工作进程不可用,则会拒绝运行(ERROR),而不是悄悄降级为进程内运行——不会静默回退(ADR-015,SECURITY.md)。有一个明确命名的例外:直接调用底层的 ComponentSandbox 原语,按设计会绕过门控——它是门控和工作进程所依赖的内部引擎,不是策略边界;使用它的调用方需自行负责策略。
本段描述的是当前源码。门控和上述三个证明字段(execution_mode、abi、sync_blockade_enforced)是在 1.1.0 发布版本定版后合并的,因此不在已发布的 wheel 中——而 main 仍保留版本字符串 1.1.0,直到下一个版本更新。 快速入门 中的一行检查可区分这两个构建版本;每次提交的控制矩阵见 docs/release_assurance.md。
强制执行的默认值:
| 资源 | 默认值 |
|---|---|
| WASM 内存 | 128 MB(Store.set_limits) |
| Fuel / CPU 预算 | 1,000,000 — 运行不能超出其 fuel;实测约为 13 fuel/次迭代(R² = 1.000),因平台而异(docs/performance.md) |
| 墙钟超时 | 30 s(epoch 中断) |
| 捕获的 stdout/stderr | 10 KB |
| 网络 | 默认禁用 — Preview1:无套接字 API;WASI 0.2:已链接,但在调用时拒绝(实测) |
| 主机文件系统 | 默认拒绝;屏蔽 14 个危险目录(/dev、/proc、/sys、……) |
| 进程执行 / 派生 | WASI 中不可用 |
| 线程 | 已禁用(wasm_threads=False) |
同一规则也适用于语言特性:引擎配置会强制关闭 Cell 已发布的 WASI 接口不需要的每项 WebAssembly 提案(线程、函数引用、异常、GC、尾调用、栈切换——均在每个 security_baseline 中提供证明,并在每次发布时通过编译探测测试)。这是结构性措施,而非无谓谨慎:2025/26 年的安全公告记录反复呈现同一种模式——沙箱之间的差异,往往源于某项提案悄然变为默认启用。Cell 将该接口保持为零,代价是限制 Guest 能运行的内容,而不是削弱主机能保证的内容(完整提案表和逐条公告评估)。
除此之外还有:I/O 预算(io_cpu_seconds / io_budget_bytes——限制主机工作,而不只是 Guest 计算)、双 ABI、选择启用的 memory64、声明上限的 GC 堆、有界命名状态,以及由主机中介的出口流量。每项控制在哪条执行路径上生效——以及当内核级隔离边界属于你自己的进程时,“文档声明可信”意味着什么——请参阅 SECURITY.md 中按控制项划分的执行路径矩阵。
沙箱周边的信任链
沙箱周边构建了一条可验证的第三方工具信任链:
任何验证失败的内容,都会在执行任何指令之前被拒绝——执行绝不依赖顺利通过的路径。第三方工具随附 Ed25519 签名的清单(RFC 8785 JCS);服务端在注册前会验证签名和模块哈希,而在签名工具模式(--require-signed-tools pub.pem)下,没有有效清单的裸 .wasm 永远不会加载。Agent 只能提议工具——在运维人员允许的目录中放置 tool.request.json,并在安装和发布前通过验证。Agent 提议;宿主处置(ADR-006)。
每次运行都会汇总为一条防篡改记录,涵盖状态、燃料、耗时和经证明的安全基线。每次运行的执行前记录和回执都可以封存到经过签名、哈希链式连接的 LedgerEntry JSONL 链中(sequence + prev_hash)——链条连续且有序,无需密钥即可验证关联关系,只有持有密钥才能验证作者身份;如果链条末尾被截断,则无法检测,这一点已明确说明并经过测试(ADR-011;ephemora-cell ledger <path>)。累计租户预算(--tenant、--tenant-book、--tenant-max-runs)会在运行前预留上限,结算实际消耗,并在超出上限时拒绝下一次运行,同时生成注明账户的回执——这是一种计费身份,而非隔离边界,且不会在运行中途终止执行(ADR-012)。
从设计上实现无状态
一次执行的状态不会延续到下一次执行。 无论是沙箱目录、引擎缓存的状态、能力还是环境,都不会延续;唯一能跨越运行边界的是宿主主动保存在自身中的命名状态,详见本节末尾。tests/test_execution_invariants.py 中的每个词都有对应的命名测试:运行结束后没有可复用的残留(cleanup() 会返回残留内容,因此残留目录会导致断言失败);运行 B 不会读取运行 A 留下的任何内容;任何操作都不会携带未获授权的权限,且运行会准确证明自己获得了哪些预开放项;回执会针对向调用方展示的确切字节进行验证,外键和经过编辑的字段都会被拒绝。
主要测量结果:在引擎池、每次运行使用独立引擎和隔离子进程这三条路径上,分别进行了 1 000 / 300 / 40 组连续运行对——每条路径均无泄漏——此外还对写入程序在追加过程中被 SIGKILL 终止的情况进行了 40 次审计(benchmarks/statelessness_probe.py,结果见 benchmarks/results/2026-10-05/)。这三条是此探测所覆盖的路径;MCP stdio 路径不在此次测试范围内,此结果也不能说明该路径的情况——跨服务端路径测量无状态性是另一项尚未发布的基准测试。默认 I/O 预算会强制每次运行使用独立引擎,因此探测会提高预算,并同时测试池化路径——从未测试池化路径的无状态测试,测的就不是正确的路径。
命名状态是另一回事,它由宿主持有。 Cell 不提供会话存储,也绝不会替你创建会话存储:集成方可以将有界的 StateStore(StateStore(max_entries=64, max_value_bytes=262144, max_total_bytes=1048576))传入一次运行。该存储不是执行状态——没有任何内容会被继承,也不会有任何内容写入磁盘。但它是由宿主持有的对象,因此宿主若有意将同一个存储传入下一次运行,就会按设计在多次执行之间携带命名状态:tests/test_state.py::TestStateImports::test_gate_demo_counter_across_three_runs 正是这样将计数器贯穿三个隔离运行。这里的持久化是一种由宿主授予的能力,绝非默认行为,而且它仍不是存储
(ADR-004)。
你可以在此基础上构建的功能——在明确限制下运行大模型生成的代码、在有界环境中运行 MCP 工具、运行无需宿主级访问权限的用户上传插件、Agent 工具运行时、用于评分或审计的可验证执行记录——始终使用相同的 run_wasm / run_isolated / MCP API;包含可运行代码的模式(包括无服务器、气隙验证、WASI 0.2 组件和 FastAPI)见 docs/recipes.md。
MCP 集成
已在官方 MCP Registry 中登记为 io.github.MichaelS1011/ephemora-cell-mcp(通过 PyPI 使用 stdio)。Registry 最新发布的条目是 1.0.4.3:1.1.0 的元数据已在 server.json 中准备就绪并通过验证,但发布仍需等待发布者授权(Registry 登录采用交互式设备流程)。Glama 也收录了同一服务——其评级是实时分类,请查看上方徽章,而不要以此处的文字为准。
pip install ephemora-cell
ephemora-cell-mcp # bundled tools: clock + echo; --tools-dir ./tools replaces the bundled set with your own
# One-line setup for GitHub Copilot in VS Code:
code --add-mcp '{"name":"Ephemora Cell","command":"ephemora-cell-mcp"}'
让你的 Agent 查询当前时间:答案来自捆绑的 clock 工具——这是一个仅读取 WASI 实时时钟的 WASM 模块;调用报告会准确显示该答案的成本。
Ephemora-cell、MCP 服务以及每次工具执行都完全在你的机器上运行。你选择的客户端或模型可以是本地的,也可以是远程的——Cell 不属于其中任何一方。 该服务是从 PyPI 安装的普通 stdio 进程:Cell 无需 API 密钥或云账户,工具会在 WASM 沙箱中离线执行(除非你在主机端明确允许,否则不会联网)。将 Claude Desktop、VS Code/Copilot、Codex、LM Studio 或本地模型栈连接到它即可——沙箱始终不会离开你的硬件。所选客户端或模型提供商的要求与 Cell 无关,而 Agent 能从工具中获得多少帮助取决于该客户端调用工具的能力;沙箱除本地机器外不增加任何要求。
每次调用可获得:
- 在本地运行不可信工具。 每个工具都是 Cell 沙箱中的 WASM 模块——没有默认网络权限,受燃料和内存限制,输出也有上限。工具行为异常时会撞上沙箱边界,而不是影响你的主机。
- 可验证,而不只是可安装。 每个结果都包含其执行记录(
_meta.execution);原生get-policy工具会报告通过强制执行策略时所用的同一代码路径计算出的精确逐工具策略,因此报告与强制执行不会出现偏差。协议不会验证_meta,因此--receipt-signing-key会针对相同字节添加 DSSE 签名(_meta.attestation),可使用操作者的公钥在带外验证;max_age_seconds则允许调用方拒绝过期的回执。策略读取是工具,策略写入则由主机决定:Agent 无法为自己授予网络或文件系统访问权限。 - 服务长时间运行,执行始终全新。 在
2026-07-28无状态修订版下,使用当前修订版的客户端会跳过initialize握手,而握手时代的客户端(Claude Desktop、VS Code、Codex、……)仍可照常工作;两代客户端由同一个进程提供服务,并在 CI 中针对官方 SDK 进行测试。这种划分的意义在于:MCP 服务可以长时间运行,但其中的每次执行都可以是全新的——每次tools/call都会启动一个不继承任何状态的新沙箱。修订版处理、顺序规则(在initialize之前收到的旧版流量会以-32600拒绝,不会运行任何 WASM)、ttlMs/cacheScope以及豁免规则:请参阅 docs/mcp.md。
每种 MCP 路径的单次调用成本:请参阅 性能。与 Microsoft Wassette 对比: Wassette 是 Microsoft 为 MCP 工具提供的基于能力的运行时,使用同属 Wasmtime 家族的技术——其 OCI 拉取模型将信任决策提前到安装时;Cell 则增加了调用方可以逐次调用验证的内容(docs/comparison-mcp-servers.md,于 2026-09-18 重新验证)。
这是执行边界,并非宣称来宾软件可信。Cell 不会评估模块是否恶意或正确——来宾仍可能在获分配的预算范围内出现异常行为。
安全性证据
六个实测层级,按强度从高到低排列,每项均附有复现命令和已提交的原始证据——层级表、探测等效性方法、攻击结果矩阵和 CVE 重放详情:docs/security_posture.md。
- MCP CVE 重放 — 两个已修补 CVE 的真实利用路径在引擎层被拒绝;篡改载荷时,受治理的加载会失败关闭;此外,还实测了 WASI 0.2 组件在调用时拒绝套接字连接。
- SandboxEscapeBench-18 映射 — 将英国 AI 安全研究所的 18 种容器/Kubernetes 逃逸场景映射到最接近的 WASM 等效场景:在 WASI 表面上,8 种经过执行测试并被拒绝,10 种无法表达。明确说明适用范围,不夸大结论:这些逃逸所依赖的原语(特权模式、命名空间、cgroups、原始套接字)在此处并不存在,而且没有模型参与其中。
- 8 种攻击意图 × 3 个边界 — 相同的攻击意图、相同的退出码规则,没有硬编码:标准 Docker 拦截 0/8 · 加固版 Docker 拦截 2/8 · Cell 8/8(默认配置,WASI Preview1 路径);在 macOS arm64 和 DGX Spark GB10 上复现,详见下方链接的带日期基准测试产物——2026-09-18(macOS arm64)和 2026-09-20(DGX Spark GB10 / Linux arm64),文件路径见 docs/security_posture.md。**此处的
ALLOWED表示经过测试的原语仍可供沙箱内部的来宾代码使用——不代表任何内容到达了主机,也不表示这些边界之间存在排名。**gVisor 实测为 8/8 ALLOWED,原因正是它隔离了主机,同时为来宾保留 Linux ABI。WASI 0.2 组件路径是一个独立的边界,目前不具备同步阻断机制——这是实测结果,并非推断(SECURITY.md)。 - 官方 WASI 和核心规范符合性 — 在固定版本的 wasi-testsuite preview-1 套件中,72 项通过 / 1 项按设计记录为 xfail / 0 项失败;在官方 WebAssembly 核心规范测试中,31,931 项通过,所有偏差均已分类,且没有意外偏差;每周在 CI 中重新运行,并提交原始 JSON。这是标准符合性,不是安全认证——没有第三方为 Cell 认证(conformance/README.md)。
- 2026 年探测类别 — 2026 年的文件系统逃逸向量(GHSA-vqjp 的尾随斜杠/硬链接/重命名形式,以及 GHSA-2r75 / CVE-2026-47261 的 TRUNCATE 绕过)、持久化蠕虫和控制平面探测,均被拒绝;每个类别都提供了已放行的正向对照。
- 无状态性探测与跨架构确定性 — 通过构造实现无状态中的成对运行扫描,以及各平台上的 fuel 确定性(偏差为 0);结果绑定于平台,绝不可跨主机比较。
我们不比较什么——以及原因。 提示词注入套件(garak、InjecAgent)测试的是模型和 Agent 层,而不是执行边界,因此不属于执行沙箱的范围。云沙箱提供商的信息引用自第三方来源,并注明其来源状态;第三方数据从不会与我们的实测数据出现在同一张表中。
你能攻破 Cell 吗? 如果你发现了违反已记录安全边界的执行路径——逃逸、预算绕过或证明缺口?这正是我们希望收到的报告:SECURITY.md(私下披露,负责任地处理)。威胁模型及其中记录的剩余风险会告诉你应从何处着手;docs/security_posture.md中的方法部分会告诉你我们的测量方式。欢迎对 Cell 开展安全研究。
亲自评估
上述说法旨在通过全新克隆予以证伪——无需内部访问权限、密钥或私有文档。请在一次性环境中运行(参见最后一个代码块之前的安全说明):
git clone https://github.com/MichaelS1011/ephemora-cell.git && cd ephemora-cell
git checkout <full-commit-sha> # pin the commit under evaluation; record `git rev-parse HEAD`
python -m pip install -e . # source, not the published wheel — the gate lives only here
python -m pip install --require-hashes -r requirements-dev.lock # test tooling: the line above does not install pytest
python -c "from ephemora_cell.execution_report import TRUST_UNKNOWN" # ImportError ⇒ you are holding the wheel, not this source
python benchmarks/verify_8_vectors.py # expect exit 0, "8/8 attack vectors blocked", positive controls included
python -m pytest tests/test_isolation_gate.py tests/test_fs_escape_matrix.py tests/test_grant_trust.py # the enforced-boundary negative tests
python -m pytest # full suite — current count under "Testing & Verification"
请从固定提交的源码安装,而不要从软件包索引安装:pip install ephemora-cell 会获取已发布的版本,该版本早于隔离门控,因此既不包含也无法证伪这一机制。请在结果中记录提交 SHA 和 wheel/sdist 的摘要,以便将发现归因到实际观察时使用的构建版本。
然后准备你自己的 Guest:只向其授予一个临时目录,并尝试访问该目录之外的任何内容——.. 遍历、指向外部的符号链接、主机绝对路径、/proc 式读取(与 tests/test_fs_escape_matrix.py 编码的矩阵相同)。每次尝试都应以 errno 拒绝或明确拒绝告终,且不应触及授权范围之外的任何主机路径;任何偏差都属于一项发现,除非它属于文档中已注明的缺口。
请先阅读边界说明,以免把文档已说明的缺口误判为新缺陷:威胁模型、docs/security_posture.md 中的六级防护及其复现命令,以及 SECURITY.md 中的已知限制——其中包括 WASI 0.2 组件路径目前没有同步阻断机制(已测量),以及上游针对 2026 年安全公告潮的 Wasmtime 修复仍未上架 PyPI。破坏性探测(已知的主机崩溃样例、深度模糊测试、内核逃逸尝试)不属于本次自行运行测试的范围:这些测试应在专用隔离实验室中进行,不应在运行中的机器上进行。
性能
边界开销是多少?0.376 ms ——沙箱运行相较于直接运行相同任务增加的预热墙钟时间开销(实测,非估算)。
最新可复现基准测试——2026-09-14 · Mac M5 · wasmtime 47.0.1 · hello.wasm · n=1000。下方每项库数据均可通过全新克隆重新生成。MCP stdio 数据行已于 2026-10-06 撤下:仓库中没有已提交的基准测试工具和原始结果文件可复现这些数据,因此此处不予发布;提供工具后会重新加入。
| 路径 | 每次调用 | 该数据的原因 |
|---|---|---|
库,池化引擎(io_budget_bytes=None) | 中位数 0.51 ms(p95 0.89) | 缓存引擎,适用于受信任的工作负载 |
| 库,默认的每次运行新建引擎(64 MiB I/O 预算) | 中位数 0.94 ms(p95 1.15) | 每次运行都新建引擎,以确保 I/O 限制生效 |
库,run_isolated() | ~10–100 ms | 一次性工作进程、OS rlimits、强制终止 |
冷启动与预热(各 n=300,丢弃首次运行):冷启动为 0.59 ms 来宾 / 0.99 ms 墙钟,预热为 0.55 ms 来宾 / 0.93 ms 墙钟——预热差值即为 0.376 ms(overhead_warm_ms,benchmarks/results/2026-09-14/pov_benchmark.json)。与同一台机器上的容器冷启动相比(每个镜像 n=100):docker run python:3.12-slim 为 185.9 ms,而 Cell 为 0.49 ms,即 383×——这是针对该工作负载的容器冷启动与调用 WASM 的对比,并非笼统声称 WASM 胜过 Docker。此主机上的吞吐量:单行代码路径每个核心每小时约 3M 次执行,池化热循环约 5.5M 次。历史 CoreMark 测量数据仅适用于特定版本;参见 docs/performance.md。
完整矩阵、每次运行的得分、Agent 工作负载和第三方对比:docs/performance.md。复现:python benchmarks/pool_vs_budget.py · python benchmarks/competitive_benchmark.py · python benchmarks/coremark_wasi.py --rounds 3 · python benchmarks/determinism_probe.py(measured:true 的原始结果已提交至 benchmarks/results/)。
每次发布后仍然适用的两点注意事项:fuel 与平台有关——在每台主机上都是确定性的(所有已测机器上 fuel_spread: 0),但不同主机之间不可比较。此外,此处所有数据均来自 Cranelift——Python 绑定无法选择解释执行后端(Pulley/Winch 不可用,已在 tests/test_surface_audit.py 中断言),因此不会有回退机制悄然改变运行态势。
API、CLI 和集成
Cell 执行 .wasm — 它并不知道源语言。强制执行栈(模块 → 引擎 → 能力面 → 预算 → 记录)绘制在 docs/security_posture.md 中。主要 API 刻意设计得很简单,而这正是它适合审计、策略强制执行和资源核算的原因 — 不只是运行代码。
from ephemora_cell import run_wasm, run_isolated, WASIConfig, WASISandbox
result = run_wasm("tool.wasm", max_fuel=1_000_000, timeout_seconds=30)
result.status # SUCCESS | ERROR | TIMEOUT | FUEL_EXHAUSTED | MEMORY_EXCEEDED
result.exit_code
result.stdout # 10 KB cap
result.elapsed_ms
result.fuel_consumed
# OS-level process wall for untrusted guests:
result = run_isolated("tool.wasm", config=WASIConfig(max_fuel=500_000))
run_isolated() 接受相同的配置,并以字典形式返回报告字段。磁盘配额(disk_quota_bytes)和 GC 堆上限(max_gc_heap_mb)是 WASIConfig 参数;命名状态由宿主提供,作为 StateStore 传入运行过程,而不是配置标志;组件路径通过每次调用时的 run_wasm(..., abi="component") 选择 — 配方见 docs/recipes.md。
CLI — 五个动词覆盖整个循环;相同的命令也构成开发循环(编辑、运行、读取回执),无需 Dockerfile,也无需构建镜像:
ephemora-cell run Execute a WASM module (--json, --isolated, --fuel, --stdin, --profile, --abi, --tenant)
ephemora-cell inspect Imports, exports, memory — what a module wants, before you run it
ephemora-cell benchmark Cold/warm latency and fuel spread
ephemora-cell build Compile Rust/Go/C/AssemblyScript/Zig straight to WASM
ephemora-cell ledger Verify a run chain: linkage and order, and what it cannot prove
完整参考请查看 ephemora-cell --help 和 docs/recipes.md。
语言。 任何可编译为 WASM 的语言都能运行;五种 tier-1 工具链(Rust、Go、C、AssemblyScript、Zig)都会在每次推送时由 CI 门禁构建 并执行。运行 Python 被视为自带来宾环境:在 --profile interpreter 下使用固定版本的 wasi-python 3.10,每个工作负载进行 25 次进程内启动和 15 次隔离启动,每次运行都 success — 这不是 CI 门禁,因为 22 MB 的来宾二进制文件并未提交。无法运行的内容包括:原生 Python、Node.js/npm 包、Linux/ELF 二进制文件;基于 GC/线程的移植版本会保持锁定,直到 GC 堆门禁开放。编译命令、门禁和实测解释器数据见 docs/languages.md;支持策略见 ADR-009。配置档(plugin、llm、edge、default、analytical、interpreter)是预算预设 — interpreter 是用于将自带解释器作为来宾运行的预设,它不附带解释器、不开放同步例外,也不授予文件系统或环境访问权限。
GitHub Action
在 CI 中运行不可信的 PR 代码:仓库提供了一个组合式 Action,可在 Cell 沙箱中运行模块并返回分级结果,默认启用隔离子进程路径。
- id: run-tool
uses: MichaelS1011/ephemora-cell/[email protected] # pin a release tag, not a branch
with:
module: path/to/module.wasm # e.g. built from a PR-provided recipe
profile: llm
fuel: 500000
- run: echo "status=${{ steps.run-tool.outputs.status }} fuel=${{ steps.run-tool.outputs.fuel_consumed }}"
非成功状态会使步骤失败(fail-on: non-success,默认值)— 消耗完预算或触发内存上限的模块无法拖垮你的工作流。有关输入、输出、失败语义,以及本仓库自己的演示工作流如何在每次推送时验证成功和失败两种情况(无害模块运行成功;examples/fuel_bomb.wasm 在 fuel: 100 时必须以 fuel_exhausted 失败,且 fuel_consumed == 100),请参阅:action/README.md。
CI 会运行两套与框架相关的集成测试 — integration/test_hermes_subagent.py 和 integration/test_nemoclaw_isolation.py。两者都是模拟测试:它们使用仓库自带的工作负载模块驱动 Cell,并采用 Hermes 风格和 NemoClaw 风格的调用模式;两者都不会安装或导入第三方框架,因此它们是在这种流量模式下测试隔离边界,而不是证明 SDK 兼容性。integration/ 中的其他脚本(LangGraph、CrewAI、AutoGen、OpenAI Agents SDK、Semantic Kernel)是需要单独安装各自 SDK 的示例,并非 CI 门禁;这里没有任何内容声称它们是 CI 门禁。
局限性
**Cell 是:**不可信代码的最小执行边界——具备显式能力和预算的 WASM/WASI 沙箱、按资源计量的运行时、可嵌入的 Python 库、命令行工具、MCP 执行层。
**Cell 不是:**持久化工作区 · 虚拟机 · 容器编排器或通用容器替代品 · 恶意软件检测器 · 多租户云平台 · Agent 框架 · 大模型 · 代码生成器。它不会向磁盘写入任何内容,运行之间也不会继承任何内容;命名状态仅在宿主保留其存储期间存在——参见从设计上无状态。
适用场景:代码不可信或动态生成 · 工具来自第三方 · AI Agent 执行任意程序 · 需要显式资源预算 · 需要结构化执行元数据。Cell 针对有界执行进行了优化,而非长时间运行的服务工作负载——如需完整的 Linux 服务语义,请使用合适的容器或微型虚拟机边界(第三方实测对比:docs/performance.md)。
每项强制控制不代表什么——每一行都如实界定了边界,并在该边界上经过测试:
| 强制控制 | 能保证 | 不能保证 |
|---|---|---|
| 内存上限(默认 128 MB) | 客体不能超过配置的堆内存 | 客体行为正确——预算范围内的错误是客体自身的问题 |
| Fuel 预算 | 不会发生无界 CPU 消耗;达到上限时执行会停止 | 恶意软件检测——只要恶意代码保持在预算内,就能正常运行;不会检查模块的含义 |
| 墙钟超时 | 不会发生失控执行;会触发 epoch 中断 | 应用逻辑正确或运行速度快 |
| 网络拒绝(默认策略) | 默认情况下,客体无法成功建立连接——Preview1 不提供套接字 API,WASI 0.2 路径会在调用时拒绝 connect | 已授予能力范围内的安全行为——通过允许的通道外传数据(例如写入已授权预打开目录中的机密)仍由集成方负责(SECURITY.md) |
| 文件系统能力控制(仅预打开目录,默认拒绝) | 文件访问仅限显式挂载的目录 | 完整的虚拟机语义——挂载路径的内容完全由集成方选择公开 |
| 输出上限(默认 10 KB) | 捕获的输出有界;无限打印无法填满宿主磁盘 | 被截断的输出完整无缺——请检查 result.stdout 和记录 |
目标很明确:让不可信执行足够廉价且可控,使应用默认就能安全地执行它。
完整详情:SECURITY.md(策略、已知局限) · docs/threat-model.md(对手模型、信任边界、资源耗尽矩阵) · docs/security_posture.md(证据阶梯、攻击面验证、相关研究)。
路线图——主题稳定,不承诺日期;门控详情见 SECURITY.md 和 docs/observations.md:评估更新的 Wasmtime 系列,并针对其重新运行 Fuel 确定性和文件系统逃逸门控测试 · WASI 0.3,待其接口进入 Python wheel 并完成独立预算评估后再开放 · 将共享一切线程作为单独进行安全审查的选择性功能,并采用感知线程的 Fuel 和墙钟计量(docs/threads_roadmap.md) · 在当前定期模糊测试之外开展持续模糊测试,目标覆盖解析器/验证器接口及上述不变量。
测试与验证
main 上当前的门槛(v1.1.0 加固后),在此提交的新克隆上测得——不是每台主机的固定值:1084 项测试通过(4 项跳过)· 90% 语句覆盖率(此提交测得 4098/4548;门槛为 80%)· 8/8 个攻击向量被拦截(默认安全态势,WASI Preview1 路径)· 官方 wasi-testsuite 一致性测试通过 72 项(固定版本,0 项失败)· 每次推送均由 CI 强制执行(测试、覆盖率、pip-audit、SBOM、bandit、官方 MCP SDK 互操作)——此外,在同一克隆上:针对已安装制品进行仅 wheel 的冒烟测试(记录于 v1.1.0 GitHub 发布版本中),以及在 sdist 净室容器中运行。
此处“测试套件”的含义——一个权威数字。 1084/4(共收集 1088 项)是 pytest 在 CI 两个任务所用环境中报告的结果:requirements.txt(固定版本的 wasmtime)、测试依赖,以及每条 Ed25519 路径都需要的可选 tools-signing extra(cryptography>=42)。测试数量由 scripts/check_test_count.py 对照 pytest --collect-only 进行机器检查,因此发布说明中的测试数量不会与代码不符。相关的其他数字——不含 cryptography 的最小安装测试数量、sdist 容器测试范围、工具链跳过项的不对称性,以及主机负载对 io_cpu_seconds 看门狗的影响——各自描述不同的安装状态,并连同各自的条件记录在 docs/release_assurance.md 中;每次发布时均由人工重新测量,而非由检查脚本测量。
文档
安全与证据 · SECURITY.md — 策略、执行路径矩阵、漏洞报告 · docs/threat-model.md — 信任边界、对手模型、资源耗尽矩阵 · docs/security_posture.md — 证据阶梯、结果表、CVE 重放详情 · conformance/README.md — 官方 wasi-testsuite 和核心规范测试结果 · docs/release_assurance.md — 各安装状态下测得的数量 · docs/security_review_2026-10-05.md — 六个红队方向发现的问题、通过严苛测试验证修复的问题、操作员随后做出的三项安全态势决策(授权范围、未授权工具、握手顺序)、对当天同一份代码进行审计的第二轮审查,以及仍未解决的事项及其原因
快速上手 · 快速开始 · docs/recipes.md — 使用模式(FastAPI、无服务器、气隙环境、WASI 0.2)和故障排除 · integration/ — Agent 框架示例
性能 · docs/performance.md — 基准测试和各路径延迟,包括 CoreMark 测量所适用的版本范围 · benchmarks/results/ — 原始 measured:true JSON
集成与语言 · docs/mcp.md — MCP 服务 · docs/comparison-mcp-servers.md — CVE 与探测项的映射 · action/README.md — 组合式 GitHub Action · docs/languages.md — 编译矩阵和解释器 Guest · docs/egress_patterns.md — 经批准的 API 调用模式 · docs/observations.md — 我们有意暂不处理的关注事项及各自的退出条件
决策与变更 · ADR-001…015 — 所有决策记录,包括关于谁可以更改运行中工作负载安全边界的 ADR-006 · examples/signed_record_demo.py — 对运行记录进行签名和篡改检查 · CHANGELOG.md
企业 · docs/enterprise.md — 隔离与运维:何时值得讨论这一话题
许可证
Ephemora-cell 根据 Business Source License 1.1(BUSL-1.1)授权——源码可用,但并非开源。
- 可免费用于非生产用途——评估、开发、研究和测试。
- 在适用的变更日期之前,用于商业或生产用途需要获得许可方 Michael Soppa 的许可——参见 docs/enterprise.md。
- **自动转换:**每个版本在首次公开分发四年后转换为 Apache 2.0。
- **按版本划分的许可证历史:**1.0.4.3 及更早版本采用 Apache-2.0。1.0.5 及更高版本采用 BUSL-1.1(ADR-010 记录了每个版本的首次公开分发日期和变更日期)。
- **不提供担保:**许可作品按“原样”提供,并明确声明不提供任何担保或条件,具体条款见 LICENSE。
- 第三方材料不在此处重新授权:根据其他许可证提供或引用的内容,列于 THIRD_PARTY_NOTICES.md。
Ephemora-cell 是独立的执行边界——不依赖 Ephemora。Ephemora 企业版基于此边界构建,适用于生产环境和受监管的部署:Cell 完整支持隔离,企业版完整支持运营。
mcp-name: io.github.MichaelS1011/ephemora-cell-mcp
一次 Agent 操作。一次有界执行。一个受控结果。
由 Michael Soppa 创建。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。