
fil-c v0.685
Fil-C: أمان ذاكرة متوافق تمامًا مع C و C++
Fil-C 0.686
Fil-C هو تطبيق متوافق بشكل متطرف وآمن للذاكرة للغة C و C++. يتم ترجمة وتشغيل الكثير من البرامج باستخدام Fil-C دون أي تغييرات أو بأقل تغييرات ممكنة. يتم اكتشاف جميع أخطاء أمان الذاكرة على شكل حالات panic في Fil-C. يحقق Fil-C ذلك باستخدام مزيج من جمع القمامة المتزامن والقدرات غير المرئية (كل مؤشر في الذاكرة له قدرة مقابلة، غير مرئية لفضاء عناوين C). يتم التحقق من كل عملية C أساسية (كما تظهر في LLVM IR) مقابل القدرة. لا يحتوي Fil-C على عبارة unsafe ولديه فقط واجهة FFI محدودة للكود غير الآمن.
يتميز Fil-C للأسباب التالية:
-
يحقق Fil-C أمانًا كاملاً دون أي منافذ هروب. لا يوجد كلمة مفتاحية
unsafeفي Fil-C يمكن استخدامها لإيقاف الحمايات. الربط بالكود غير الآمن مقيّد بشدة. -
يحقق نهج Fil-C القائم على القدرات مستوى أمان مشابهًا للقدرات العتادية مثل CHERI، باستثناء أنه يعمل على عتاد عادي (X86_64 أو ARM64).
-
تم هندسة Fil-C لمنع استخدام أخطاء أمان الذاكرة في الاستغلال بدلاً من مجرد الإشارة إليها بشكل متكرر بما يكفي للعثور على الأخطاء. هذا يجعل Fil-C مختلفًا عن AddressSanitizer، أو HWAsan، أو MTE، والتي يمكن للمهاجمين تجاوزها جميعًا. الفرق الرئيسي الذي يجعل ذلك ممكنًا هو أن Fil-C قائم على القدرات (بحيث يعرف كل مؤشر نطاق الذاكرة التي يمكنه الوصول إليها، وكيف يمكنه الوصول إليها) بدلاً من أن يكون قائمًا على الوسوم (حيث يُسمح بالوصول عبر المؤشرات إذا وصلت إلى ذاكرة صالحة).
-
من وجهة نظر مستخدم اللغة، Fil-C هو مجرد C و C++ مع امتدادات GCC/clang. من المرجح أكثر من لا أن برنامجك أو مكتبتك المفضلة بلغة C أو C++ ستُترجم في Fil-C دون أي تغييرات. يعتمد مترجم Fil-C على clang 20.1.8، لذا فهو يدعم C17 و C++20.
الترخيص
المترجم (clang + LLVM) مشمول بـ LLVM-LICENSE.txt. وقت التشغيل مشمول بـ PAS-LICENSE.txt (انظر libpas/LICENSE.txt في توزيع المصدر). في حالة توزيع Fil-C الكلاسيكي القائم على musl، فإن musl libc مشمول بـ MUSL-LICENSE.txt (انظر projects/yolomusl/COPYRIGHT و projects/usermusl/COPYRIGHT في توزيع المصدر). في حالة توزيع /opt/fil، فإن glibc مشمول بـ glibc-LICENSE.txt، وجميع البرامج الأخرى المضمنة مشمولة بملفات -LICENSE.txt الخاصة بها. مكتبات C++ (libc++/libc++abi) مشمولة بـ LLVM-LICENSE.txt.
يمكنك الحصول على المصدر للمترجم، ووقت التشغيل، و libc++/libc++abi، و libc (musl و glibc)، وجميع البرامج المضمنة من github. يتضمن توزيع المصدر أيضًا العديد من البرامج الإضافية التي تم نقلها إلى Fil-C في مجلدات projects/ و pizlix/، ولها مجموعة متنوعة من التراخيص. يتضمن توزيع /opt/fil إصدارات مبنية من مجموعة متنوعة من البرامج الإضافية وتراخيصها موجودة في additional-licenses/ في ذلك التوزيع.
المتطلبات
يعمل Fil-C فقط على Linux/X86_64 أو Linux/ARM64.
عملت الإصدارات السابقة على Darwin/ARM64 و FreeBSD، لكنني الآن أركز فقط على Linux لأنه يسمح لي بالقيام بعمل أكثر إخلاصًا في تنفيذ libc. لا يوجد شيء يمنع Fil-C من العمل على معماريات أو أنظمة تشغيل أخرى غير Linux بشكل جوهري.
البدء
إذا قمت بتنزيل ثنائيات Fil-C، فشغّل:
./setup.sh
هذا له تأثير مختلف اعتمادًا على توزيع الثنائيات الذي اخترته:
-
في حالة التوزيع الكلاسيكي القائم على musl (
filc-0.686-linux-x86_64.tar.xzأوfilc-0.686-linux-aarch64.tar.xz)، فإن هذا يعد Fil-C للعمل في الدليل الحالي. -
في حالة توزيع /opt/fil القائم على glibc (
optfil-0.686-linux-x86_64.tar.xz)، فإن هذا يعد Fil-C في/opt/fil.
إذا قمت بتنزيل مصدر Fil-C، فشغّل:
./build_all_fast.sh
بعد ذلك ستتمكن من استخدام Fil-C من داخل هذا الدليل.
يأتي توزيع Fil-C الثنائي مع musl كـ libc. استخدام
./build_all_fast.sh في توزيع المصدر يبني أيضًا Fil-C باستخدام musl.
إذا كنت تستخدم المصدر، فيمكنك أيضًا:
-
./build_all_fast_glibc.sh- يبني إعدادًا مشابهًا ولكن مع glibc 2.40 كـ libc. -
./build_all.sh- بناء كامل قائم على musl (يبني أيضًا الكثير من البرامج التي تم نقلها إلى Fil-C). -
./build_all_glibc.sh- بناء كامل قائم على glibc (يبني المزيد من البرامج التي تم نقلها إلى Fil-C). -
cd pizlix && sudo ./build.sh- يبني توزيعة Pizlix Linux. -
cd optfil && sudo ./build.sh- يبني توزيعة/opt/fil.
الأشياء التي تعمل
تعمل الكثير من حزم البرامج في Fil-C دون أي تغييرات أو بأقل تغييرات، بما في ذلك الحزم الكبيرة مثل openssl و CPython و SQLite و العديد من الأخرى. Fil-C قوي بما يكفي لدعم بيئة Linux آمنة للذاكرة بالكامل.
لدى Fil-C دعم كامل لـ C و C++ بالإضافة إلى جميع امتدادات clang 20 تقريبًا. لدى Fil-C دعم ممتاز للعمليات الذرية و SIMD intrinsics، على سبيل المثال.
يلتقط Fil-C كل الأشياء التي تجعل أمان الذاكرة في C صعبًا، مثل:
-
تجاوز الحدود على الكومة أو المكدس.
-
الاستخدام بعد التحرير (أيضًا على الكومة أو المكدس).
-
الخلط بين أنواع المؤشرات وغير المؤشرات.
-
أخطاء الأنواع الناشئة عن الربط.
-
أخطاء الأنواع الناشئة عن سوء استخدام va_lists.
-
تسابقات المؤشرات.
-
استدعاءات النظام. يتم التحقق من جميع المخازن المؤقتة التي تمرر إلى استدعاءات النظام من حيث الحدود والنوع.
-
الكثير من الأشياء الأخرى.
يأتي Fil-C مع libc POSIX كاملة إلى حد معقول، ويدعم حتى الميزات الصعبة مثل الخيوط، ومعالجة الإشارات، و mmap/munmap، و longjmp/setjmp، واستثناءات C++.
معرفة المزيد
يمكنك معرفة المزيد عن Fil-C من خلال زيارة الموقع.
يمكنك أيضًا مراسلتي عبر البريد الإلكتروني: [email protected]
تابعني على Twitter.
أبلغ عن المشكلات على GH.