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

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

आम तौर पर, आपके प्रोसेसर पर कई मिलियन अप्रलेखित निर्देश पाए जाएँगे, लेकिन ये आम तौर पर कुछ ही अलग-अलग समूहों में आते हैं। विसंगतियों को वर्गीकृत करने के बाद, सारांश उपकरण प्रत्येक निर्देश को एक समस्या श्रेणी में निर्दिष्ट करने का प्रयास करता है:
बाहर निकलने और सिस्टम स्कैन का टेक्स्ट-आधारित सारांश प्राप्त करने के लिए 'Q' दबाएँ:
स्कैन के परिणामों को कभी-कभी उपकरणों के लिए स्वचालित रूप से वर्गीकृत करना मुश्किल हो सकता है, और मैन्युअल विश्लेषण की आवश्यकता हो सकती है। अपने परिणामों का विश्लेषण करने में सहायता के लिए, बेझिझक ./data/log फ़ाइल को [email protected] पर भेजें। प्रोसेसर के निर्माता, मॉडल और संशोधन (/proc/cpuinfo से) के अलावा कोई व्यक्तिगत जानकारी इस लॉग में शामिल नहीं है।
sandsifter के साथ स्कैन करने से दर्जनों ऑपकोड श्रेणियों में अप्रलेखित प्रोसेसर सुविधाएँ, एंटरप्राइज़ हाइपरवाइज़र की कमज़ोरियाँ, लगभग हर प्रमुख डिसअसेंबली और इम्यूलेशन उपकरण में बग, और प्रोसेसर में ही सुरक्षा कमज़ोरियाँ खोलने वाले गंभीर हार्डवेयर बग उजागर हुए हैं।
परिणामों का विवरण प्रोजेक्ट whitepaper में पाया जा सकता है।
(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
फ़्लैग sifter को --flag के साथ, और injector को -- -f के साथ पास किए जाते हैं।
उदाहरण:
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
null dereference की अनुमति दें (sudo आवश्यक है)
-D
डुप्लिकेट उपसर्गों की अनुमति दें
-N
कोई nx bit समर्थन नहीं
-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 पर एक पृष्ठ को मेमोरी में मैप कर सके, जिसके लिए रूट अनुमतियों की आवश्यकता होती है। यह पृष्ठ कई निर्देशों को मेमोरी एक्सेस पर seg-fault होने से रोकता है, जिससे अधिक सटीक फॉल्ट विश्लेषण संभव होता है।
उपसर्ग
निर्देश खोज की गहराई के लिए प्राथमिक सीमा खोजे जाने वाले उपसर्ग बाइट्स की संख्या है, प्रत्येक अतिरिक्त उपसर्ग बाइट के साथ खोज स्थान लगभग 10 के कारक से बढ़ जाता है। -P फ़्लैग के साथ उपसर्ग बाइट्स सीमित करें।
रंग
सिफ्टर का इंटरफ़ेस 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 फ़्लैग दें:
sandsifter Christopher Domas (@xoreaxeaxeax) का एक शोध प्रयास है।
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 बिट निर्देश स्थान की खोज की जा सकती है।