दस्तावेज़ीकरण
/
रेसिपीज़
/

VM रक्षा उपायों की टेलीमेट्री और प्रतिक्रियाएँ

VM रक्षा उपायों की टेलीमेट्री और प्रतिक्रियाएँ

Pro
v7.4.0+

vmDefenseHook के साथ VM रक्षा उपायों के डिटेक्शन को अपने बैकएंड पर रिपोर्ट करें, और vmDefenseReaction से यह तय करें कि प्रत्येक डिटेक्शन श्रेणी कैसे प्रतिक्रिया करे - पूरी तरह से बिना कुछ तोड़े, केवल-टेलीमेट्री वाले बिल्ड से लेकर ऐसे बिल्ड तक जो चोरी हुए बंडल पर तुरंत ब्रेक करता है।

देखें

Obfuscator.io Defense Reactions: Break, Decoy, and the VM Defense Hook

YouTube पर देखें

समस्या

VM रक्षा उपाय - vmSelfDefending, vmDebugProtection और vmDomainLock - स्थानीय रूप से काम करते हैं: जब कोई डिबगर, ऑटोमेशन टूल, छेड़छाड़ किया गया वातावरण, या अनधिकृत डोमेन पहचाना जाता है, तो सुरक्षित कोड टूट जाता है या चुपचाप अपने ही परिणामों को दूषित कर देता है। यह हमलावर को रोक देता है, लेकिन डिफ़ॉल्ट रूप से आपको इसकी कभी खबर नहीं होती। आप यह नहीं बता सकते कि आपके बंडल को कितनी बार जाँचा जा रहा है, कौन सा डिटेक्टर चला, या कोई रक्षा उपाय किसी वैध उपयोगकर्ता को तो नहीं तोड़ रहा।

दो विकल्प इस कमी को दूर करते हैं। इनमें से कोई भी किसी रक्षा उपाय को सक्षम नहीं करता - ये केवल उन रक्षा उपायों को देखते और नियंत्रित करते हैं जिन्हें आप पहले ही चालू कर चुके हैं:

  • vmDefenseHook - एक ग्लोबल कॉलबैक जो हर बार किसी रक्षा उपाय द्वारा कुछ पहचानने पर एक सिग्नल ऑब्जेक्ट प्राप्त करता है। इसका उपयोग अपने बैकएंड पर टेलीमेट्री भेजने के लिए करें।
  • vmDefenseReaction - एक प्रति-श्रेणी मैप जो यह चुनता है कि कोई सक्षम रक्षा उपाय कैसे प्रतिक्रिया करे: break, decoy, या स्थानीय रूप से कुछ भी न करे।

दोनों विकल्प v7.1.0 में जोड़े गए थे, लेकिन यहाँ हर उदाहरण ऑब्जेक्ट रूप vmDefenseHook: { name } का उपयोग करता है, जिसके लिए v7.4.0 ज़रूरी है। पुराने संस्करण एक साधारण स्ट्रिंग (vmDefenseHook: '__vmDetection') लेते थे; v8.0.0 से वह रूप अस्वीकार कर दिया जाता है, इसलिए हर जगह ऑब्जेक्ट रूप का उपयोग करें।

रेसिपी 1 - डिटेक्शन को अपने बैकएंड पर रिपोर्ट करें

चरण 1 - ऑब्फ़स्केटेड बंडल लोड होने से पहले एक ग्लोबल हुक फ़ंक्शन रजिस्टर करें

VM रनटाइम और उसके रक्षा उपाय आपके सुरक्षित प्रोग्राम से पहले चलते हैं, इसलिए कई डिटेक्शन स्टार्टअप के दौरान होते हैं। हुक को होस्ट पेज में एक सामान्य ग्लोबल के रूप में, ऑब्फ़स्केटेड script टैग से पहले परिभाषित करें:

HTML

चरण 2 - vmDefenseHook को इसकी ओर इंगित करें

यह विकल्प एक ऑब्जेक्ट है जिसका name वह ग्लोबल फ़ंक्शन है जिसे कॉल करना है (aliases वैकल्पिक है - नीचे देखें):

JavaScript

डैशबोर्ड में, VM Defense Hook फ़ील्ड उन्नत सुरक्षा सेक्शन में तब दिखाई देती है जब कम से कम एक रक्षा उपाय (vmSelfDefending, vmDebugProtection, या vmDomainLock) सक्षम हो।

चरण 3 - अपने बैकएंड पर सिग्नल प्राप्त करें

हर डिटेक्शन हुक को एकल signal ऑब्जेक्ट के साथ कॉल करता है:

  • source - विशिष्ट डिटेक्टर: headless, node, agent, agentBrowser, domain, debugger, sandbox, nativeHook, timing, या integrity। v7.4.0 के बाद से पूर्व के env और inspector डिटेक्टर source: 'debugger' के अंतर्गत रिपोर्ट करते हैं। agentBrowser category: 'automation' के अंतर्गत रिपोर्ट करता है और vmDebugProtection वाले ब्राउज़र टारगेट पर चलता है (v7.9.0+)।
  • category - automation, debugger, sandbox, domain, tamper, या integrity। node सोर्स category: 'debugger' के अंतर्गत रिपोर्ट करता है (v7.4.0+)।
  • score, threshold - डिटेक्शन स्कोर और वह थ्रेशोल्ड जिसे इसने पार किया

एक न्यूनतम प्राप्तकर्ता एंडपॉइंट (Express दिखाया गया है; कोई भी बैकएंड जो POST स्वीकार करता है, काम करेगा)। यह बॉडी को एक ऐरे में सामान्यीकृत करता है ताकि यह नीचे दिए गए बफ़र पैटर्न द्वारा पोस्ट किए गए बैच्ड रूप को भी संभाल सके:

JavaScript

हुक केवल रिपोर्टिंग के लिए है - इसका रिटर्न मान अनदेखा किया जाता है, और अनुपस्थित या एरर फेंकने वाला हुक चुपचाप कुछ नहीं करता। यह किसी रक्षा उपाय को कभी अक्षम नहीं कर सकता, इसलिए आपके हुक को हटाने या तोड़ने वाले हमलावर को कुछ हासिल नहीं होता। किसी रक्षा उपाय के व्यवहार को बदलने के लिए, vmDefenseReaction का उपयोग करें (रेसिपी 2)।

हुक को होस्ट पेज में परिभाषित करें, ऑब्फ़स्केटेड सोर्स के अंदर नहीं

टेलीमेट्री के लिए आप हर डिटेक्शन को पकड़ना चाहते हैं, और कई स्टार्टअप पर होते हैं - ऑब्फ़स्केटेड बंडल के अंदर परिभाषित हुक उन्हें पकड़ने के लिए बहुत देर से रजिस्टर होता है, और यदि वह VM-कंपाइल हो जाता है तो आपके प्रोग्राम के चलने तक वह पहुँच योग्य नहीं होता। यह किसी भी तरह सुरक्षित रहता है (अनुपस्थित हुक कुछ नहीं करता, और जो हुक स्वयं कोई डिटेक्शन ट्रिगर करता है उसे दोबारा रिकर्सिव रूप से कॉल नहीं किया जाता), लेकिन पूर्ण कवरेज के लिए इसे होस्ट पेज में पहले से रजिस्टर करें।

एकमात्र अपवाद ऐसा हुक है जो केवल किसी रनटाइम डिटेक्शन पर प्रतिक्रिया करता है - जैसे उपयोग के दौरान डिबगर खुलने पर सफाई। वह हुक ऑब्फ़स्केटेड बंडल के अंदर रह सकता है; रेसिपी 3 देखें।

अपने रिपोर्टिंग लॉजिक की रक्षा फिर भी करने के लिए, रजिस्टर किए गए हुक को एक-लाइन बफ़र रखें और उसे अपने ऑब्फ़स्केटेड कोड से निकालें:

JavaScript

JavaScript

सिग्नल फ़ील्ड्स का नाम बदलना (aliases)

डिफ़ॉल्ट source / category मान वर्णनात्मक नाम हैं, इसलिए कॉलबैक को इंस्ट्रुमेंट करने वाला (या आउटपुट पढ़ने वाला) कोई भी व्यक्ति सुरक्षा को और यह पहचान सकता है कि कौन सा डिटेक्टर चला। aliases सिग्नल फ़ील्ड्स को आपकी पसंद के अपारदर्शी टोकन में बदल देता है, जो VM के अंदर सिग्नल उत्सर्जित होने से पहले लागू होते हैं, ताकि वे नाम आउटपुट में कभी दिखाई न दें या कॉलबैक तक न पहुँचें। आपका ऐप अपनी मैपिंग जानता है और टोकन को आपके बैकएंड पर आगे भेजता है।

उपनाम प्रति फ़ील्ड होते हैं: प्रत्येक एक key लेता है (वह प्रॉपर्टी नाम जो कॉलबैक प्राप्त करता है); स्ट्रिंग नाम-फ़ील्ड्स source और category एक values मैप भी लेते हैं, जबकि score / threshold संख्याएँ हैं और केवल एक key लेते हैं। अनसेट प्रविष्टियाँ अपने डिफ़ॉल्ट नाम बनाए रखती हैं।

JavaScript

डैशबोर्ड में, सिग्नल उपनाम सेक्शन VM Defense Hook फ़ील्ड के नीचे स्थित होता है।

यह फ़िंगरप्रिंट से बचाव है, गोपनीयता नहीं - मैपिंग का अनुमान बार-बार परीक्षण करके अब भी लगाया जा सकता है, इसलिए इसका एकमात्र लाभ स्थिर, स्वतः-स्पष्ट नामों को उजागर न करना है।

रेसिपी 2 - डिफ़ॉल्ट प्रतिक्रियाओं को समायोजित करें

vmDefenseReaction यह कॉन्फ़िगर करता है कि प्रत्येक डिटेक्शन श्रेणी कैसे प्रतिक्रिया करे। यह कुछ भी सक्षम नहीं करता - रक्षा उपाय स्वयं vmSelfDefending, vmDebugProtection, और vmDomainLock द्वारा चालू होते हैं; यह विकल्प केवल यह चुनता है कि कोई सक्षम रक्षा उपाय कैसे प्रतिक्रिया करे। श्रेणी नियंत्रण की इकाई है: किसी श्रेणी का प्रत्येक डिटेक्टर उस श्रेणी की प्रतिक्रिया लागू करता है, और किसी ऐसी श्रेणी के लिए सेट की गई प्रतिक्रिया जिसका विकल्प बंद है, बस कोई प्रभाव नहीं डालती।

श्रेणीद्वारा सक्षमकब प्रतिक्रिया करती है
automationvmSelfDefending या vmDebugProtectionकोड को किसी व्यक्ति के बजाय सॉफ़्टवेयर द्वारा चलाया जा रहा है: एक हेडलेस या स्वचालित ब्राउज़र, एक स्क्रैपिंग / टेस्टिंग फ़्रेमवर्क, या एक AI कोडिंग-एजेंट जो पेज को स्टेप कर रहा है।
debuggervmDebugProtection या vmSelfDefendingकिसी ने डिबगर या ब्राउज़र का डेवलपर-टूल्स इंस्पेक्टर खोल रखा है और चल रहे कोड को समझने के लिए उसमें स्टेप कर रहा है।
sandboxvmDebugProtectionकोड किसी वास्तविक ब्राउज़र में चल ही नहीं रहा - इसे ऑफ़लाइन निष्पादित और अध्ययन करने के लिए किसी एमुलेटेड या स्क्रिप्टेड JavaScript वातावरण में उठा लिया गया है।
domainvmDomainLockकोड किसी ऐसी साइट पर चल रहा है जिसे आपने अधिकृत नहीं किया: एक ऐसा होस्ट जो आपकी vmDomainLock अनुमति-सूची में नहीं है (उदाहरण के लिए, आपका बंडल किसी और के डोमेन पर कॉपी कर दिया गया)।
tampervmSelfDefendingVM के आसपास के JavaScript वातावरण को उस पर नज़र रखने या उसे हाइजैक करने के लिए संशोधित किया गया है, जैसे नेटिव ब्राउज़र बिल्ट-इन्स को इंस्ट्रुमेंटेड संस्करणों से बदल देना।
integrityvmSelfDefendingआपके द्वारा उत्पन्न करने के बाद से सुरक्षित बंडल के अपने कोड को संपादित या पैच किया गया है।

कुंजियाँ ये छह श्रेणी नाम हैं, या default (अनिर्दिष्ट श्रेणियों के लिए एक फ़ॉलबैक)। मान हैं:

  • break - तुरंत ब्रेक करें
  • decoy - दूषित स्थिति पर चलते रहें, चुपचाप गलत परिणाम उत्पन्न करते हुए। decoy के लिए ब्राउज़र टारगेट पर vmDebugProtection या vmDomainLock ज़रूरी है; अन्यथा यह break की तरह काम करता है।
  • none - स्थानीय रूप से कुछ न करें (केवल टेलीमेट्री)

जिस श्रेणी को आप सेट नहीं करते वह अंतर्निहित डिफ़ॉल्ट्स पर वापस चली जाती है:

JavaScript

default हर श्रेणी तक पहुँचता है, जिनमें integrity और tamper भी शामिल हैं, इसलिए { default: 'none' } वास्तव में बिना कुछ तोड़े, केवल-टेलीमेट्री वाला बिल्ड है:

JavaScript

JavaScript

डैशबोर्ड में, VM Defense Reactions सिलेक्ट मेनू उन्नत सुरक्षा सेक्शन में तब दिखाई देते हैं जब कोई रक्षा उपाय सक्षम हो; प्रत्येक श्रेणी केवल तभी संपादन योग्य होती है जब उसके डिटेक्टर उत्सर्जित करने वाला कोई रक्षा उपाय चालू हो।

रेसिपी 3 - किसी रक्षा उपाय के ब्रेक करने से पहले अपना स्वयं का लॉजिक चलाएँ

हुक केवल रिपोर्टिंग के लिए नहीं है - यह किसी रक्षा उपाय की प्रतिक्रिया से पहले अपनी स्वयं की प्रतिक्रिया चलाने का एकमात्र विश्वसनीय स्थान भी है। जब किसी चल रहे पेज पर डिबगर खुलता है, तो हो सकता है आप स्क्रीन पर जो है उसे साफ़ करना चाहें, या दृश्य को 404 पेज से बदलना चाहें, कोड के टूटने से पहले।

हुक ही क्यों, न कि आपके ऐप में कहीं और का कोड: break सभी बाद के बाइटकोड को रोक देता है, इसलिए एक टियरडाउन जो किसी रक्षा उपाय के चलने के बाद चलता है - विशेष रूप से जब वह स्वयं VM-ऑब्फ़स्केटेड हो - ठीक वही है जिसे ब्रेक निष्पादित होने से रोकता है। हुक डिटेक्शन स्थल पर प्रतिक्रिया लागू होने से पहले, सिंक्रोनस रूप से चलता है - इसलिए जो सिंक्रोनस फ़ंक्शन यह कॉल करता है वह पहले पूरा होता है, फिर break VM को रोकता है।

प्रतिक्रिया को अपने vmDefenseHook के रूप में परिभाषित करें। चूँकि debugger डिटेक्शन रनटाइम पर होता है - आपके प्रोग्राम के लोड होने और हुक को परिभाषित करने के बाद - इसलिए हुक आपके ऑब्फ़स्केटेड सोर्स का हिस्सा हो सकता है और बाकी बंडल के साथ बाइटकोड किया जाता है। signal.category पर ब्रांच करें ताकि प्रत्येक स्थिति को सही प्रतिक्रिया मिले, काम को सिंक्रोनस रखें, फिर प्रतिक्रिया को चलने दें:

JavaScript

JavaScript

यह उन डिटेक्शन पर लागू होता है जो आपके ऐप के चलने के दौरान होते हैं - नीचे हुक को बाइटकोड करना कब काम करता है देखें।

इन बिंदुओं को ध्यान में रखें:

  • केवल सिंक्रोनस काम के पहले पूरा होने की गारंटी है। प्रतिक्रिया हुक के लौटने के ठीक बाद वाले स्टेटमेंट पर चलती है। ऐसे फ़ायर-एंड-फ़ॉरगेट कॉल जो तुरंत हैंड-ऑफ़ कर देते हैं, ठीक हैं (navigator.sendBeacon, सिंक्रोनस DOM और canvas संपादन); जो काम आप बाद के लिए शेड्यूल करते हैं - एक setTimeout, एक प्रॉमिस कंटीन्यूएशन, एक await - वह नहीं, और कोई भी चीज़ जिसे अधिक VM बाइटकोड की आवश्यकता हो वह नहीं चलेगी, क्योंकि यही वह है जिसे break रोकता है।
  • हुक प्रतिक्रिया से पहले चलता है; यह उसका स्थान नहीं लेता। इसका रिटर्न मान अनदेखा किया जाता है, और यह प्रतिक्रिया जो करती है उसे रद्द, विलंबित, या बदल नहीं सकता। इसका उपयोग ब्रेक से पहले कार्य करने के लिए करें, उसे वीटो करने के लिए नहीं - प्रतिक्रिया को स्वयं बदलने के लिए, vmDefenseReaction का उपयोग करें (रेसिपी 2)।

हुक को बाइटकोड करना कब काम करता है

इस तरह हुक को ऑब्फ़स्केटेड बंडल के अंदर रखना केवल इसलिए काम करता है क्योंकि debugger डिटेक्शन रनटाइम पर होता है। VM vmDefenseHook को तब चलाता है जब वह अभी भी जीवित है, आपके प्रोग्राम के लोड होने और हुक को परिभाषित करने के बाद, इसलिए बाइटकोडेड हुक पहले डिकोड और चलाया जाता है, फिर break। यही वह है जो हुक के अपने सोर्स की रक्षा करता है।

यह उन डिटेक्शन के लिए नहीं चलता जो स्टार्टअप पर होते हैं - automation, sandbox, domain, या एक डिबगर जो पेज लोड होते समय पहले से खुला हो - क्योंकि उस समय बाइटकोडेड हुक अभी परिभाषित नहीं होता, इसलिए रक्षा उपाय को कॉल करने के लिए कोई फ़ंक्शन नहीं मिलता। उनके लिए, हुक को इसके बजाय होस्ट पेज में एक सामान्य ग्लोबल के रूप में रजिस्टर करें, जैसा रेसिपी 1 में है। संदेह होने पर, एक सामान्य होस्ट-पेज ग्लोबल हुक तक पहुँचने वाली हर डिटेक्शन को कवर करता है; बाइटकोडिंग केवल हुक के अपने सोर्स के लिए सुरक्षा जोड़ती है, और केवल रनटाइम डिटेक्शन के लिए।

टेलीमेट्री से प्रवर्तन तक

दृश्यता और प्रवर्तन को एक साथ शिप करने की आवश्यकता नहीं है। रक्षा उपायों को दो चरणों में तैनात करें: पहले एक बिल्ड जो केवल रिपोर्ट करता है, फिर - जब टेलीमेट्री साफ़ दिखे - एक जो प्रतिक्रिया करता है।

चरण 1 - एक केवल-निरीक्षण वाला बिल्ड शिप करें

हर उस रक्षा उपाय को सक्षम करें जिसका आप उपयोग करने की योजना बना रहे हैं, vmDefenseHook को अपने एंडपॉइंट की ओर इंगित करें, और सभी प्रतिक्रियाएँ बंद कर दें। हर डिटेक्टर फिर भी चलता है और हर हिट को आपके बैकएंड पर रिपोर्ट करता है, लेकिन कुछ भी नहीं टूटता:

JavaScript

चरण 2 - एकत्र किए गए सिग्नलों की समीक्षा करें

बिल्ड द्वारा वास्तविक ट्रैफ़िक देखने के बाद, ऐसे डिटेक्शन खोजें जिन्हें वैध उपयोग ने ट्रिगर किया। दो सबसे सामान्य:

  • आपके अपने एंड-टू-एंड टेस्ट या अपटाइम मॉनिटरिंग से automation हिट्स - उस श्रेणी को प्रोडक्शन में सहन करने के बजाय उन आर्टिफ़ैक्ट्स को रक्षा उपायों के बिना बनाएँ।
  • किसी स्टेजिंग या प्रीव्यू होस्ट से domain हिट्स जिसे आप vmDomainLock अनुमति-सूची में शामिल करना भूल गए - होस्ट जोड़ें।

किसी प्रतिक्रिया को नरम करने के बजाय कारण को ठीक करना पसंद करें: none पर छोड़ी गई हर श्रेणी एक ऐसा डिटेक्टर है जिसे कोई हमलावर सुरक्षित रूप से अनदेखा कर सकता है।

चरण 3 - प्रतिक्रियाओं को चालू करें

default: 'none' ओवरराइड हटा दें ताकि अंतर्निहित प्रति-श्रेणी प्रतिक्रियाएँ लागू हों; वही एक लाइन पूरा बदलाव है। यदि कोई श्रेणी ऐसे फ़ॉल्स पॉज़िटिव उत्पन्न करती रहे जिन्हें आप समाप्त नहीं कर सकते, तो उस एक श्रेणी को none पर रहने दें (उदा. vmDefenseReaction: { automation: 'none' }) और बाकी को लागू करें।

प्रवर्तन चालू होने के बाद भी vmDefenseHook सेट रखें - हुक प्रतिक्रिया की परवाह किए बिना चलता है, इसलिए जब रक्षा उपाय कार्य करते हैं तब भी आप इस दृश्यता को बनाए रखते हैं कि आपके बंडल की जाँच कौन कर रहा है।