
Изолируйте ненадёжный код с безопасным доступом к хосту.
Песочница для непроверенного кода с безопасным доступом к хосту.
Chimera — это пользовательская песочница для кода, которому вы не вполне доверяете. Она естественным образом подходит для агентов, пишущих код и выполняющих произвольные сгенерированные команды на машине, которую они разделяют с вами. Chimera ограничивает действия процесса на хосте, но при этом позволяет ему обращаться к файлам и инструментам хоста, так что код остаётся полезным, не имея возможности повредить систему. Поскольку она работает как обычная программа, Chimera не требует виртуальной машины, контейнера, специального оборудования, возможностей ядра или привилегий — она работает везде, где уже выполняется ваш код.
Это достигается выполнением немодифицированных двоичных файлов через динамическую двоичную трансляцию с той же архитектурой набора команд (same-ISA), перехватывая каждый системный вызов гостя, чтобы песочница решала, что ему делать. Chimera поставляется в двух частях: утилита командной строки chimera для запуска процесса в обёртке и библиотека Rust для встраивания той же среды выполнения в вашу собственную программу. Разработчики, встраивающие Chimera, предоставляют обработчик системных вызовов, который решает, что делать с каждым гостевым системным вызовом — передать его ядру хоста, записать в журнал или виртуализировать.
В настоящее время Chimera поддерживает Linux/x86, а порт на Darwin/arm64 находится в разработке.
Установите утилиту командной строки chimera из GitHub:
cargo install --git https://github.com/penberg/chimera chimera-cli
Затем оберните любую команду:
chimera run /bin/echo hello
По умолчанию Chimera передаёт все системные вызовы ядру хоста, поэтому обёрнутый процесс ведёт себя как обычный.
Если вы работаете из клона репозитория, установите с помощью cargo install --path cli.
Крейт chimera предоставляет среду выполнения, на которой построен CLI. Реализуйте трейт SystemCalls, чтобы решить, как обрабатывать каждый гостевой системный вызов:
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 license.
Если вы явно не заявляете об обратном, любой вклад, намеренно представленный вами для включения в Chimera, лицензируется по MIT без каких-либо дополнительных условий.