
Sandbox codice non affidabile con accesso sicuro all'host.
Sandbox per codice non fidato con accesso sicuro all'host.
Chimera è una sandbox in spazio utente per codice di cui non ti fidi completamente — una scelta naturale per agenti di codifica che eseguono comandi arbitrari e generati su una macchina condivisa con te. Limita ciò che un processo può fare sull'host, pur consentendogli di raggiungere file e strumenti dell'host, così il codice rimane utile senza essere libero di corrompere il sistema. Poiché viene eseguito come un programma normale, Chimera non richiede VM, container, hardware speciale, funzionalità del kernel o privilegi — funziona ovunque il tuo codice venga già eseguito.
Raggiunge questo eseguendo binari non modificati tramite traduzione binaria dinamica same-ISA, intercettando ogni chiamata di sistema dell'ospite in modo che la sandbox decida cosa fare. Chimera è distribuito come due parti: uno strumento da riga di comando chimera per eseguire un processo nella shell, e una libreria Rust per incorporare lo stesso runtime nel tuo programma. Gli integratori forniscono un gestore delle chiamate di sistema che decide cosa fare per ogni syscall dell'ospite — inoltrarla al kernel host, registrarla o virtualizzarla.
Chimera attualmente supporta il target Linux/x86 con una porta in fase di sviluppo per Darwin/arm64.
Installa lo strumento da riga di comando chimera da GitHub:
cargo install --git https://github.com/penberg/chimera chimera-cli
Poi esegui qualsiasi comando:
chimera run /bin/echo hello
Di default, Chimera inoltra ogni chiamata di sistema al kernel host, quindi il processo eseguito si comporta come uno nativo.
Da un checkout, installa con cargo install --path cli invece.
Il crate chimera espone il runtime su cui si basa la CLI.
Implementa il trait SystemCalls per decidere come gestire ogni syscall dell'ospite:
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(())
}
Esempi funzionanti si trovano in runtime/examples/:
sandbox — una sandbox per chiamate di sistema basata su lista bianca.strace — reimplementa strace(1) sopra lo stesso trait.Vedi ARCHITECTURE.md.
Questo progetto è concesso in licenza con la licenza MIT.
Salvo dichiarazione contraria esplicita, qualsiasi contributo inviato intenzionalmente per l'inclusione in Chimera da parte tua sarà concesso in licenza come MIT, senza ulteriori termini o condizioni.