>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Rust

Jak bezpiecznie uruchamiać niezaufany kod

Wyobraź sobie, że musisz wykonać fragment kodu przesłanego przez użytkownika lub zewnętrzną usługę. Zwykły Docker wydaje się zbyt ciężki, a uruchomienie go w osobnym procesie to istne szaleństwo. Jeden błąd i twój serwer zamienia się w dynię lub, co gorsza, staje się częścią botnetu. Właśnie na takie scenariusze twórcy z CNCF Sandbox rozwijają Hyperlight.

hyperlight logo

Co to za bestia

Hyperlight to biblioteka Rust, która tworzy mikrowirtualne maszyny na żądanie. Nie próbuje emulować całego komputera z kartą graficzną i klawiaturą. Zamiast tego projekt uruchamia maksymalnie zredukowane środowisko wykonawcze, które nie ma nawet jądra systemu operacyjnego. Cały „gość" to po prostu binarka skompilowana dla no_std Rust lub C.

Główną zaletą jest tutaj szybkość. Autorzy twierdzą, że mikrowirtualna maszyna startuje w milisekundach, a wywołania funkcji między hostem a gościem trwają mikrosekundy. Brzmi to jak idealny fundament do budowania własnych platform serverless lub bezpiecznych wtyczek.

Jak to działa w praktyce

Praca z Hyperlight przypomina zwykłe programowanie, z tą różnicą, że funkcje wykonują się w różnych światach. Dodajesz bibliotekę do swojej aplikacji Rust, podajesz skompilowaną binarkę gościa i wywołujesz metody.

Oto jak wygląda inicjalizacja po stronie hosta:

// Подготавливаем песочницу, пока без запуска 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}"); 

A oto jak wygląda kod wewnątrz maszyny wirtualnej. Dzięki makrom wszystko jest bardzo przejrzyste:

#[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}."))
}

Dlaczego jest szybsze od zwykłych maszyn wirtualnych

Sekret tkwi w całkowitym minimalizmie. Hyperlight nie ma Linuksa wewnątrz Linuksa. Nie ma sterowników systemu plików, stosu sieciowego ani harmonogramu zadań. Gdy wywołujesz funkcję, hipernadzorca (KVM na Linuksie lub MSHV/WHP na Windowsie) po prostu przełącza kontekst CPU.

Ciekawe jest to, że projekt obsługuje mechanizmy snapshot i restore. Jeśli musisz wykonać tysiące podobnych wywołań, możesz zainicjować piaskownicę raz, zrobić migawkę pamięci i przywracać ją przed każdym nowym uruchomieniem. Dzięki temu każde wywołanie zaczyna się od czystej karty bez konieczności ponownego ładowania binarki.

Kto tego potrzebuje i dlaczego

Widzę kilka scenariuszy, w których Hyperlight mógłby naprawdę się sprawdzić.

Po pierwsze, funkcje chmurowe (FaaS). Jeśli budujesz własną alternatywę dla AWS Lambda, potrzebujesz izolacji na poziomie hipernadzorcy, ale nie chcesz czekać sekundy na uruchomienie kontenera.

Po drugie, rozszerzenia dla złożonych systemów. Załóżmy, że masz bazę danych lub serwer gry i chcesz pozwolić użytkownikom pisać własne skrypty. Lua lub WASM jest cool, ale Hyperlight zapewnia jeszcze ściślejszą izolację i pozwala pisać w znajomym Rust lub C.

Przy okazji, w repozytorium znajdują się linki do powiązanych projektów, takich jak hyperlight-wasm i hyperlight-js. Oznacza to, że możesz już uruchamiać WebAssembly lub JavaScript wewnątrz tych mikrowirtualnych maszyn, co czyni narzędzie jeszcze bardziej uniwersalnym.

Niuansy i ograniczenia

Projekt jest w fazie przed 1.0. Oznacza to, że API może się zmienić w każdej chwili, a dokumentacja czasem sprawia, że głowa boli.

Ważna uwaga: Hyperlight nie jest przeznaczony do uruchamiania zwykłych aplikacji Linuksowych. Nie będziesz w stanie uruchomić tam ls ani curl, ponieważ wywołania systemowe po prostu nie istnieją. Jeśli potrzebujesz dokładnie tego, musisz rozejrzeć się za Unikraft lub pełnoprawnymi VMM-ami jak Firecracker. Tutaj mówimy o czystym kodzie w próżni.

Czy warto spróbować

Jeśli twoim zadaniem jest bezpieczne wykonanie niewielkiego fragmentu kodu z minimalnym opóźnieniem, Hyperlight wygląda bardzo obiecująco. Zapewnia idealny kompromis między „nieszczelnymi" procesami a ciężkimi maszynami wirtualnymi.

Najłatwiejszy sposób na rozpoczęcie pracy to GitHub Codespaces, z linkami w README. Wszystko jest tam już skonfigurowane, włącznie z KVM, więc możesz poeksperymentować z przykładami bez konfiguracji lokalnego środowiska. Projekt jest aktywnie rozwijany pod parasolem CNCF, z regularnymi spotkaniami społeczności, więc jego długoterminowe perspektywy wyglądają solidnie.

Powiązane projekty