
x86 प्रोसेसर फ़ज़र
: x86 प्रोसेसर फज़र
sandsifter x86 प्रोसेसरों में छिपे हुए निर्देशों और हार्डवेयर बगों का ऑडिट करता है, व्यवस्थित रूप से मशीन कोड उत्पन्न करके प्रोसेसर के निर्देश सेट में खोज करता है, और निष्पादन में विसंगतियों की निगरानी करता है। Sandsifter ने हर प्रमुख विक्रेता से गुप्त प्रोसेसर निर्देशों का पता लगाया है; डिसअसेंबलरों, असेंबलरों और एमुलेटरों में व्यापक सॉफ्टवेयर बग; एंटरप्राइज़ हाइपरवाइज़रों में दोष; और x86 चिप्स में सौम्य और सुरक्षा-महत्वपूर्ण दोनों तरह के हार्डवेयर बग।
मौजूद x86 प्रोसेसरों की भीड़ को देखते हुए, इस उपकरण का उद्देश्य उपयोगकर्ताओं को अपने स्वयं के सिस्टम में छिपे निर्देशों और बगों की जाँच करने में सक्षम बनाना है।
अपने प्रोसेसर पर एक बुनियादी ऑडिट चलाने के लिए:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t

कंप्यूटर को व्यवस्थित रूप से विसंगतिपूर्ण निर्देशों के लिए स्कैन किया जाता है। ऊपरी आधे भाग में, आप उन निर्देशों को देख सकते हैं जिनका sandsifter वर्तमान में प्रोसेसर पर परीक्षण कर रहा है। निचले आधे भाग में, sandsifter उन विसंगतियों की रिपोर्ट करता है जो वह पाता है।
खोज में कुछ घंटों से लेकर कुछ दिनों तक का समय लग सकता है, जो आपके प्रोसेसर की गति और जटिलता पर निर्भर करता है। जब यह पूर्ण हो जाए, तो परिणामों का सारांश बनाएं:
./summarize.py data/log

आमतौर पर, आपके प्रोसेसर पर कई लाख अनिर्दिष्ट निर्देश पाए जाएंगे, लेकिन ये आम तौर पर कुछ अलग-अलग समूहों में आते हैं। विसंगतियों को वर्गीकृत करने के बाद, summarize उपकरण प्रत्येक निर्देश को एक समस्या श्रेणी में निर्दिष्ट करने का प्रयास करता है:
सिस्टम स्कैन का एक टेक्स्ट-आधारित सारांश प्राप्त करने के लिए 'Q' दबाएं:
स्कैन के परिणामों को कभी-कभी उपकरणों द्वारा स्वचालित रूप से वर्गीकृत करना कठिन हो सकता है, और मैन्युअल विश्लेषण की आवश्यकता हो सकती है। अपने परिणामों का विश्लेषण करने में सहायता के लिए, बेझिझक ./data/log फ़ाइल को [email protected] पर भेजें। इस लॉग में प्रोसेसर के निर्माता, मॉडल और रेविज़न (/proc/cpuinfo से) के अलावा कोई व्यक्तिगत जानकारी शामिल नहीं है।
sandsifter से स्कैन करने से दर्जनों ओपकोड श्रेणियों में अनिर्दिष्ट प्रोसेसर सुविधाओं, एंटरप्राइज़ हाइपरवाइज़रों में दोष, लगभग हर प्रमुख डिसअसेंबली और एमुलेशन टूल में बग, और प्रोसेसर में ही सुरक्षा कमजोरियाँ खोलने वाले महत्वपूर्ण हार्डवेयर बग का पता चला है।
परिणामों के विवरण परियोजना श्वेतपत्र में पाए जा सकते हैं।
(TODO: यहाँ विस्तृत परिणामों की गणना)
Sandsifter के लिए पहले Capstone डिसअसेंबलर को स्थापित करना आवश्यक है: http://www.capstone-engine.org/। Capstone को आमतौर पर इस प्रकार स्थापित किया जा सकता है:
sudo apt-get install libcapstone3 libcapstone-dev
sudo pip install capstone
Sandsifter को इस प्रकार बनाया जा सकता है:
make
और फिर इसे इस प्रकार चलाया जाता है:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
फ़्लैग्स को --flag के साथ sifter को, और -- -f के साथ injector को पास किया जाता है।
उदाहरण:
sudo ./sifter.py --unk --dis --len --sync --tick -- -P1 -t
Sifter फ़्लैग्स:
--len
सभी निर्देशों में लंबाई के अंतर खोजें (वे निर्देश जो डिसअसेंबलर की अपेक्षा से
भिन्न निष्पादित हुए, या वे जो डिसअसेंबलर की अपेक्षा होने पर मौजूद नहीं थे)
--dis
मान्य निर्देशों में लंबाई के अंतर खोजें (वे निर्देश जो डिसअसेंबलर की अपेक्षा से
भिन्न निष्पादित हुए)
--unk
अज्ञात निर्देश खोजें (वे निर्देश जिनके बारे में डिसअसेंबलर नहीं जानता
लेकिन सफलतापूर्वक निष्पादित होते हैं)
--ill
--unk का उलटा, अमान्य डिसअसेंबली खोजें (वे निर्देश जो सफलतापूर्वक
निष्पादित नहीं होते लेकिन डिसअसेंबलर उन्हें स्वीकार करता है)
--tick
समय-समय पर वर्तमान निर्देश को डिस्क पर लिखें
--save
बाहर निकलने पर खोज प्रगति सहेजें
--resume
अंतिम सहेजी गई स्थिति से खोज फिर से शुरू करें
--sync
खोज परिणामों को ढूंढते ही डिस्क पर लिखें
--low-mem
परिणामों को मेमोरी में संग्रहीत न करें
Injector फ़्लैग्स:
-b
मोड: ब्रूट फोर्स
-r
मोड: रैंडमाइज़्ड फ़ज़िंग
-t
मोड: टनल्ड फ़ज़िंग
-d
मोड: बाह्य निर्देशित फ़ज़िंग
-R
रॉ आउटपुट मोड
-T
टेक्स्ट आउटपुट मोड
-x
समय-समय पर प्रगति को stderr पर लिखें
-0
नल डीरेफरेंस की अनुमति दें (sudo आवश्यक)
-D
डुप्लिकेट प्रीफ़िक्स की अनुमति दें
-N
कोई NX बिट समर्थन नहीं
-s seed
रैंडम खोज में, बीज मान
-B brute_depth
ब्रूट खोज में, अधिकतम खोज गहराई
-P max_prefix
खोज करने के लिए प्रीफ़िक्स की अधिकतम संख्या
-i instruction
वह निर्देश जिससे खोज शुरू करनी है (सम्मिलित)
-e instruction
वह निर्देश जिस पर खोज समाप्त करनी है (अनन्य)
-c core
वह कोर जिस पर खोज करनी है
-X blacklist
निर्दिष्ट निर्देश को ब्लैकलिस्ट करें
-j jobs
एक साथ चलने वाले कार्यों की संख्या
-l range_bytes
प्रत्येक उपश्रेणी में बेस निर्देश बाइट्स की संख्या
m: मोड - sifter के लिए खोज मोड बदलें (ब्रूट फोर्स, रैंडम, या टनल)
q: छोड़ें - sifter से बाहर निकलें
p: रोकें - खोज को रोकें या फिर से शुरू करें
स्कैनिंग चार अलग-अलग खोज एल्गोरिदम का समर्थन करती है, जिन्हें कमांड लाइन पर सेट किया जा सकता है, या हॉटकी के माध्यम से चक्रित किया जा सकता है।
sudo
सर्वोत्तम परिणामों के लिए, उपकरण को रूट उपयोगकर्ता के रूप में चलाया जाना चाहिए। यह आवश्यक है ताकि प्रक्रिया पते 0 पर एक पेज को मेमोरी में मैप कर सके, जिसके लिए रूट अनुमतियों की आवश्यकता होती है। यह पेज कई निर्देशों को मेमोरी एक्सेस पर सेग-फॉल्ट होने से रोकता है, जो अधिक सटीक फॉल्ट विश्लेषण की अनुमति देता है।
प्रीफ़िक्स (Prefixes)
निर्देश खोज की गहराई के लिए प्राथमिक सीमा प्रीफ़िक्स बाइट्स की संख्या है जिसे खोजा जाना है, प्रत्येक अतिरिक्त प्रीफ़िक्स बाइट खोज स्थान को लगभग 10 के कारक से बढ़ाता है। प्रीफ़िक्स बाइट्स को -P फ़्लैग से सीमित करें।
रंग
sifter का इंटरफ़ेस 256 रंग के टर्मिनल के लिए डिज़ाइन किया गया है। जबकि विवरण आपके टर्मिनल के आधार पर बहुत भिन्न होते हैं, इसे मोटे तौर पर इस प्रकार प्राप्त किया जा सकता है:
export TERM='xterm-256color'
GUI
इंटरफ़ेस मान लेता है कि टर्मिनल कम से कम एक निश्चित आकार का है; यदि इंटरफ़ेस ठीक से प्रस्तुत नहीं हो रहा है, तो टर्मिनल का आकार बढ़ाने का प्रयास करें; यह अक्सर टर्मिनल फ़ॉन्ट आकार को कम करके किया जा सकता है।
कुछ मामलों में, ग्राफ़िकल फ्रंट एंड के बिना उपकरण चलाना वांछनीय या आवश्यक हो सकता है। यह injector को सीधे चलाकर किया जा सकता है:
sudo ./injector -P1 -t -0
प्रत्यक्ष injector आह्वान के परिणामों को फ़िल्टर करने के लिए, grep का उपयोग किया जा सकता है। उदाहरण के लिए,
sudo ./injector -P1 -r -0 | grep '\.r' | grep -v sigill
उन निर्देशों की खोज करता है जिनके लिए प्रोसेसर और डिसअसेंबलर निर्देश लंबाई पर असहमत थे (grep '.r'), लेकिन निर्देश सफलतापूर्वक निष्पादित हुआ (grep -v sigill)।
लक्षित फ़ज़िंग
कई मामलों में, फ़ज़र को किसी विशिष्ट लक्ष्य पर निर्देशित करना मूल्यवान होता है। उदाहरण के लिए, यदि आपको संदेह है कि किसी एमुलेटर में दोहराए गए 'lock' प्रीफ़िक्स (0xf0) के आसपास खामियाँ हैं, तो आप -i और -e फ़्लैग्स के साथ फ़ज़र को निर्देश स्थान के इस क्षेत्र की खोज करने का निर्देश दे सकते हैं:
sudo ./sifter.py --unk --dis --len --sync --tick -- -t -i f0f0 -e f0f1 -D -P15
लीगेसी सिस्टम
बहुत पुराने सिस्टम (i586 वर्ग के प्रोसेसर, कम मेमोरी वाले सिस्टम) को स्कैन करने के लिए, sifter को --low-mem फ़्लैग और injector को -N फ़्लैग पास करें:
sudo ./sifter.py --unk --dis --len --sync --tick --low-mem -- -P1 -t -N
यदि आप देखते हैं कि आपके स्कैन बहुत जल्दी पूरे हो रहे हैं (उदाहरण के लिए, एक स्कैन सेकंड में पूरा होता है), तो यह आमतौर पर इसलिए है क्योंकि आपके द्वारा स्कैन किए जा रहे प्रोसेसर के लिए ये फ़्लैग्स आवश्यक हैं।
32 बनाम 64 बिट
डिफ़ॉल्ट रूप से, sandsifter होस्ट ऑपरेटिंग सिस्टम की बिटनेस को लक्षित करने के लिए बनाया गया है। हालांकि, कुछ निर्देशों का व्यवहार 32 बिट प्रक्रिया में चलाए जाने पर 64 बिट प्रक्रिया में चलाए जाने से भिन्न होता है। इन परिदृश्यों का पता लगाने के लिए, कभी-कभी 64 बिट सिस्टम पर 32 बिट sandsifter चलाना मूल्यवान होता है।
64 बिट सिस्टम पर 32 बिट sandsifter बनाने के लिए, Capstone को 32 बिट के रूप में स्थापित किया जाना चाहिए; इसके निर्देश http://www.capstone-engine.org/ पर पाए जा सकते हैं।
फिर sandsifter को 32 बिट आर्किटेक्चर के लिए बनाया जाना चाहिए:
make CFLAGS=-m32
इसके साथ, 64 बिट सिस्टम पर 32 बिट निर्देश स्थान का पता लगाया जा सकता है।
sandsifter Christopher Domas (@xoreaxeaxeax) का एक शोध प्रयास है।