
कवरेज-निर्देशित फ़ज़र UEFI NVRAM वेरिएबल्स के लिए Qiling एमुलेशन और AFL++ का उपयोग करके स्वचालित इनपुट म्यूटेशन और क्रैश डिटेक्शन के माध्यम से फर्मवेयर कमजोरियों का पता लगाता है।
UEFI NVRAM चरों के लिए एक सरल, कवरेज-निर्देशित फ़ज़र।
Qiling और AFL++ पर आधारित।
Itai Liba (@liba2k) और Assaf Carlsbad (@assaf_carlsbad) द्वारा लिखित।
इमेज बनाएं:
docker build -t efi_fuzz .
वातावरण का परीक्षण करें:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd efi_fuzz/tests/ && pytest -s -v -W ignore::DeprecationWarning"
वातावरण का उपयोग करें:
docker run -v $PWD:/efi_fuzz -it efi_fuzz sh -c "cd /efi_fuzz ; bash"
अनुकरणित NVRAM वातावरण तैयार करें (आपको ROM इमेज प्रदान करनी होगी):
python3 scripts/prepare_nvram.py rom.bin nvram.pickle
NVRAM चरों के लिए प्रारंभिक कॉर्पस तैयार करें:
python3 scripts/prepare_afl_corpus.py rom.bin afl_inputs
फ़ज़र का ड्राई रन करें:
python3 efi_fuzz.py <target> <nvram> <varname> <seed>
सफल होने पर, पूर्ण फ़ज़िंग की ओर बढ़ें:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python3 efi_fuzz.py <target> <nvram> <varname> @@
यदि Windows पर चल रहे हैं, तो WSL स्थापित करें। हम WSL2 की अनुशंसा करते हैं, मूल WSL के विपरीत, जो कभी-कभी धीमा हो जाता है। Windows 10 के लिए पूर्ण स्थापना निर्देश यहाँ पाए जा सकते हैं: https://docs.microsoft.com/en-us/windows/wsl/install-win10
WSL वितरण के अंदर, कुछ आवश्यक पैकेज स्थापित करें जो हमें C स्रोत कोड संकलित करने की अनुमति देंगे:
sudo apt install build-essential automake
Unicorn मोड समर्थन के साथ AFL++ स्थापित करें।
3.1. रिपॉजिटरी क्लोन करें:
git clone https://github.com/AFLplusplus/AFLplusplus
3.2. कोर AFL++ बाइनरी बनाएं:
make
3.3. Unicorn समर्थन सुविधा बनाएं:
cd unicorn_mode
./build_unicorn_support.sh
3.4. सब कुछ स्थापित करें:
make install
वह UEFI फर्मवेयर प्राप्त करें और अनपैक करें जिसे आप फ़ज़ करना चाहते हैं। व्यवहार में यह कैसे किया जाता है, इस पूर्ण तकनीकी विवरण के लिए यहाँ या यहाँ देखें।
फ़ज़र क्लोन करें और आवश्यक निर्भरताएँ स्थापित करें:
git clone https://github.com/Sentinel-One/efi_fuzz
Triton दाग प्रसार (taint propagation) के लिए आवश्यक है।
Triton स्थापित करने के निर्देश यहाँ पाए जा सकते हैं:
https://triton.quarkslab.com/documentation/doxygen/#install_sec
अनुकरणित NVRAM वातावरण तैयार करें:
python scripts/prepare_nvram.py rom.bin nvram.pickle
NVRAM चरों के लिए प्रारंभिक कॉर्पस तैयार करें:
python scripts/prepare_afl_corpus.py rom.bin afl_inputs
फ़ज़र का ड्राई रन करें:
python efi_fuzz.py <target> <nvram> <varname> <seed>
सफल होने पर, पूर्ण फ़ज़िंग की ओर बढ़ें:
afl-fuzz -i afl_inputs/<varname> -o afl_outputs/ -U -- python efi_fuzz.py <target> <nvram> <varname> @@
-e, --end: अनुकरण के लिए एक अंत पता निर्दिष्ट करें।-t, --timeout: अनुकरण के लिए एक नया टाइमआउट मान निर्दिष्ट करें, मिलीसेकंड में।-o, --output: डिबगिंग उद्देश्यों के लिए आउटपुट प्रारूप निर्दिष्ट करें। मान्य मान हैं: trace, disasm, debug और off (डिफ़ॉल्ट off)।-n, --no-sanitize: मेमोरी सैनिटाइज़र को अक्षम करें (डिफ़ॉल्ट False)।-u, --track-uninitialized: Triton और दाग प्रसार के माध्यम से अप्रारंभिक मेमोरी का ट्रैक रखता है (प्रायोगिक!)।-x, --extra-modules: लक्ष्य की निर्भरताओं को संतुष्ट करने के लिए लोड करने के लिए अतिरिक्त मॉड्यूल की सूची।UEFI फर्मवेयर और विशेष रूप से efi_fuzz के बारे में अधिक जानकारी यहाँ पाई जा सकती है:
pip install -r efi_fuzz/requirements.txt