
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 कॉन्टेक्स्ट स्विच (यानी सैंडबॉक्स और होस्ट एप्लिकेशन के बीच) केवल 10s चक्र लेते हैं, और LFI एक ही एड्रेस स्पेस में हजारों सैंडबॉक्स का समर्थन कर सकता है: ~64K (Arm64) या ~3K (x86-64), प्रत्येक सैंडबॉक्स को 4GiB तक मेमोरी दी गई है।
lfi-runtime: LFI प्रोग्राम लोड करने, होस्ट कॉल को संभालने और सत्यापन चलाने के लिए जिम्मेदार रनटाइम।lfi-verifier: LFI सत्यापक।lfi-rewriter: GNU असेंबली के लिए LFI रीराइटर, और लिंकिंग के बाद बाइनरी परिवर्तन करने के लिए एक पोस्ट-लिंकर उपकरण (केवल x86-64 पर आवश्यक)।lfi-bind: LFI सैंडबॉक्स के अंदर लाइब्रेरी चलाने के लिए ट्रैम्पोलिन और आरंभीकरण रूटीन उत्पन्न करने का एक उपकरण।lfi-llvm-toolchain: LLVM-आधारित LFI कंपाइलर टूलचेन बनाने के लिए स्क्रिप्ट, साथ ही एक sysroot जिसमें compiler-rt, musl, libc++, और mimalloc शामिल हैं।llvm-project: LLVM परियोजना का हमारा विकास फोर्क।lfi-specification: LFI विनिर्देश दस्तावेज़ के लिए LaTeX स्रोत।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 यदि आप x86-64 से aarch64 पर क्रॉस कंपाइल करना चाहते हैं)।
आर्काइव खोलने के बाद, आपको इस प्रकार की एक निर्देशिका संरचना दिखाई देनी चाहिए:
├── 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 शाखा पर पाए जा सकते हैं।