>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Rust

Como Executar Código Não Confiável Sem Ficar Careca

Imagine que você precisa executar um pedaço de código enviado por um usuário ou serviço de terceiros. O Docker normal parece pesado demais, e simplesmente rodar em um processo separado é aterrorizante. Um passo em falso e seu servidor vira uma abóbora ou, pior, se torna parte de uma botnet. É exatamente esse tipo de cenário que os caras do CNCF Sandbox estão desenvolvendo o Hyperlight para resolver.

hyperlight logo

O Que É Essa Fera

Hyperlight é uma biblioteca Rust que cria micro-máquinas virtuais na hora. Ela não tenta emular um computador inteiro com placa de vídeo e teclado. Em vez disso, o projeto cria um ambiente de execução totalmente despido que nem sequer tem um kernel de SO. O "guest" inteiro é apenas um binário compilado para no_std Rust ou C.

O principal atrativo aqui é a velocidade. Os autores garantem que uma micro-VM inicia em milissegundos, e chamadas de função entre host e guest levam microssegundos. Parece a base perfeita para construir suas próprias plataformas serverless ou plugins seguros.

Como Funciona na Prática

Trabalhar com Hyperlight parece programação normal, exceto que as funções executam em mundos diferentes. Você adiciona a biblioteca à sua aplicação Rust, alimenta com um binário guest compilado e chama os métodos.

Aqui está como fica a inicialização do lado host:

// Подготавливаем песочницу, пока без запуска VM
let mut sandbox = UninitializedSandbox::new(GuestBinary::FilePath(guest_path), None)?;

// Можно прокинуть функцию из хоста в гостя, например, для доступа к БД
sandbox.register("GetWeekday", || Ok("Monday".to_string()))?;

// А теперь «зажигаем» VM
let mut sandbox: MultiUseSandbox = sandbox.evolve()?;

// Вызываем функцию внутри виртуалки
let greeting: String = sandbox.call("SayHello", "World".to_string())?;
println!("{greeting}"); 

E aqui está como fica o código dentro da máquina virtual. Graças às macros, tudo é bem transparente:

#[host_function("GetWeekday")]
fn get_weekday() -> Result<String>;

#[guest_function("SayHello")]
fn say_hello(name: String) -> Result<String> {
    let weekday = get_weekday()?;
    Ok(format!("Hello, {name}! Today is {weekday}."))
}

Por Que É Mais Rápido Que VMs Normais

O segredo está no minimalismo total. O Hyperlight não tem Linux dentro de Linux. Não há drivers de sistema de arquivos, stack de rede ou agendador de tarefas. Quando você chama uma função, o hypervisor (KVM no Linux ou MSHV/WHP no Windows) simplesmente troca o contexto da CPU.

Um detalhe interessante: o projeto suporta mecanismos de snapshot e restore. Se você precisa executar milhares de chamadas similares, pode inicializar o sandbox uma vez, tirar um snapshot da memória e voltar a ele antes de cada nova execução. Isso garante que cada chamada comece com uma página em branco sem gastar tempo recarregando o binário.

Quem Precisa Disso e Por Quê

Vejo vários cenários onde o Hyperlight pode realmente decolar.

Primeiro, funções na nuvem (FaaS). Se você está construindo sua própria alternativa ao AWS Lambda, precisa de isolamento no nível do hypervisor mas não quer esperar um segundo para um container subir.

Segundo, extensões para sistemas complexos. Digamos que você tem um banco de dados ou servidor de jogos e quer permitir que usuários escrevam seus próprios scripts. Lua ou WASM é legal, mas o Hyperlight oferece isolamento ainda mais rigoroso e permite escrever em Rust ou C familiares.

A propósito, o repositório tem links para projetos relacionados como hyperlight-wasm e hyperlight-js. Isso significa que você já pode rodar WebAssembly ou JavaScript dentro dessas micro-VMs, tornando a ferramenta ainda mais versátil.

Nuances e Limitações

O projeto está em status pré-1.0. Isso significa que a API pode mudar a qualquer momento e a documentação às vezes deixa a gente coçando a cabeça.

Nota importante: o Hyperlight não foi projetado para rodar aplicações Linux normais. Você não conseguirá rodar ls ou curl lá porque chamadas de sistema simplesmente não existem. Se você precisa exatamente disso, terá que olhar para o Unikraft ou VMMs completos como o Firecracker. Aqui estamos falando de código puro no vácuo.

Vale a Pena Experimentar

Se sua tarefa é executar um pequeno pedaço de código com segurança e latência mínima, o Hyperlight parece muito promissor. Ele fornece aquele ponto ideal entre processos "vazados" e VMs pesadas.

A maneira mais fácil de começar é pelo GitHub Codespaces, com links direto no README. Tudo já está configurado lá, incluindo KVM, então você pode fuçar os exemplos sem configurar sua máquina local. O projeto é ativamente mantido sob o guarda-chuva do CNCF, com calls regulares da comunidade, então suas perspectivas de longo prazo parecem sólidas.

Projetos relacionados