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

VM डिफेंस टेलीमेट्री और रिएक्शन्स

VM डिफेंस टेलीमेट्री और रिएक्शन्स

Pro
v7.1.0+

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

समस्या

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

v7.1.0 से दो विकल्प इस कमी को पूरा करते हैं। इनमें से कोई भी किसी बचाव को चालू नहीं करता — ये सिर्फ़ उन बचावों को देखते और दिशा देते हैं जिन्हें आप पहले ही चालू कर चुके हैं:

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

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

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

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

<script>
    // In your page, BEFORE the obfuscated script:
    window.__vmDetection = function (signal) {
        navigator.sendBeacon('/api/vm-defense', JSON.stringify(signal));
    };
</script>
<script src="/app.obfuscated.js"></script>

चरण 2 — vmDefenseHook को उस पर लक्षित करें

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

JavaScriptObfuscator.obfuscate(source, {
    vmObfuscation: true,
    // the hook alone enables nothing - a defense must be on for detectors to run:
    vmSelfDefending: true,
    vmDebugProtection: true,
    vmDefenseHook: { name: '__vmDetection' }
});

सादी स्ट्रिंग वाला रूप (vmDefenseHook: '__vmDetection') अब भी { name: '__vmDetection' } के शॉर्टहैंड के रूप में स्वीकार किया जाता है, लेकिन वह अप्रचलित है — ऑब्जेक्ट वाला रूप बेहतर है।

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

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

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

  • source — विशिष्ट डिटेक्टर: headless, node, agent, domain, debugger, sandbox, nativeHook, timing, या integrity। v7.4.0 से पुराने env और inspector डिटेक्टर source: 'debugger' के तहत रिपोर्ट करते हैं।
  • categoryautomation, debugger, sandbox, domain, tamper, या integritynode सोर्स category: 'debugger' के तहत रिपोर्ट करता है (v7.4.0+)।
  • score, threshold — डिटेक्शन स्कोर और वह थ्रेशोल्ड जिसे उसने पार किया

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

app.post('/api/vm-defense', express.text({ type: '*/*' }), (req, res) => {
    // a signal: { source: 'headless', category: 'automation', score: 7, threshold: 4 }
    const signals = [].concat(JSON.parse(req.body));
    for (const signal of signals) {
        console.warn('vm-defense', { ...signal, ip: req.ip, ua: req.get('user-agent') });
    }
    res.sendStatus(204);
});

सिग्नल फ़ील्ड्स के नाम बदलना (aliases) v7.4.0+

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

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

vmDefenseHook: {
    name: '__vmDetection',
    aliases: {
        source:    { key: 'a8Qm', values: { headless: 'xP4m9Q' } },
        category:  { key: 'p3Tx', values: { automation: 'bQ7s1M' } },
        score:     { key: 's1' },
        threshold: { key: 't1' }
    }
    // the callback now receives e.g. { a8Qm: 'xP4m9Q', p3Tx: 'bQ7s1M', s1: <score>, t1: <threshold> }
}

डैशबोर्ड में Signal aliases अनुभाग VM Defense Hook फ़ील्ड के नीचे होता है।

रेसिपी 2 — डिफ़ॉल्ट प्रतिक्रियाएँ बदलें

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

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

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

  • break — तुरंत टूट जाना
  • decoy — ख़राब की गई स्थिति के साथ चलते रहना, चुपचाप ग़लत नतीजे देते हुए
  • none — स्थानीय रूप से कुछ न करना (केवल टेलीमेट्री)

जो कैटेगरी आप सेट नहीं करते, वह अंतर्निहित डिफ़ॉल्ट पर लौट आती है:

// built-in defaults
vmDefenseReaction: {
    automation: 'break',
    debugger: 'decoy',
    sandbox: 'decoy',
    domain: 'break',
    tamper: 'break',
    integrity: 'break'
}

default हर कैटेगरी तक पहुँचता है, उन कैटेगरीज़ तक भी जो रचना से ही सही हैं (integrity, tamper), इसलिए { default: 'none' } वाकई एक न टूटने वाली, सिर्फ़ टेलीमेट्री वाली बिल्ड है:

vmDefenseReaction: { default: 'none' } // never break - pair with vmDefenseHook
vmDefenseReaction: { automation: 'none' } // tolerate automation FPs; the rest keep their defaults (a bad domain still breaks)

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

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

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

चरण 1 — सिर्फ़ निगरानी वाली बिल्ड जारी करें

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

JavaScriptObfuscator.obfuscate(source, {
    vmObfuscation: true,
    vmSelfDefending: true,
    vmDebugProtection: true,
    vmDomainLock: ['example.com'],
    vmDefenseHook: '__vmDetection',
    vmDefenseReaction: { default: 'none' } // observe only
});

चरण 2 — इकट्ठा हुए सिग्नल्स की समीक्षा करें

जब बिल्ड असली ट्रैफ़िक देख ले, तो ऐसे डिटेक्शन ढूँढ़ें जो वैध उपयोग से ट्रिगर हुए हों। दो सबसे आम:

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

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

चरण 3 — प्रतिक्रियाएँ चालू करें

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