Dokumentasi
/
Resep
/

Telemetri & Reaksi Pertahanan VM

Telemetri & Reaksi Pertahanan VM

Pro
v7.4.0+

Laporkan deteksi pertahanan VM ke backend Anda dengan vmDefenseHook, dan atur bagaimana setiap kategori deteksi bereaksi dengan vmDefenseReaction - mulai dari build khusus telemetri yang sepenuhnya tidak merusak apa pun hingga yang langsung merusak pada bundel yang dicuri.

Tonton

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

Tonton di YouTube

Masalahnya

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

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 sebuah pertahanan mendeteksi sesuatu. Gunakan untuk mengirim telemetri ke backend Anda.
  • vmDefenseReaction - sebuah peta per-kategori yang memilih bagaimana sebuah pertahanan yang aktif bereaksi: break, decoy, atau tidak melakukan apa pun secara lokal.

Kedua opsi diperkenalkan pada v7.1.0, tetapi setiap contoh di sini memakai bentuk objek vmDefenseHook: { name }, yang memerlukan v7.4.0. Versi sebelumnya menerima string polos (vmDefenseHook: '__vmDetection'); bentuk tersebut ditolak sejak v8.0.0, jadi gunakan bentuk objek di seluruh bagian.

Resep 1 - laporkan deteksi ke backend Anda

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

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

HTML

Langkah 2 - arahkan vmDefenseHook ke fungsi tersebut

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

JavaScript

Di dasbor, field VM Defense Hook muncul di bagian Proteksi Tingkat Lanjut 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 spesifik: headless, node, agent, agentBrowser, domain, debugger, sandbox, nativeHook, timing, atau integrity. Sejak v7.4.0 detektor env dan inspector yang lama melaporkan di bawah source: 'debugger'. agentBrowser melaporkan di bawah category: 'automation' dan berjalan pada target peramban dengan vmDebugProtection (v7.9.0+).
  • category - automation, debugger, sandbox, domain, tamper, atau integrity. Detektor node melaporkan di bawah category: 'debugger' (v7.4.0+).
  • score, threshold - skor deteksi dan ambang yang dilewatinya

Sebuah endpoint penerima minimal (Express ditampilkan; backend apa pun yang menerima POST akan bekerja). Endpoint ini menormalkan isi permintaan menjadi sebuah array sehingga juga menangani bentuk terkelompok yang dikirim oleh pola buffer di bawah:

JavaScript

Hook ini hanya untuk pelaporan - nilai kembaliannya diabaikan, dan hook yang hilang atau melempar error hanyalah no-op yang senyap. Hook tidak pernah dapat menonaktifkan sebuah pertahanan, jadi penyerang yang menghapus atau merusak hook Anda tidak mendapatkan apa-apa. Untuk mengubah apa yang dilakukan sebuah pertahanan, gunakan vmDefenseReaction (Resep 2).

Definisikan hook di halaman host, bukan di dalam kode sumber hasil obfuskasi

Untuk telemetri Anda ingin menangkap setiap deteksi, dan banyak yang aktif saat startup - sebuah hook yang didefinisikan di dalam bundel hasil obfuskasi didaftarkan terlalu lambat untuk menangkap deteksi tersebut, dan jika hook itu dikompilasi VM maka tidak dapat dijangkau hingga program Anda berjalan. Hook tetap aman dengan cara apa pun (hook yang hilang bersifat no-op, dan hook yang dengan sendirinya memicu deteksi tidak dipanggil lagi secara rekursif), tetapi untuk cakupan penuh daftarkan hook di depan pada halaman host.

Satu-satunya pengecualian adalah hook yang bereaksi hanya terhadap deteksi runtime - seperti pembersihan ketika sebuah debugger terbuka saat penggunaan. Hook semacam itu dapat berada di dalam bundel hasil obfuskasi; lihat Resep 3.

Untuk tetap melindungi logika pelaporan Anda, pertahankan hook terdaftar sebagai buffer satu baris dan kuras buffer tersebut dari kode hasil obfuskasi Anda:

JavaScript

JavaScript

Mengganti nama field sinyal (aliases)

Nilai source / category bawaan adalah nama deskriptif, sehingga siapa pun yang menginstrumentasi callback (atau membaca keluaran) dapat mengenali proteksi tersebut dan detektor mana yang aktif. aliases mengganti nama field sinyal menjadi token buram pilihan Anda, diterapkan di dalam VM sebelum sinyal dipancarkan, sehingga nama-nama tersebut tidak pernah muncul di keluaran atau mencapai callback. Aplikasi Anda mengetahui pemetaannya sendiri dan meneruskan token ke backend Anda.

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

JavaScript

Di dasbor, bagian Alias sinyal berada di bawah field VM Defense Hook.

Ini adalah penghindaran fingerprint, bukan kerahasiaan - pemetaannya masih dapat disimpulkan dengan pengujian berulang, jadi satu-satunya manfaatnya adalah tidak mengekspos nama yang stabil dan menjelaskan dirinya sendiri.

Resep 2 - sesuaikan reaksi bawaan

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

KategoriDiaktifkan olehBereaksi ketika
automationvmSelfDefending atau vmDebugProtectionKode dijalankan oleh perangkat lunak alih-alih oleh manusia: sebuah peramban headless atau terotomasi, sebuah framework scraping / pengujian, atau sebuah AI coding-agent yang menelusuri halaman langkah demi langkah.
debuggervmDebugProtection atau vmSelfDefendingSeseorang membuka debugger atau inspector developer tools peramban dan menelusuri kode yang berjalan langkah demi langkah untuk memahaminya.
sandboxvmDebugProtectionKode sama sekali tidak berjalan di peramban sungguhan - kode telah dipindahkan ke lingkungan JavaScript yang diemulasi atau dikendalikan skrip untuk dijalankan dan dipelajari secara offline.
domainvmDomainLockKode berjalan di situs yang tidak Anda izinkan: sebuah host yang tidak ada dalam daftar izin vmDomainLock Anda (misalnya, bundel Anda disalin ke domain milik orang lain).
tampervmSelfDefendingLingkungan JavaScript di sekitar VM telah dimodifikasi untuk mengawasi atau membajaknya, seperti built-in native peramban yang ditukar dengan versi yang diinstrumentasi.
integrityvmSelfDefendingKode bundel yang dilindungi telah diedit atau ditambal sejak Anda membuatnya.

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

  • break - langsung merusak (break)
  • decoy - tetap berjalan dengan keadaan yang diracuni, secara diam-diam menghasilkan hasil yang salah. decoy memerlukan vmDebugProtection atau vmDomainLock pada target peramban; jika tidak, decoy bertindak sebagai break.
  • none - tidak melakukan apa pun secara lokal (hanya telemetri)

Sebuah kategori yang tidak Anda atur akan kembali ke nilai bawaan:

JavaScript

default menjangkau setiap kategori, termasuk integrity dan tamper, sehingga { default: 'none' } adalah build khusus telemetri yang benar-benar tidak merusak apa pun:

JavaScript

JavaScript

Di dasbor, menu pilihan VM Defense Reactions muncul di bagian Proteksi Tingkat Lanjut setelah sebuah pertahanan diaktifkan; setiap kategori hanya dapat diedit selama sebuah pertahanan yang memancarkan detektornya aktif.

Resep 3 - jalankan logika Anda sendiri sebelum sebuah pertahanan merusak

Hook bukan hanya untuk pelaporan - hook juga merupakan satu-satunya tempat andal untuk menjalankan respons Anda sendiri sebelum sebuah pertahanan bereaksi. Ketika sebuah debugger terbuka pada halaman yang sedang berjalan, Anda mungkin ingin membersihkan apa yang ada di layar, atau mengganti tampilan dengan halaman 404, sebelum kode rusak.

Mengapa hook alih-alih kode di tempat lain dalam aplikasi Anda: break menghentikan semua bytecode berikutnya, sehingga sebuah teardown yang berjalan setelah sebuah pertahanan aktif - terutama ketika teardown itu sendiri diobfuskasi VM - persis itulah yang dicegah oleh break untuk dieksekusi. Hook aktif di lokasi deteksi sebelum reaksi dijalankan, secara sinkron - sehingga sebuah fungsi sinkron yang dipanggilnya selesai lebih dulu, lalu break menghentikan VM.

Definisikan respons sebagai vmDefenseHook Anda. Karena deteksi debugger aktif saat runtime - setelah program Anda dimuat dan mendefinisikan hook - hook tersebut dapat menjadi bagian dari kode sumber hasil obfuskasi Anda dan dikompilasi menjadi bytecode bersama sisa bundel. Cabangkan berdasarkan signal.category sehingga setiap kondisi mendapatkan respons yang tepat, jaga agar pekerjaannya sinkron, lalu biarkan reaksi berjalan:

JavaScript

JavaScript

Ini berlaku untuk deteksi yang aktif saat aplikasi Anda sedang berjalan - lihat Kapan kompilasi hook ke bytecode berfungsi di bawah.

Ingatlah poin-poin ini:

  • Hanya pekerjaan sinkron yang dijamin selesai lebih dulu. Reaksi berjalan pada pernyataan tepat setelah hook kembali. Panggilan fire-and-forget yang langsung menyerahkan tugas tidak masalah (navigator.sendBeacon, penyuntingan DOM dan canvas sinkron); pekerjaan yang Anda jadwalkan untuk nanti - sebuah setTimeout, sebuah kelanjutan promise, sebuah await - tidak dijamin, dan apa pun yang membutuhkan lebih banyak bytecode VM tidak akan berjalan, karena itulah yang dihentikan oleh break.
  • Hook berjalan sebelum reaksi; hook tidak menggantikannya. Nilai kembaliannya diabaikan, dan hook tidak dapat membatalkan, menunda, atau mengubah apa yang dilakukan reaksi. Gunakan untuk bertindak sebelum break, bukan untuk memvetonya - untuk mengubah reaksi itu sendiri, gunakan vmDefenseReaction (Resep 2).

Kapan kompilasi hook ke bytecode berfungsi

Menempatkan hook di dalam bundel hasil obfuskasi seperti ini berfungsi hanya karena deteksi debugger aktif saat runtime. VM mengaktifkan vmDefenseHook selagi masih hidup, setelah program Anda dimuat dan mendefinisikan hook, sehingga hook yang telah dikompilasi menjadi bytecode didekode dan dijalankan lebih dulu, lalu break. Inilah yang melindungi kode sumber hook itu sendiri.

Ini tidak berfungsi untuk deteksi yang aktif saat startup - automation, sandbox, domain, atau sebuah debugger yang sudah terbuka ketika halaman dimuat - karena pada titik itu hook berbentuk bytecode belum terdefinisi, sehingga pertahanan tidak menemukan fungsi untuk dipanggil. Untuk deteksi tersebut, daftarkan hook sebagai global biasa di halaman host, seperti pada Resep 1. Jika ragu, sebuah global halaman host biasa mencakup setiap deteksi yang mencapai hook; kompilasi ke bytecode hanya menambahkan proteksi untuk kode sumber hook itu sendiri, dan hanya untuk deteksi runtime.

Dari telemetri ke penegakan

Visibilitas dan penegakan tidak harus dirilis bersamaan. Terapkan pertahanan dalam dua tahap: pertama sebuah build yang hanya melaporkan, lalu - setelah telemetri tampak bersih - satu yang bereaksi.

Langkah 1 - luncurkan build khusus observasi

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, tetapi tidak ada yang rusak:

JavaScript

Langkah 2 - tinjau sinyal yang terkumpul

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

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

Utamakan memperbaiki penyebabnya daripada melunakkan sebuah reaksi: setiap kategori yang dibiarkan pada none adalah sebuah detektor yang dapat diabaikan penyerang dengan aman.

Langkah 3 - aktifkan reaksinya

Hapus penimpaan default: 'none' agar reaksi per-kategori bawaan berlaku; satu baris itu adalah keseluruhan perubahannya. Jika sebuah kategori terus menghasilkan false positive yang tidak dapat Anda hilangkan, biarkan kategori itu saja pada none (mis. vmDefenseReaction: { automation: 'none' }) dan tegakkan sisanya.

Biarkan vmDefenseHook tetap diatur setelah penegakan aktif - hook aktif terlepas dari reaksinya, sehingga Anda tetap memiliki visibilitas terhadap siapa yang menyelidiki bundel Anda selagi pertahanan bertindak.