Dokumentasi
/
Resep
/

Telemetri & Reaksi Pertahanan VM

Telemetri & Reaksi Pertahanan VM

Pro
v7.1.0+

Laporkan deteksi pertahanan VM ke backend Anda dengan vmDefenseHook, dan atur bagaimana setiap kategori deteksi bereaksi menggunakan vmDefenseReaction - mulai dari build hanya-telemetri yang sepenuhnya tidak merusak hingga build yang gagal total pada bundel yang dicuri.

Masalahnya

Pertahanan VM - vmSelfDefending, vmDebugProtection, dan vmDomainLock - bekerja secara lokal: ketika sebuah debugger, alat otomasi, lingkungan yang diutak-atik, atau domain tidak sah terdeteksi, kode yang terlindungi akan rusak atau diam-diam meracuni hasilnya sendiri. Itu menghentikan penyerang, tetapi secara bawaan Anda tidak pernah mendengar kabarnya. Anda tidak dapat mengetahui seberapa sering bundel Anda diselidiki, detektor mana yang terpicu, atau apakah suatu pertahanan justru merusak pengalaman pengguna yang sah.

Sejak v7.1.0, dua opsi menutup celah tersebut. Keduanya tidak mengaktifkan pertahanan apa pun - keduanya hanya mengamati dan mengarahkan pertahanan yang sudah Anda aktifkan:

  • vmDefenseHook - sebuah callback global yang menerima objek sinyal setiap kali suatu pertahanan mendeteksi sesuatu. Gunakan untuk mengirim telemetri ke backend Anda.
  • vmDefenseReaction - sebuah peta per-kategori yang memilih bagaimana pertahanan yang aktif bereaksi: break, poison, atau tidak melakukan apa pun secara lokal.

Resep 1 - laporkan deteksi ke backend Anda

Langkah 1 - daftarkan sebuah fungsi hook global, sebelum bundel hasil obfuskasi dimuat

Runtime VM dan pertahanannya berjalan sebelum program terlindungi Anda, sehingga banyak deteksi terpicu saat startup. Definisikan hook sebagai global biasa di halaman host, sebelum tag skrip hasil obfuskasi:

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

Langkah 2 - arahkan vmDefenseHook ke sana

Opsi ini berupa objek yang name-nya adalah fungsi global yang akan dipanggil (aliases bersifat opsional - lihat di bawah):

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

Bentuk string telanjang (vmDefenseHook: '__vmDetection') masih diterima sebagai singkatan dari { name: '__vmDetection' } tetapi usang - lebih baik gunakan bentuk objek.

Di dasbor, field VM Defense Hook muncul di panel opsi VM setelah setidaknya satu pertahanan (vmSelfDefending, vmDebugProtection, atau vmDomainLock) diaktifkan.

Langkah 3 - terima sinyal di backend Anda

Setiap deteksi memanggil hook dengan satu objek signal:

  • source - detektor spesifiknya: headless, node, agent, domain, debugger, sandbox, nativeHook, timing, atau integrity. Mulai v7.4.0, detektor lama env dan inspector melapor di bawah source: 'debugger'.
  • category - automation, debugger, sandbox, domain, tamper, atau integrity. Source node melapor di bawah category: 'debugger' (v7.4.0+).
  • score, threshold - skor deteksi dan ambang yang dilampauinya

Contoh endpoint penerima minimal (Express ditunjukkan; backend apa pun yang menerima POST bisa digunakan). Endpoint ini menormalkan body menjadi larik sehingga juga menangani bentuk yang dibatch yang dikirim oleh pola buffer di bawah:

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

Mengganti nama field sinyal (aliases) v7.4.0+

Nilai source / category bawaan berupa nama deskriptif, sehingga siapa pun yang meng-instrumentasi callback (atau membaca keluaran) dapat mengenali proteksi tersebut dan detektor mana yang terpicu. aliases mengganti nama field sinyal menjadi token opak pilihan Anda, yang diterapkan di dalam VM sebelum sinyal dikeluarkan, sehingga nama-nama tersebut tidak pernah muncul di keluaran atau sampai ke callback. Aplikasi Anda mengetahui pemetaannya sendiri dan meneruskan token tersebut ke backend Anda.

Alias diterapkan per field: masing-masing menerima sebuah key (nama properti yang diterima callback); field nama berupa string source dan category juga menerima peta values, sedangkan score / threshold berupa angka dan hanya menerima key. Entri yang tidak disetel mempertahankan nama bawaannya.

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

Di dasbor, bagian Signal aliases berada di bawah field VM Defense Hook.

Resep 2 - sesuaikan reaksi bawaan

vmDefenseReaction mengonfigurasi bagaimana setiap kategori deteksi bereaksi. Opsi ini tidak mengaktifkan apa pun - pertahanannya sendiri diaktifkan oleh vmSelfDefending, vmDebugProtection, dan vmDomainLock; opsi ini hanya memilih bagaimana pertahanan yang aktif bereaksi. Kategori adalah unit kendalinya: setiap detektor dalam suatu kategori menjalankan reaksi kategori tersebut, dan reaksi yang disetel untuk kategori yang opsinya nonaktif tidak berpengaruh sama sekali.

KategoriDiaktifkan olehBereaksi ketika
automationvmSelfDefending atau vmDebugProtectionKode dikendalikan oleh perangkat lunak alih-alih manusia: peramban headless atau otomatis, framework scraping / pengujian, atau agen coding AI yang menelusuri halaman langkah demi langkah.
debuggervmDebugProtection atau vmSelfDefendingSeseorang membuka debugger atau inspector developer-tools peramban dan menelusuri kode yang sedang berjalan untuk memahaminya.
sandboxvmDebugProtectionKode sama sekali tidak berjalan di peramban sungguhan - kode telah diangkat ke lingkungan JavaScript yang diemulasikan atau di-script untuk dieksekusi dan dipelajari secara offline.
domainvmDomainLockKode berjalan di situs yang tidak Anda otorisasi: host yang tidak ada dalam allow-list vmDomainLock Anda (misalnya, bundel Anda disalin ke domain milik orang lain).
tampervmSelfDefendingLingkungan JavaScript di sekitar VM telah dimodifikasi untuk mengawasi atau membajaknya, seperti builtin peramban native yang ditukar dengan versi yang di-instrumentasi.
integrityvmSelfDefendingKode bundel terlindungi itu sendiri telah disunting atau ditambal sejak Anda menghasilkannya.

Kuncinya adalah keenam nama kategori tersebut, atau default (fallback untuk kategori yang tidak ditentukan). Nilainya adalah:

  • break - langsung rusak
  • decoy - terus berjalan dengan state yang teracuni, diam-diam menghasilkan hasil yang salah
  • none - tidak melakukan apa pun secara lokal (hanya telemetri)

Kategori yang tidak Anda setel akan kembali ke nilai bawaan bawaan:

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

default menjangkau setiap kategori, termasuk yang benar-secara-konstruksi (integrity, tamper), sehingga { default: 'none' } benar-benar merupakan build yang tidak merusak dan hanya-telemetri:

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

Di dasbor, pemilih VM Defense Reactions muncul di panel opsi VM setelah suatu pertahanan diaktifkan; setiap kategori hanya dapat diedit selama pertahanan yang mengeluarkan detektornya aktif.

Dari telemetri ke penegakan

Anda tidak harus memilih antara visibilitas dan penegakan sejak hari pertama. Luncurkan pertahanan dalam dua build: satu yang hanya melapor, lalu - begitu telemetri terlihat bersih - satu yang bereaksi.

Langkah 1 - kirim build hanya-mengamati

Aktifkan setiap pertahanan yang Anda rencanakan untuk digunakan, arahkan vmDefenseHook ke endpoint Anda, dan matikan semua reaksi. Setiap detektor tetap berjalan dan melaporkan setiap kejadian ke backend Anda - hanya saja tidak pernah merusak apa pun:

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

Langkah 2 - tinjau sinyal yang terkumpul

Setelah build melihat lalu lintas nyata, cari deteksi yang dipicu oleh penggunaan yang sah. Dua yang paling umum:

  • Kejadian automation dari pengujian end-to-end Anda sendiri atau pemantauan uptime - buat artefak tersebut tanpa pertahanan alih-alih menoleransi kategori tersebut di produksi.
  • Kejadian domain dari host staging atau preview yang lupa Anda sertakan ke dalam allow-list vmDomainLock - tambahkan host tersebut.

Lebih baik memperbaiki penyebabnya daripada melunakkan reaksinya: setiap kategori yang dibiarkan pada none adalah detektor yang tidak perlu lagi dikhawatirkan penyerang.

Langkah 3 - aktifkan reaksinya

Hapus penimpaan default: 'none' agar reaksi per-kategori bawaan berlaku - seluruh peralihannya hanya satu baris itu. Jika suatu kategori terus memunculkan positif palsu yang tidak dapat Anda hilangkan, pertahankan hanya kategori tersebut pada none (mis. vmDefenseReaction: { automation: 'none' }) dan tegakkan sisanya.