
lava v3.3.0
LAVA: बड़े पैमाने पर स्वचालित भेद्यता जोड़ना
LAVA: बड़े पैमाने पर स्वचालित भेद्यता जोड़ना
बग-खोज उपकरणों का मूल्यांकन और सुधार वर्तमान में ग्राउंड ट्रुथ कॉर्पोरा (अर्थात, ऐसा सॉफ़्टवेयर जिसमें ट्रिगर करने वाले इनपुट के साथ ज्ञात बग हों) की कमी के कारण कठिन है। LAVA सॉफ़्टवेयर में स्वचालित रूप से बग इंजेक्ट करके इस समस्या को हल करने का प्रयास करता है। प्रत्येक LAVA बग के साथ एक इनपुट होता है जो उसे ट्रिगर करता है, जबकि सामान्य इनपुट के ऐसा करने की संभावना अत्यंत कम होती है। ये भेद्यताएँ कृत्रिम हैं, लेकिन हमारा तर्क है कि फिर भी ये यथार्थवादी हैं, इस अर्थ में कि ये प्रोग्रामों के भीतर गहराई तक अंतर्निहित हैं और वास्तविक इनपुट द्वारा ट्रिगर होती हैं। हमारा कार्य माँग पर बड़े ग्राउंड-ट्रुथ भेद्यता कॉर्पोरा उत्पन्न करने के दृष्टिकोण का आधार बनता है, जिससे कठोर उपकरण मूल्यांकन संभव होता है और उपकरण डेवलपर्स के लिए एक उच्च-गुणवत्ता वाला लक्ष्य प्रदान होता है।
LAVA, MIT Lincoln Laboratory, NYU और Northeastern University के बीच सहयोग का परिणाम है।
त्वरित शुरुआत
Docker
LAVA की master शाखा का नवीनतम संस्करण स्वचालित रूप से Ubuntu 22.04 पर आधारित docker इमेज के रूप में बनाया जाता है और Docker Hub पर प्रकाशित किया जाता है। अधिकांश उपयोगकर्ता lava कंटेनर का उपयोग करना चाहेंगे, जिसमें PANDA और LAVA उनकी रनटाइम निर्भरताओं के साथ स्थापित हैं, लेकिन कंटेनर का आकार कम करने के लिए कोई बिल्ड आर्टिफ़ैक्ट या स्रोत कोड नहीं है।
lava कंटेनर का उपयोग करने के लिए आप इसे Docker Hub से खींच सकते हैं:
$ docker pull pandare/lava
इस रिपॉज़िटरी से बनाएँ:
$ DOCKER_BUILDKIT=1 docker build -t pandare/lava:local .
यदि Docker Engine सीधे WSL के अंदर चलता है और build चरण नेटवर्क तक नहीं पहुँच पाते (उदाहरण के लिए, APT Temporary failure resolving रिपोर्ट करता है), तो build के लिए WSL का host नेटवर्क उपयोग करने का प्रयास करें:
DOCKER_BUILDKIT=1 docker build --network=host -t pandare/lava:local .
यह केवल build चरणों पर लागू होता है; बाद में लॉन्च किए गए कंटेनर अपनी स्वयं की नेटवर्क सेटिंग्स का उपयोग करते हैं।
कंटेनर वर्कस्पेस
target_bins/ और target_configs/ वाले वर्कस्पेस से, शेल खोलने या कमांड चलाने के लिए
launcher का उपयोग करें। यह वर्कस्पेस को उसी निरपेक्ष पथ पर माउंट करता है ताकि host.json में लिखे गए पथ
रन के बीच वैध रहें।
/path/to/lava को उस checkout से बदलें जिसमें launcher है:
/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 के रूप में चलता है और अपना लिखने योग्य home वर्कस्पेस के भीतर
.lava-container-home/ में संग्रहीत करता है। यदि आपका होस्ट ~/.panda/ मौजूद है,
तो launcher इसे कंटेनर के PANDA cache के रूप में माउंट करता है ताकि मौजूदा QCOW और
kernel फ़ाइलें पुनः उपयोग की जा सकें। डाउनलोड और cache परिवर्तन उस होस्ट
निर्देशिका में बने रहते हैं। किसी अन्य मौजूदा cache का चयन करने के लिए --panda-cache /path/to/cache का उपयोग करें।
होस्ट cache के बिना, PANDA डाउनलोड को .lava-container-home/.panda/ में संग्रहीत करता है।
launcher डिफ़ॉल्ट रूप से
pandare/lava:latest का उपयोग करता है; किसी रिलीज़ का चयन करने के लिए --image pandare/lava:v3.3.4 का उपयोग करें, या ऊपर दिए गए स्थानीय build के लिए --image pandare/lava:local का उपयोग करें।
PostgreSQL पहले से चल रहा होना चाहिए। POSTGRES_USER और
POSTGRES_PASSWORD को कंटेनर के अंदर से पहुँचने योग्य डेटाबेस endpoint पर export करें। Docker नेटवर्क पर स्थित डेटाबेस के लिए, --network NETWORK पास करें और host के रूप में उसका कंटेनर नाम उपयोग करें।
Docker के अंदर localhost स्वयं LAVA कंटेनर को संदर्भित करता है। कॉन्फ़िगर होने के बाद:
/path/to/lava/scripts/docker-shell.sh --network NETWORK -- lava -ak toy
-k पुष्टि के बिना मौजूदा प्रोजेक्ट डेटा को हटा देता है। लॉन्चर पुराने
प्रोजेक्ट-नाम-पहले इंटरफ़ेस को प्रतिस्थापित करता है; अब कमांड -- का पालन करते हैं।
Apptainer / Singularity के साथ HPC
आवंटित कंप्यूट नोड पर, क्लस्टर द्वारा प्रदान किए गए रनटाइम का उपयोग करें। एक संस्करणित इमेज को एक बार स्थायी स्टोरेज में खींचें, फिर जॉब्स के लिए इसका पुनः उपयोग करें:
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 का उपयोग करें। ये रनटाइम होस्ट उपयोगकर्ता की पहचान और नेटवर्क का उपयोग करते हैं; पहुँच योग्य PostgreSQL सेवा के लिए host.json कॉन्फ़िगर करें और वही क्रेडेंशियल्स एक्सपोर्ट करें। लॉन्चर न तो डेटाबेस शुरू करता है और न ही शेड्यूलर आवंटन का अनुरोध करता है। इसे अपने क्लस्टर के इंटरैक्टिव आवंटन या बैच स्क्रिप्ट के अंदर चलाएँ। यह सिद्ध नहीं करता कि कोई रिलीज़ इमेज पूरी पाइपलाइन का समर्थन करती है; बड़ा माइनिंग जॉब सबमिट करने से पहले इमेज इंस्टॉलेशन सत्यापित करें और एक टॉय प्रोजेक्ट चलाएँ।
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 की निर्भरताओं को मैन्युअल रूप से इंस्टॉल कर सकते हैं और फिर सोर्स से बिल्ड कर सकते हैं।
releases में स्थित Debian पैकेज डाउनलोड करें। फिर Python पैकेज pip install pyroclastic इंस्टॉल करें।
अंतिम चरण
host.json का उपयोग करना
इसके बाद, अपनी वर्तमान कार्यशील निर्देशिका में host.json उत्पन्न करने के लिए init-host चलाएँ।
यह फ़ाइल LAVA द्वारा आपकी मशीन के विशिष्ट सेटिंग्स संग्रहीत करने के लिए उपयोग की जाती है। आप आवश्यकतानुसार इन सेटिंग्स को संपादित कर सकते हैं, लेकिन डिफ़ॉल्ट मान काम करने चाहिए, देखें vars.py।
ध्यान में रखने योग्य कुछ मान निम्नलिखित हैं:
- host उस Postgres SQL डेटाबेस का नाम है जिसमें सभी LAVA बग हैं। वर्तमान में, यह डिफ़ॉल्ट रूप से
databaseहै, हालाँकि यदि आपने LAVA को स्थानीय रूप से इंस्टॉल किया है, तो आपको संभवतः इसेlocalhostमें बदलना चाहिए
ध्यान दें: Postgres SQL डेटाबेस के लिए आपको दो एनवायरनमेंट वेरिएबल्स की भी आवश्यकता है:
POSTGRES_PASSयह Postgres SQL उपयोगकर्ता का पासवर्ड हैPOSTGRES_USERयह Postgres SQL डेटाबेस का होस्टनेम है
प्रोजेक्ट कॉन्फ़िगरेशन
प्रोजेक्ट कॉन्फ़िगरेशन target_configs निर्देशिका में स्थित हैं, जहाँ
प्रत्येक कॉन्फ़िगरेशन target_configs/projectname/projectname.json पर स्थित है।
इन कॉन्फ़िगरेशन फ़ाइलों के भीतर निर्दिष्ट पथ आपकी host.json फ़ाइल में सेट किए गए मानों के सापेक्ष हैं।
postgres SQL डेटाबेस सेट करना
जैसा कि संकेत दिया गया था, आपको एक Postgres SQL उपयोगकर्ता बनाना चाहिए। आप निम्नलिखित के लिए एनवायरनमेंट वेरिएबल्स का उपयोग करके एक स्क्रिप्ट का उपयोग कर सकते हैं:
- एनवायरनमेंट वेरिएबल्स से प्रदान किए गए उपयोगकर्ता नाम और पासवर्ड के साथ उपयोगकर्ता बनाएँ।
- बाहरी स्रोतों (जैसे LAVA Docker कंटेनर) से ट्रैफ़िक स्वीकार करने के लिए होस्ट पर Postgres SQL डेटाबेस को अपडेट करें
उपयोग
अंत में, आप किसी प्रोग्राम में वास्तव में बग इंजेक्ट करने के लिए lava चला सकते हैं।
बस target_configs निर्देशिका में मौजूद किसी प्रोजेक्ट का नाम प्रदान करें, उदाहरण के लिए:
lava -ak toy