
डीकंपाइल बाइनरीज़ में कमजोरियों की पहचान करने के लिए BianryNinja प्लगइन, जिसमें प्रोग्रामैटिक स्कैन और LLM सपोर्ट दोनों शामिल हैं।
Binary Ninja के लिए LLM-सहायता प्राप्त भेद्यता अनुसंधान।
VulnFanatic-NG एक साइडबार पैनल जोड़ता है जो वर्तमान बाइनरी को स्कैन करता है और एक LLM — डिफ़ॉल्ट रूप से स्थानीय रूप से होस्ट किया गया OpenAI-संगत मॉडल, या Anthropic Claude, Google Gemini, या Azure OpenAI (देखें LLM बैकएंड) — से पूछता है कि क्या संदिग्ध कोड वास्तव में कमजोर है। यह मुख्य रूप से Binary Ninja के डीकंपाइलर आउटपुट (HLIL) से काम करता है, जब आवश्यक हो तो असेंबली पर वापस आता है, और केवल पुष्टि की गई समस्याओं की रिपोर्ट करता है जिनके कोड पर क्लिक करने योग्य संदर्भ होते हैं।
एक स्कैन अधिकतम तीन चरणों में चलता है (चरण 3 ऑप्ट-इन और केवल ऑनलाइन है):
rules/phase1_rules.json में परिभाषित खतरनाक फ़ंक्शनों के कॉल साइट ढूँढता है — strcpy, memcpy, sprintf/फ़ॉर्मेट स्ट्रिंग, system, alloca, scanf, कमांड/निष्पादन API, कमज़ोर RNG, free/delete परिवार (use-after-free / double-free), निश्चित बफ़र में अविश्वसनीय इनपुट पढ़ना (recv/read/fread/ReadFile), SQL इंजेक्शन (sqlite3_exec/mysql_query/PQexec), अक्षम TLS प्रमाणपत्र सत्यापन (SSL_CTX_set_verify/curl), SSRF, और अनुचित विशेषाधिकार प्रबंधन (setuid/setresgid), memset/bzero परिवार, और हमलावर-नियंत्रित लंबाई के साथ तुलना (memcmp/strncmp → प्रमाणीकरण बाईपास) — C/C++, Win32, और (सर्वोत्तम प्रयास) Rust FFI पर। इसमें मजबूत _chk (FORTIFY) और Annex-K _s वेरिएंट शामिल हैं। सीमित फ़ॉर्मेटेड-आउटपुट फ़ंक्शन (snprintf और वेरिएंट) के अपने डिफ़ॉल्ट-सुरक्षित नियम हैं ताकि सही आकार तर्क को ओवरफ़्लो के रूप में रिपोर्ट न किया जाए। कॉल साइट तीन तरीकों से पाए जाते हैं: नामित प्रतीकों के लिए प्रत्यक्ष कॉल; फ़ॉरवर्डिंग थंक / PLT स्टब के माध्यम से रूट की गई कॉल (वास्तविक कॉलर्स पुनर्प्राप्त किए जाते हैं, इसलिए एक आयात जो केवल स्टब के माध्यम से पहुँचा जाता है वह छूटता नहीं है); और — जब तक vulnfanatic.scanIndirectCalls बंद न हो — फ़ंक्शन पॉइंटर या vtable के माध्यम से भेजी गई अप्रत्यक्ष कॉल जिन्हें Binary Ninja ने खतरनाक फ़ंक्शन में हल किया है। प्रत्येक कॉल साइट के लिए यह एक अंतरप्रक्रियात्मक, डीकंपाइलर-केंद्रित संदर्भ बनाता है, जो एक टोकन सीमा (डिफ़ॉल्ट 100k) पर बजट किया जाता है:
__*_chk और बाउंड-जांचे गए *_s वेरिएंट अतिरिक्त अग्रणी तर्क लेते हैं, जो फ़ॉर्मेट/आकार/गंतव्य स्थिति को स्थानांतरित करते हैं,s->buf s के पॉइंटर आकार के बजाय फ़ील्ड के वास्तविक सरणी आकार में हल हो जाए; प्रकार अनुभाग में स्ट्रक्चर परिभाषाएँ प्रति-फ़ील्ड बाइट आकार भी रखती हैं,0x40 या [0, 0xff] तक सीमित सिद्ध), जिसका उपयोग मॉडल बफ़र क्षमता के विरुद्ध आकार की तुलना करते समय अनुमान लगाने के बजाय जमीनी सत्य के रूप में करता है,vulnfanatic.includeStackLayout),if/लूप/switch स्थितियाँ),MAIN→ABCD→strcpy के लिए, MAIN और ABCD द्वारा कहीं और कॉल किए गए फ़ंक्शन भी), क्योंकि उनमें वे बाउंड/सत्यापन जाँच हो सकती हैं जो खतरनाक मान को गेट करती हैं (vulnfanatic.includeCallPathSiblings, बजट अनुमति देने पर भरी जाती हैं), औरrecv/read/getenv जैसे इनपुट फ़ंक्शन)।वह संदर्भ प्लस एक नियम-विशिष्ट प्रॉम्प्ट मॉडल को भेजा जाता है, जो एक संरचित निर्णय लौटाता है। गैर-समस्याएँ हटा दी जाती हैं। प्रॉम्प्ट एक मजबूत स्थानीय कोड मॉडल (जैसे Qwen2.5-Coder) के लिए तैयार किए गए हैं और इसे पूरे प्रवाह का विश्लेषण करने और केवल JSON आउटपुट करने का निर्देश देते हैं।
मॉडल को रिकॉल पसंद करने का निर्देश दिया गया है — प्रशंसनीय, सुरक्षा-प्रासंगिक समस्याओं की रिपोर्ट करें और अनिश्चितता को आत्मविश्वास के माध्यम से व्यक्त करें न कि किसी ऐसी चीज़ को हटाएँ जिसे वह पूरी तरह से साबित नहीं कर सकता। यह एक स्क्रैचपैड में अपना काम दिखाता है जो उन शाब्दिक कोड स्निपेट को उद्धृत करता है जिन पर यह निर्भर था (इनपुट स्रोत, प्रत्येक गार्ड, आकार/लंबाई, प्रासंगिक प्रकार, और सिंक), जो निष्कर्ष पर संग्रहीत किया जाता है ताकि आप तर्क का ऑडिट कर सकें।
प्रत्येक निष्कर्ष में एक आत्मविश्वास (उच्च/मध्यम/निम्न) होता है: उच्च = पूरी श्रृंखला संदर्भ में दिखाई गई है; मध्यम = संभावित, एक या दो लिंक अनुमानित; निम्न = एक सुराग जो मैन्युअल समीक्षा के योग्य है। यह मुख्य मीट्रिक है (मॉडल का गंभीरता अनुमान एक द्वितीयक क्षेत्र है)। vulnfanatic.minConfidence सेट करें ताकि एक सीमा से नीचे कुछ भी हटा दिया जाए।
डिफ़ॉल्ट रूप से VulnFanatic-NG रिकॉल (वास्तविक समस्याओं को पकड़ना) का पक्ष लेता है। यदि आपको बहुत अधिक झूठी सकारात्मकताएँ मिलती हैं, तो किसी के साथ कसें:
vulnfanatic.validationPass (डिफ़ॉल्ट बंद) — एक दूसरा LLM पास चलाता है जो प्रत्येक चिह्नित समस्या की उसी संदर्भ के विरुद्ध दोबारा जाँच करता है (स्क्रैचपैड स्निपेट को सत्यापित करता है और प्रवाह को फिर से ट्रेस करता है) और निर्णय या आत्मविश्वास को सही कर सकता है। चिह्नित उम्मीदवारों के लिए LLM कॉल दोगुनी करता है।
vulnfanatic.validatorModel (प्लस validatorProvider / validatorBaseUrl / validatorApiKey) सेट करें ताकि दूसरा पास एक भिन्न मॉडल पर चले। एक दूसरी राय एक स्वतंत्र मॉडल से कहीं अधिक उपयोगी होती है — यह कम अंधे धब्बे साझा करता है और पहले निर्णय को रबर-स्टैम्प करने की संभावना बहुत कम होती है (मॉडल अपने स्वयं के उत्तरों को पसंद करते हैं)। एक अच्छा पैटर्न एक कैस्केड है: एक तेज़ मॉडल विश्लेषक के रूप में (व्यापक रिकॉल) और आपका सबसे मजबूत मॉडल वैलिडेटर के रूप में, जो केवल चिह्नित उम्मीदवारों पर चलता है। वैलिडेटर मॉडल को खाली छोड़ें ताकि विश्लेषक मॉडल के साथ सत्यापन हो। वैलिडेटर विश्लेषक से कम से कम उतना ही सक्षम होना चाहिए — एक कमजोर मुख्य रूप से झूठी अस्वीकृतियाँ जोड़ता है। प्रदाता/बेस URL/कुंजी/मॉडल को छोड़कर सब कुछ विश्लेषक कनेक्शन सेटिंग्स से विरासत में मिलता है; एक खाली वैलिडेटर कुंजी विश्लेषक कुंजी का पुन: उपयोग करती है; और यदि वैलिडेटर एंडपॉइंट अप्राप्य है, तो पहला निर्णय रखा जाता है (निष्कर्ष कभी भी वैलिडेटर आउटेज के कारण खोता नहीं है)।vulnfanatic.minConfidence (डिफ़ॉल्ट low) — medium/high तक बढ़ाएँ ताकि केवल मजबूत निष्कर्ष रिपोर्ट हों।vulnfanatic.skipConstantArgCalls (डिफ़ॉल्ट बंद) — ओवरफ़्लो-श्रेणी के कॉल साइट को छोड़ें जिनके तर्क सभी संकलन-समय स्थिरांक हैं।