
Repository di alto livello per LFI: Sandboxing software-based pratico, efficiente e sicuro.
Benvenuti nel repository di primo livello per il progetto Lightweight Fault Isolation (LFI).
LFI è un sistema per isolare (sandboxing) il codice nativo. Come WebAssembly e Native Client, LFI isola il codice in sandbox in-process (cioè nello stesso spazio di indirizzi dell'applicazione host). Attualmente supportiamo target Arm64 e x86-64, e abbiamo supporto sperimentale per RISC-V.
LFI è progettato fin dall'inizio per isolare codice esistente, come librerie C/C++ (incluso codice assembly) e driver di dispositivo.
LFI mira ai seguenti obiettivi:
Gli obiettivi non prioritari includono un formato binario stabile e l'indipendenza dalla piattaforma. Utilizzeremo tutte le caratteristiche hardware specifiche dell'architettura e le tecniche del compilatore che possiamo per migliorare le prestazioni.
LFI attualmente impone un overhead di circa il 7% (Arm64) o l'8% (x86-64) rispetto al codice nativo quando si isolano letture e scritture, e un overhead dell'1.5% (Arm64) o del 6% (x86-64) quando si isolano solo le scritture (media geometrica su SPEC 2017). I context switch di LFI (cioè tra sandbox e applicazione host) richiedono solo decine di cicli, e LFI può supportare migliaia di sandbox in un singolo spazio di indirizzi: ~64K (Arm64) o ~3K (x86-64), con ogni sandbox che riceve fino a 4GiB di memoria.
lfi-runtime: il runtime responsabile del caricamento dei programmi LFI, della gestione delle chiamate host e dell'esecuzione della verifica.lfi-verifier: il verificatore LFI.lfi-rewriter: il rewriter LFI per l'assembly GNU e uno strumento post-linker per eseguire trasformazioni binarie dopo il collegamento (necessario solo su x86-64).lfi-bind: uno strumento per generare trampoline e routine di inizializzazione per eseguire librerie all'interno delle sandbox LFI.lfi-llvm-toolchain: script per costruire una toolchain compilatore LFI basata su LLVM, insieme a un sysroot che include compiler-rt, musl, libc++ e mimalloc.llvm-project: il nostro fork di sviluppo del progetto LLVM.lfi-specification: i sorgenti LaTeX per il documento di specifica LFI.lfi-bench: una raccolta di librerie e benchmark per la valutazione delle prestazioni di LFI.Per iniziare con LFI, avrete bisogno di un compilatore LFI. Potete ottenerne uno da https://github.com/lfi-project/lfi-llvm-toolchain. I compilatori precompilati per aarch64 e x86-64 sono disponibili nei rilasci: https://github.com/lfi-project/lfi/releases/latest. Scaricate il pacchetto aarch64-lfi-clang.tar.gz o x86_64-lfi-clang.tar.gz, a seconda della vostra architettura (oppure aarch64-lfi-clang-host-x86_64.tar.gz se volete compilare in modo incrociato per aarch64 da x86-64).
Dopo aver estratto l'archivio, dovreste vedere una struttura di directory come questa:
├── bin
│ ├── LLVM tools (clang, lld, ...)
├── include
├── lfi-bin
│ ├── lfi-postlink
│ ├── lfi-rewrite
│ ├── lfi-run
│ ├── lfi-verify
│ ├── ARCH-lfi-linux-musl-clang -> ../bin/clang
│ └── ARCH-lfi-linux-musl-clang++ -> ../bin/clang++
├── lfi-clang
│ ├── ARCH-lfi-linux-musl-clang -> ../bin/clang
│ └── ARCH-lfi-linux-musl-clang++ -> ../bin/clang++
├── lib
├── libexec
├── share
└── sysroot
Dovreste aggiungere la directory lfi-bin al vostro PATH. Se avete già gli strumenti LFI installati tramite un'installazione separata, considerate di aggiungere solo lfi-clang al vostro PATH.
Una volta ottenuto un compilatore, dovreste essere in grado di compilare un semplice programma C o C++:
#include <stdio.h>
int main() {
printf("Hello from LFI\n");
return 0;
}
Compilate ed eseguite usando lfi-run:
$ aarch64-lfi-linux-musl-clang hello.c -O2 -o hello -static-pie
$ lfi-run -v ./hello
Hello from LFI
Potete usare lo strumento precompilato lfi-run dall'archivio precompilato. Potete anche facilmente compilare il runtime LFI dal sorgente:
git clone https://github.com/lfi-project/lfi-runtime
cd lfi-runtime
meson setup build
cd build
ninja
./tools/lfi-run/lfi-run ...
Lo strumento lfi-run è principalmente destinato a benchmark e test. Non esegue la verifica per impostazione predefinita (usare -v per abilitarla) e consente l'accesso completo al filesystem per impostazione predefinita. Consultare l'uso (lfi-run --help) per ulteriori informazioni.
Dopo aver compilato ed eseguito il vostro primo programma LFI, potreste voler esplorare diverse direzioni. Consultate le seguenti guide per alcuni suggerimenti:
lfi-bench: guida.Questo repository esisteva in precedenza all'indirizzo zyedidia/lfi e conteneva l'implementazione iniziale di LFI. Questi sorgenti possono essere trovati nel branch lfi-research.