
Главный репозиторий для LFI: Практичная, эффективная и безопасная программная изоляция
Добро пожаловать в главный репозиторий проекта Облегченной изоляции сбоев (LFI).
LFI — это система для изолированного выполнения нативного кода. Как WebAssembly и Native Client, LFI изолирует изолируемый код в рамках процесса (т.е. в том же адресном пространстве, что и хост-приложение). В настоящее время мы поддерживаем цели Arm64 и x86-64, а также имеем экспериментальную поддержку RISC-V.
LFI спроектирован с нуля для изоляции существующего кода, такого как библиотеки C/C++ (включая ассемблерный код) и драйверы устройств.
LFI стремится к следующим целям:
Нецелями являются стабильный двоичный формат и независимость от платформы. Мы будем использовать любые архитектурно-зависимые аппаратные возможности и методы компиляции, которые сможем, для повышения производительности.
В настоящее время LFI накладывает около 7% (Arm64) или 8% (x86-64) накладных расходов по сравнению с нативным кодом при изоляции чтения и записи, и 1,5% (Arm64) или 6% (x86-64) при изоляции только записи (геометрическое среднее по SPEC 2017). Переключение контекста LFI (т.е. между изолированным кодом и хост-приложением) занимает всего десятки тактов, и LFI может поддерживать тысячи изолированных сред в одном адресном пространстве: ~64K (Arm64) или ~3K (x86-64), при этом каждая изолированная среда может иметь до 4 ГиБ памяти.
lfi-runtime: среда выполнения, отвечающая за загрузку программ LFI, обработку вызовов хоста и выполнение верификации.lfi-verifier: верификатор LFI.lfi-rewriter: переписчик LFI для GNU Assembler и инструмент пост-линковки для выполнения двоичных преобразований после линковки (необходим только на x86-64).lfi-bind: инструмент для генерации трамплинов и процедур инициализации для запуска библиотек внутри изолированных сред LFI.lfi-llvm-toolchain: скрипты для сборки цепочки инструментов компилятора LFI на основе LLVM, а также sysroot, включающий compiler-rt, musl, libc++ и mimalloc.llvm-project: наш форк разработки проекта LLVM.lfi-specification: исходники LaTeX для документа спецификации LFI.lfi-bench: коллекция библиотек и тестов производительности для оценки производительности LFI.Чтобы начать работу с LFI, вам понадобится компилятор LFI. Вы можете получить его на https://github.com/lfi-project/lfi-llvm-toolchain. Предварительно собранные компиляторы для aarch64 и x86-64 размещены в релизах: https://github.com/lfi-project/lfi/releases/latest. Скачайте пакет aarch64-lfi-clang.tar.gz или x86_64-lfi-clang.tar.gz в зависимости от вашей архитектуры (или aarch64-lfi-clang-host-x86_64.tar.gz, если вы хотите кросс-компилировать для aarch64 с x86-64).
После распаковки архива вы должны увидеть структуру каталогов, подобную этой:
├── 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
Вам нужно добавить каталог lfi-bin в ваш PATH. Если у вас уже установлены инструменты LFI отдельно, рассмотрите возможность добавления в PATH только lfi-clang.
После получения компилятора вы сможете собрать простую программу на C или C++:
#include <stdio.h>
int main() {
printf("Hello from LFI\n");
return 0;
}
Скомпилируйте и запустите с помощью lfi-run:
$ aarch64-lfi-linux-musl-clang hello.c -O2 -o hello -static-pie
$ lfi-run -v ./hello
Hello from LFI
Вы можете использовать предварительно собранный инструмент lfi-run из предварительно собранного архива. Вы также можете легко собрать среду выполнения LFI из исходников:
git clone https://github.com/lfi-project/lfi-runtime
cd lfi-runtime
meson setup build
cd build
ninja
./tools/lfi-run/lfi-run ...
Инструмент lfi-run в основном предназначен для тестирования производительности и отладки. По умолчанию он не запускает верификацию (передайте -v для включения) и по умолчанию предоставляет полный доступ к файловой системе. См. справку (lfi-run --help) для получения дополнительной информации.
После сборки и запуска вашей первой программы LFI вы, возможно, захотите изучить несколько других направлений. См. следующие руководства для некоторых предложений:
lfi-bench: руководство.Ранее этот репозиторий находился по адресу zyedidia/lfi и содержал начальную реализацию LFI. Эти исходники можно найти в ветке lfi-research.