将不受信任的代码沙盒化,并提供到主机的安全访问。
Chimera 是一个用于不完全受信任代码的用户态沙箱——非常适合在与你共享的机器上运行任意生成命令的编码代理。它限制进程对宿主机的操作,同时仍允许其访问宿主机的文件和工具,从而使代码保持有用,但无法破坏系统。由于作为普通程序运行,Chimera 无需虚拟机、容器、特殊硬件、内核特性或特权——它在你的代码已经运行的地方就能工作。
它通过在同一ISA上进行动态二进制转换来运行未经修改的二进制文件,拦截每个客户系统调用,从而让沙箱决定其行为。Chimera 包含两个部分:一个用于在shell中包装进程的命令行工具 chimera,以及一个用于将相同运行时嵌入到你自己的程序中的Rust库。嵌入者需要提供一个系统调用处理程序,来决定每个客户系统调用如何处理——转发给主机内核、记录日志还是虚拟化它。
Chimera 目前支持 Linux/x86 目标,并正在向 Darwin/arm64 移植。
从GitHub安装 chimera 命令行工具:
cargo install --git https://github.com/penberg/chimera chimera-cli
然后包装任何命令:
chimera run /bin/echo hello
默认情况下,Chimera 会将每个系统调用转发给主机内核,因此被包装的进程行为与原生进程相同。
如果从仓库中检出,则使用 cargo install --path cli 安装。
chimera crate 暴露了 CLI 所基于的运行时。
实现 SystemCalls trait 来决定每个客户系统调用的处理方式:
use chimera::{Sandbox, SystemCall, SystemCalls, host_syscall};
struct Tracer;
impl SystemCalls for Tracer {
fn handle(&mut self, call: &mut SystemCall) {
eprintln!("syscall {}", call.number);
call.set_result(host_syscall(call));
}
}
fn main() -> Result<(), chimera::Error> {
let mut sandbox = Sandbox::new("/bin/echo")?;
sandbox.args(["hello"]).system_calls(Tracer);
sandbox.run()?;
Ok(())
}
工作示例位于 runtime/examples/:
参见 ARCHITECTURE.md。
本项目采用 MIT 许可证。
除非你明确声明,否则你有意提交以包含在 Chimera 中的任何贡献,均应按 MIT 许可证授权,不附加任何额外条款或条件。