
lava v3.3.0
LAVA: إضافة الثغرات الآلية على نطاق واسع
LAVA: إضافة الثغرات الأمنية الآلية على نطاق واسع
تُعدّ عملية تقييم أدوات اكتشاف الأخطاء وتحسينها صعبة في الوقت الحالي بسبب نقص مجموعات البيانات المرجعية الموثوقة (أي البرمجيات التي تحتوي على أخطاء معروفة مع مدخلات مُطلِقة لها). تحاول LAVA حل هذه المشكلة عبر حقن الأخطاء في البرمجيات تلقائيًا. كل خطأ في LAVA مرفق بمدخل يُطلِقه، في حين أن المدخلات العادية من غير المرجّح للغاية أن تفعل ذلك. هذه الثغرات اصطناعية، لكننا نرى أنها لا تزال واقعية، بمعنى أنها مضمّنة بعمق داخل البرامج ويتم إطلاقها بواسطة مدخلات حقيقية. يشكّل عملنا أساس نهج لتوليد مجموعات كبيرة من الثغرات المرجعية الموثوقة عند الطلب، مما يتيح تقييمًا صارمًا للأدوات ويوفر هدفًا عالي الجودة لمطوري الأدوات.
LAVA هو نتاج تعاون بين مختبر لينكولن التابع لمعهد ماساتشوستس للتكنولوجيا (MIT Lincoln Laboratory)، وجامعة نيويورك (NYU)، وجامعة نورث إيسترن (Northeastern University).
البدء السريع
Docker
يتم بناء أحدث إصدار من فرع master الخاص بـ LAVA تلقائيًا كصورة Docker بناءً على Ubuntu 22.04 ونشره على Docker Hub. سيرغب معظم المستخدمين في استخدام حاوية lava التي تحتوي على PANDA وLAVA مثبّتين مع اعتماديات التشغيل الخاصة بهما، ولكن دون أي مخرجات بناء أو شيفرة مصدرية لتقليل حجم الحاوية.
لاستخدام حاوية lava يمكنك سحبها من Docker Hub:
$ docker pull pandare/lava
أو البناء من هذا المستودع:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
إذا كان Docker Engine يعمل مباشرةً داخل WSL ولا تستطيع خطوات البناء الوصول إلى
الشبكة (على سبيل المثال، تُبلغ APT عن Temporary failure resolving)، فجرّب استخدام
شبكة المضيف الخاصة بـ WSL لعملية البناء:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
ينطبق هذا على خطوات البناء فقط؛ أما الحاويات التي تُشغَّل لاحقًا فتستخدم إعدادات الشبكة الخاصة بها.
مساحة عمل الحاوية
من مساحة عمل تحتوي على target_bins/ وtarget_configs/، استخدم المشغّل لفتح صدفة أو تشغيل أمر. يقوم بتركيب مساحة العمل على المسار المطلق نفسه بحيث تظل المسارات المكتوبة في host.json صالحة بين التشغيلات.
استبدل /path/to/lava بمجلد الاستخراج الذي يحتوي على المشغّل:
/path/to/lava/scripts/docker-shell.sh
/path/to/lava/scripts/docker-shell.sh -- lava-init
/path/to/lava/scripts/docker-shell.sh -- lava --help
يعمل Docker بمعرّف المستخدم/معرّف المجموعة الخاص بك (UID/GID) ويخزّن مجلده الرئيسي القابل للكتابة في
.lava-container-home/ داخل مساحة العمل. إذا كان ~/.panda/ موجودًا على المضيف،
يقوم المشغّل بتركيبه كذاكرة تخزين مؤقت لـ PANDA في الحاوية بحيث تُعاد الاستفادة من ملفات QCOW
وملفات النواة الموجودة. تستمر التنزيلات وتغييرات ذاكرة التخزين المؤقت في ذلك المجلد على المضيف. استخدم --panda-cache /path/to/cache لاختيار ذاكرة تخزين مؤقت أخرى موجودة.
بدون ذاكرة تخزين مؤقت على المضيف، يخزّن PANDA التنزيلات في .lava-container-home/.panda/.
يستخدم المشغّل
pandare/lava:latest افتراضيًا؛ استخدم --image pandare/lava:v3.3.4 لاختيار
إصدار، أو --image pandare/lava:local للبناء المحلي أعلاه.
يجب أن يكون PostgreSQL قيد التشغيل بالفعل. صدّر POSTGRES_USER و
POSTGRES_PASSWORD، إلى نقطة نهاية قاعدة البيانات التي يمكن الوصول إليها من داخل الحاوية. بالنسبة لقاعدة بيانات على شبكة Docker، مرّر --network NETWORK واستخدم اسم حاويتها كـ host.
يشير localhost داخل Docker إلى حاوية LAVA نفسها. بعد التهيئة:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k يحذف بيانات المشروع الموجودة دون تأكيد. يستبدل المشغّل
الواجهة القديمة التي تبدأ باسم المشروع؛ تتبع الأوامر الآن --.
الحوسبة عالية الأداء مع Apptainer / Singularity
على عقدة حوسبة مخصصة، استخدم بيئة التشغيل التي توفرها العنقود. اسحب صورة ذات إصدار محدد مرة واحدة إلى وحدة تخزين دائمة، ثم أعد استخدامها للمهام:
apptainer pull /path/to/scratch/lava-v3.3.4.sif docker://pandare/lava:v3.3.4
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava-init
/path/to/lava/scripts/docker-shell.sh --runtime apptainer \
--image /path/to/scratch/lava-v3.3.4.sif -- lava -tc toy
استخدم --runtime singularity إذا كان هذا هو الأمر المثبَّت. تستخدم بيئات التشغيل هذه هوية المستخدم المضيف وشبكته؛ قم بتهيئة host.json لخدمة PostgreSQL يمكن الوصول إليها، وصدِّر نفس بيانات الاعتماد. لا يقوم المُشغِّل ببدء قاعدة البيانات ولا بطلب تخصيص من المجدول. شغِّله داخل التخصيص التفاعلي لعنقودك أو داخل سكربت الدفعات. هذا لا يُثبت أن صورة إصدار تدعم خط الأنابيب الكامل؛ تحقَّق من تثبيت الصورة وشغِّل مشروعًا تجريبيًا قبل إرسال مهمة تعدين كبيرة.
Ubuntu وDebian
التثبيت المحلي
على نظام يعمل بنظام Ubuntu 22.04، يجب أن تكون قادرًا على تشغيل bash install.sh مباشرةً.
لاحظ أن سكربت التثبيت هذا سيثبِّت حزمًا ويُجري تغييرات على نظامك.
يمكنك إزالة الملفات التنفيذية باستخدام sudo apt-get remove lava.
بمجرد الانتهاء من تثبيت الملف التنفيذي، يمكنك التثبيت محليًا بتشغيل pip install ..
ملاحظة أن حزمة Python تتطلب ملف SQL مُولَّدًا من تجميع الملفات التنفيذية موضوعًا في python/src/pyroclastic/data/lava.sql.
بدون هذا الملف، لن تعمل حزمة Python بشكل صحيح.
التثبيت العادي
بدلاً من ذلك، يمكنك تثبيت تبعيات LAVA يدويًا ثم البناء من المصدر.
نزِّل حزم Debian الموجودة في الإصدارات. ثم ثبِّت حزمة Python عبر pip install pyroclastic.
الخطوات النهائية
استخدام host.json
بعد ذلك، شغِّل init-host لإنشاء ملف host.json في دليل العمل الحالي.
يستخدم LAVA هذا الملف لتخزين الإعدادات الخاصة
بجهازك. يمكنك تعديل هذه الإعدادات حسب الحاجة، لكن القيم الافتراضية
يجب أن تعمل، انظر vars.py.
فيما يلي بعض القيم التي يجب أخذها في الاعتبار:
- host هو اسم قاعدة بيانات Postgres SQL التي تحتوي على جميع أخطاء LAVA. حاليًا، القيمة الافتراضية هي
database، ومع ذلك إذا ثبَّت LAVA محليًا، فمن المحتمل أن تحتاج إلى تغييرها إلىlocalhost
ملاحظة: تحتاج أيضًا إلى متغيرَي بيئة لقاعدة بيانات Postgres SQL:
POSTGRES_PASSهذه هي كلمة مرور مستخدم Postgres SQLPOSTGRES_USERهذا هو اسم المضيف لقاعدة بيانات Postgres SQL
إعدادات المشروع
توجد إعدادات المشروع في دليل target_configs، حيث
يقع كل إعداد في target_configs/projectname/projectname.json.
المسارات المحددة داخل ملفات الإعداد هذه نسبية إلى القيم المعيَّنة
في ملف host.json الخاص بك.
إعداد قاعدة بيانات postgres SQL
كما أُشير سابقًا، يجب عليك إنشاء مستخدم Postgres SQL. يمكنك استخدام سكربت باستخدام متغيرات البيئة للقيام بما يلي:
- إنشاء المستخدم باسم المستخدم وكلمة المرور المقدَّمَين من متغيرات البيئة.
- تحديث قاعدة بيانات Postgres SQL على المضيف لقبول حركة المرور من المصادر الخارجية (مثل حاوية LAVA Docker)
الاستخدام
أخيرًا، يمكنك تشغيل lava لحقن الأخطاء فعليًا في برنامج.
ما عليك سوى تقديم اسم مشروع موجود في دليل target_configs، على سبيل المثال:
lava -ak toy
يجب أن تكون الآن لديك نسخة تحتوي على أخطاء من toy!
إذا كنت ترغب في حقن أخطاء في هدف جديد، فمن المحتمل أن تحتاج إلى إجراء بعض التعديلات. راجع How-to-Lava للحصول على الإرشادات.
التوثيق
راجع مجلد docs للبدء.
المؤلفون
LAVA هو نتيجة سنوات عديدة من التطوير من قبل العديد من الأشخاص؛ فيما يلي قائمة جزئية (أبجدية) بالمساهمين:
- Andy Davis
- Brendan Dolan-Gavitt
- Andrew Fasano
- Zhenghao Hu
- Patrick Hulin
- Amy Jiang
- Engin Kirda
- Tim Leek
- Andrea Mambretti
- Andrew Quijano
- Wil Robertson
- Aaron Sedlacek
- Rahul Sridhar
- Frederick Ulrich
- Ryan Whelan