Dokümantasyon
/
Tarifler
/

VM Savunma Telemetrisi ve Tepkileri

VM Defense Telemetry & Reactions

Pro
v7.1.0+

VM savunma algılamalarını vmDefenseHook ile backend'inize raporlayın ve her algılama kategorisinin nasıl tepki verdiğini vmDefenseReaction ile ayarlayın - tümüyle bozmayan, yalnızca telemetri amaçlı bir derlemeden, çalınmış bir pakette sert biçimde kırılmaya kadar.

Sorun

VM savunmaları - vmSelfDefending, vmDebugProtection ve vmDomainLock - yerel olarak hareket eder: bir hata ayıklayıcı, otomasyon aracı, kurcalanmış bir ortam veya yetkisiz bir alan algılandığında, korunan kod kırılır veya kendi sonuçlarını sessizce zehirler. Bu, saldırganı durdurur ancak varsayılan olarak bundan hiç haberiniz olmaz. Paketinizin ne sıklıkla yoklandığını, hangi algılayıcının tetiklendiğini veya bir savunmanın meşru bir kullanıcıyı kırıp kırmadığını bilemezsiniz.

v7.1.0'dan bu yana iki seçenek bu boşluğu kapatır. Hiçbiri herhangi bir savunmayı etkinleştirmez - yalnızca zaten açtığınız savunmaları gözlemler ve yönlendirir:

  • vmDefenseHook - bir savunma her bir şey algıladığında bir sinyal nesnesi alan global bir geri çağırma. Backend'inize telemetri göndermek için kullanın.
  • vmDefenseReaction - etkin bir savunmanın nasıl tepki verdiğini seçen kategori bazlı bir eşleme: kır, zehirle veya yerel olarak hiçbir şey yapma.

Tarif 1 - algılamaları backend'inize raporlayın

Adım 1 - obfuscate edilmiş paket yüklenmeden önce global bir hook fonksiyonu kaydedin

VM çalışma zamanı ve savunmaları, korunan programınızdan önce çalışır, bu nedenle birçok algılama başlatma sırasında tetiklenir. Hook'u, ana sayfada obfuscate edilmiş script etiketinden önce düz bir global olarak tanımlayın:

<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>

Adım 2 - vmDefenseHook'u ona yönlendirin

Seçenek, name'i çağrılacak global fonksiyon olan bir nesnedir (aliases isteğe bağlıdır - aşağıya bakın):

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' }
});

Yalın-dize biçimi (vmDefenseHook: '__vmDetection'), { name: '__vmDetection' } için kısaltma olarak hâlâ kabul edilir ancak kullanımdan kaldırılmıştır - nesne biçimini tercih edin.

Kontrol panelinde, VM Defense Hook alanı, en az bir savunma (vmSelfDefending, vmDebugProtection veya vmDomainLock) etkinleştirildikten sonra VM seçenekleri panelinde görünür.

Adım 3 - sinyali backend'inizde alın

Her algılama, hook'u tek bir signal nesnesiyle çağırır:

  • source - belirli algılayıcı: headless, node, agent, domain, debugger, sandbox, nativeHook, timing veya integrity. v7.4.0 itibarıyla, eski env ve inspector algılayıcıları source: 'debugger' altında raporlanır.
  • category - automation, debugger, sandbox, domain, tamper veya integrity. node kaynağı category: 'debugger' altında raporlanır (v7.4.0+).
  • score, threshold - algılama puanı ve aştığı eşik

Minimal bir alıcı uç nokta (Express gösteriliyor; POST kabul eden herhangi bir backend çalışır). Gövdeyi bir diziye normalleştirir, böylece aşağıdaki tampon kalıbı tarafından gönderilen toplu biçimi de işler:

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);
});

Sinyal alanlarını yeniden adlandırma (aliases) v7.4.0+

Varsayılan source / category değerleri açıklayıcı adlardır, bu nedenle geri çağırmayı enstrümante eden (veya çıktıyı okuyan) herkes korumayı ve hangi algılayıcının tetiklendiğini tanıyabilir. aliases, sinyal alanlarını seçtiğiniz opak belirteçlere yeniden adlandırır; bu, sinyal yayılmadan önce VM içinde uygulanır, böylece bu adlar çıktıda asla görünmez veya geri çağırmaya ulaşmaz. Uygulamanız kendi eşlemesini bilir ve belirteçleri backend'inize iletir.

Aliaslar alan bazlıdır: her biri bir key alır (geri çağırmanın aldığı özellik adı); dize ad-alanları source ve category ayrıca bir values eşlemesi alır; score / threshold ise sayıdır ve yalnızca bir key alır. Ayarlanmamış girişler varsayılan adlarını korur.

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> }
}

Kontrol panelinde, Signal aliases bölümü VM Defense Hook alanının altında yer alır.

Tarif 2 - varsayılan tepkileri ayarlayın

vmDefenseReaction, her algılama kategorisinin nasıl tepki verdiğini yapılandırır. Hiçbir şeyi etkinleştirmez - savunmaların kendisi vmSelfDefending, vmDebugProtection ve vmDomainLock tarafından açılır; bu seçenek yalnızca etkin bir savunmanın nasıl tepki verdiğini seçer. Kategori, kontrol birimidir: bir kategorideki her algılayıcı, o kategorinin tepkisini uygular ve seçeneği kapalı olan bir kategori için ayarlanan bir tepkinin hiçbir etkisi olmaz.

KategoriEtkinleştirenNe zaman tepki verir
automationvmSelfDefending veya vmDebugProtectionKod, bir kişi yerine yazılım tarafından yönlendiriliyor: headless veya otomatik bir tarayıcı, bir kazıma / test çerçevesi ya da sayfayı adımlayan bir yapay zekâ kodlama ajanı.
debuggervmDebugProtection veya vmSelfDefendingBirisi bir hata ayıklayıcıyı veya tarayıcının geliştirici araçları denetçisini açmış ve çalışan kodu anlamak için adım adım ilerliyor.
sandboxvmDebugProtectionKod, gerçek bir tarayıcıda hiç çalışmıyor - çevrimdışı olarak yürütülüp incelenmek üzere öykünülmüş veya betikle çalıştırılan bir JavaScript ortamına taşınmış.
domainvmDomainLockKod, yetkilendirmediğiniz bir sitede çalışıyor: vmDomainLock izin listenizde olmayan bir ana bilgisayar (örneğin, paketiniz başka birinin alanına kopyalanmış).
tampervmSelfDefendingVM çevresindeki JavaScript ortamı, onu izlemek veya ele geçirmek için değiştirilmiş; örneğin yerel tarayıcı yerleşikleri enstrümante edilmiş sürümlerle değiştirilmiş.
integrityvmSelfDefendingKorunan paketin kendi kodu, siz onu oluşturduktan sonra düzenlenmiş veya yamalanmış.

Anahtarlar, bu altı kategori adıdır veya default (belirtilmemiş kategoriler için bir yedek). Değerler:

  • break - hemen kır
  • decoy - zehirlenmiş durumda çalışmaya devam et, sessizce yanlış sonuçlar üret
  • none - yerel olarak hiçbir şey yapma (yalnızca telemetri)

Ayarlamadığınız bir kategori, yerleşik varsayılanlara geri döner:

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

default, yapıları gereği doğru olanlar (integrity, tamper) dahil her kategoriye ulaşır, bu nedenle { default: 'none' } gerçekten bozmayan, yalnızca telemetri amaçlı bir derlemedir:

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

Kontrol panelinde, VM Defense Reactions seçiciler, bir savunma etkinleştirildikten sonra VM seçenekleri panelinde görünür; her kategori yalnızca algılayıcılarını yayan bir savunma açıkken düzenlenebilir.

Telemetriden zorlamaya

İlk günden itibaren görünürlük ile zorlama arasında seçim yapmak zorunda değilsiniz. Savunmaları iki derlemede yayına alın: yalnızca raporlayan biri, ardından - telemetri temiz göründüğünde - tepki veren biri.

Adım 1 - yalnızca gözlemleyen bir derleme yayınlayın

Kullanmayı planladığınız her savunmayı etkinleştirin, vmDefenseHook'u uç noktanıza yönlendirin ve tüm tepkileri kapatın. Her algılayıcı yine de çalışır ve her isabeti backend'inize raporlar - yalnızca hiçbir şeyi asla kırmaz:

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

Adım 2 - toplanan sinyalleri inceleyin

Derleme gerçek trafiği gördükten sonra, meşru kullanımın tetiklediği algılamaları arayın. En yaygın ikisi:

  • Kendi uçtan uca testlerinizden veya çalışma süresi izlemenizden gelen automation isabetleri - kategoriyi üretimde tolere etmek yerine bu yapıları savunmalar olmadan derleyin.
  • vmDomainLock izin listesine eklemeyi unuttuğunuz bir hazırlık (staging) veya önizleme ana bilgisayarından gelen domain isabetleri - ana bilgisayarı ekleyin.

Bir tepkiyi yumuşatmak yerine nedeni düzeltmeyi tercih edin: none olarak bırakılan her kategori, bir saldırganın artık endişelenmesine gerek olmayan bir algılayıcıdır.

Adım 3 - tepkileri açın

default: 'none' geçersiz kılmasını kaldırın, böylece yerleşik kategori bazlı tepkiler uygulanır - tüm geçiş o tek satırdır. Bir kategori ortadan kaldıramadığınız yanlış pozitifler üretmeye devam ediyorsa, yalnızca o kategoriyi none olarak tutun (örneğin vmDefenseReaction: { automation: 'none' }) ve geri kalanını zorlayın.