
المستودع الرئيسي لـ LFI: عزل برمجي عملي وفعال وآمن
مرحبًا بكم في المستودع الرئيسي لمشروع عزل الأخطاء الخفيف (LFI).
LFI هو نظام لعزل الكود الأصلي (sandboxing). مثل WebAssembly و Native Client، يقوم LFI بعزل الكود المُعزل (sandboxed) داخل العملية (أي في نفس مساحة العنوان لتطبيق المضيف). حاليًا، ندعم أهداف 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، وأداة ما بعد الربط لإجراء تحويلات ثنائية بعد الربط (ضرورية فقط على x86-64).lfi-bind: أداة لتوليد الدوال القافزة (trampolines) وإجراءات التهيئة لتشغيل المكتبات داخل صناديق 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 مثبتة عبر تثبيت منفصل، ففكر في إضافة lfi-clang فقط إلى PATH بدلاً من ذلك.
بمجرد حصولك على مترجم، يجب أن تكون قادرًا على بناء برنامج 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.