Dokümantasyon
/
Tarifler
/

VM Savunma Telemetrisi ve Tepkileri

VM Savunma Telemetrisi ve Tepkileri

Pro
v7.4.0+

vmDefenseHook ile VM savunma tespitlerini arka ucunuza raporlayın ve vmDefenseReaction ile her tespit kategorisinin nasıl tepki vereceğini ayarlayın - tamamen kesintisiz, yalnızca telemetri içeren bir derlemeden çalınmış bir pakette hemen kırılan birine kadar.

İzle

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

YouTube'da izle

Sorun

VM savunmaları - vmSelfDefending, vmDebugProtection ve vmDomainLock - yerel olarak çalışır: bir hata ayıklayıcı, otomasyon aracı, kurcalanmış bir ortam veya yetkisiz bir alan adı tespit edildiğinde, korunan kod kırılır ya da kendi sonuçlarını sessizce zehirler. Bu, saldırganı durdurur, ama varsayılan olarak bundan hiç haberiniz olmaz. Paketinizin ne sıklıkla yoklandığını, hangi dedektörün tetiklendiğini veya bir savunmanın meşru bir kullanıcıyı kırıp kırmadığını bilemezsiniz.

İki seçenek bu boşluğu kapatır. İkisi de herhangi bir savunmayı etkinleştirmez - yalnızca zaten açtığınız savunmaları gözlemler ve yönlendirir:

  • vmDefenseHook - bir savunma her bir şey tespit ettiğinde bir sinyal nesnesi alan global bir geri çağırma. Arka ucunuza telemetri göndermek için kullanın.
  • vmDefenseReaction - etkin bir savunmanın nasıl tepki vereceğini seçen, kategori başına bir eşleme: kır, decoy veya yerel olarak hiçbir şey yapma.

Her iki seçenek de v7.1.0'da tanıtıldı, ancak buradaki her örnek v7.4.0 gerektiren vmDefenseHook: { name } nesne biçimini kullanır. Önceki sürümler düz bir string alıyordu (vmDefenseHook: '__vmDetection'); bu biçim v8.0.0'dan itibaren reddedilir, bu nedenle her yerde nesne biçimini kullanın.

Tarif 1 - tespitleri arka ucunuza 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 yüzden birçok tespit başlatma sırasında tetiklenir. Hook'u, obfuscate edilmiş betik etiketinden önce, ana sayfada düz bir global değişken olarak tanımlayın:

HTML

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

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

JavaScript

Panelde, VM Defense Hook alanı, en az bir savunma (vmSelfDefending, vmDebugProtection veya vmDomainLock) etkinleştirildiğinde Gelişmiş Koruma bölümünde görünür.

Adım 3 - sinyali arka ucunuzda alın

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

  • source - belirli dedektör: headless, node, agent, agentBrowser, domain, debugger, sandbox, nativeHook, timing veya integrity. v7.4.0 itibarıyla eski env ve inspector dedektörleri source: 'debugger' altında raporlanır. agentBrowser, category: 'automation' altında raporlanır ve vmDebugProtection açık olan tarayıcı hedeflerinde çalışır (v7.9.0+).
  • category - automation, debugger, sandbox, domain, tamper veya integrity. node kaynağı category: 'debugger' altında raporlanır (v7.4.0+).
  • score, threshold - tespit puanı ve aştığı eşik

Minimal bir alıcı uç nokta (Express gösterilmiştir; POST kabul eden herhangi bir arka uç çalışır). Gövdeyi bir diziye normalleştirir, böylece aşağıdaki arabellek deseninin gönderdiği toplu biçimi de işler:

JavaScript

Hook, yalnızca raporlama içindir - dönüş değeri yok sayılır ve eksik ya da hata fırlatan bir hook sessiz bir no-op'tur. Bir savunmayı asla devre dışı bırakamaz, dolayısıyla hook'unuzu silen veya bozan bir saldırgan hiçbir şey kazanmaz. Bir savunmanın ne yaptığını değiştirmek için vmDefenseReaction kullanın (Tarif 2).

Hook'u obfuscate edilmiş kaynağın içinde değil, ana sayfada tanımlayın

Telemetri için her tespiti yakalamak istersiniz ve birçoğu başlatma sırasında tetiklenir - obfuscate edilmiş paketin içinde tanımlanan bir hook, bunları yakalamak için çok geç kaydedilir ve VM'e derlenirse programınız çalışana kadar erişilemez. Her iki durumda da güvende kalır (eksik bir hook no-op olur ve kendisi bir tespiti tetikleyen bir hook özyinelemeli olarak yeniden çağrılmaz), ama tam kapsam için onu ana sayfada baştan kaydedin.

Tek istisna, yalnızca bir çalışma zamanı tespitine tepki veren bir hook'tur - örneğin kullanım sırasında bir hata ayıklayıcı açıldığında yapılan temizlik. Bu hook, obfuscate edilmiş paketin içinde yer alabilir; bkz. Tarif 3.

Raporlama mantığınızı yine de korumak için, kayıtlı hook'u tek satırlık bir arabellek olarak tutun ve onu obfuscate edilmiş kodunuzdan boşaltın:

JavaScript

JavaScript

Sinyal alanlarını yeniden adlandırma (aliases)

Varsayılan source / category değerleri açıklayıcı adlardır, bu yüzden geri çağırmayı izleyen (veya çıktıyı okuyan) herkes korumayı ve hangi dedektörün tetiklendiğini tanıyabilir. aliases, sinyal alanlarını seçtiğiniz opak token'lara yeniden adlandırır; bu, sinyal yayılmadan önce VM içinde uygulanır, dolayısıyla o adlar çıktıda hiç görünmez ve geri çağırmaya ulaşmaz. Uygulamanız kendi eşlemesini bilir ve token'ları arka ucunuza iletir.

Takma adlar alan başınadır: her biri bir key alır (geri çağırmanın aldığı özellik adı); string türündeki 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ış girdiler varsayılan adlarını korur.

JavaScript

Panelde, Sinyal takma adları bölümü VM Defense Hook alanının altında yer alır.

Bu, parmak izinden kaçınmadır, gizlilik değil - eşleme, tekrarlı denemelerle yine de çıkarılabilir, dolayısıyla tek faydası kararlı, kendini açıklayan adları ifşa etmemektir.

Tarif 2 - varsayılan tepkileri ayarlayın

vmDefenseReaction, her tespit kategorisinin nasıl tepki vereceğini yapılandırır. Hiçbir şeyi etkinleştirmez - savunmaların kendisi vmSelfDefending, vmDebugProtection ve vmDomainLock ile açılır; bu seçenek yalnızca etkin bir savunmanın nasıl tepki vereceğini seçer. Denetim birimi kategoridir: bir kategorideki her dedektör 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 sürülüyor: headless veya otomatik bir tarayıcı, bir kazıma / test çerçevesi ya da sayfayı adımlayan bir yapay zekâ kodlama aracısı.
debuggervmDebugProtection veya vmSelfDefendingBirinin bir hata ayıklayıcısı ya da tarayıcının geliştirici araçları inspector'ı açık ve çalışan kodu anlamak için adım adım geziyor.
sandboxvmDebugProtectionKod gerçek bir tarayıcıda hiç çalışmıyor - çevrimdışı çalıştırılıp incelenmek üzere öykünülmüş veya betikle sürülen bir JavaScript ortamına taşınmış.
domainvmDomainLockKod, yetki vermediğiniz bir sitede çalışıyor: vmDomainLock izin listenizde olmayan bir ana bilgisayar (örneğin paketinizin başkasının alanına kopyalanması).
tampervmSelfDefendingVM'in çevresindeki JavaScript ortamı, onu izlemek veya ele geçirmek için değiştirilmiş; örneğin yerel tarayıcı yerleşikleri araçlandırılmış sürümlerle değiştirilmiş.
integrityvmSelfDefendingKorunan paketin kendi kodu, onu oluşturduğunuzdan bu yana düzenlenmiş ya da yamalanmış.

Anahtarlar bu altı kategori adıdır ya da default (belirtilmeyen kategoriler için bir yedek). Değerler şunlardır:

  • break - hemen kır
  • decoy - zehirlenmiş durumda çalışmayı sürdür, sessizce yanlış sonuçlar üret. decoy, tarayıcı hedefinde vmDebugProtection veya vmDomainLock gerektirir; aksi halde break gibi davranır.
  • none - yerel olarak hiçbir şey yapma (yalnızca telemetri)

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

JavaScript

default, integrity ve tamper dahil her kategoriye ulaşır, dolayısıyla { default: 'none' } gerçekten kesintisiz, yalnızca telemetri içeren bir derlemedir:

JavaScript

JavaScript

Panelde, VM Defense Reactions seçicileri, bir savunma etkinleştirildiğinde Gelişmiş Koruma bölümünde görünür; her kategori, yalnızca dedektörlerini yayan bir savunma açıkken düzenlenebilir.

Tarif 3 - bir savunma kırılmadan önce kendi mantığınızı çalıştırın

Hook yalnızca raporlama için değildir - aynı zamanda bir savunma tepki vermeden önce kendi yanıtınızı çalıştırabileceğiniz tek güvenilir yerdir. Çalışan bir sayfada bir hata ayıklayıcı açıldığında, kod kırılmadan önce ekranda olanları temizlemek ya da görünümü bir 404 sayfasıyla değiştirmek isteyebilirsiniz.

Neden uygulamanızın başka bir yerindeki kod yerine hook: break sonraki tüm bayt kodunu durdurur, dolayısıyla bir savunma tetiklendikten sonra çalışan bir sökme işlemi - özellikle kendisi VM ile obfuscate edildiğinde - tam olarak break'in çalışmasını engellediği şeydir. Hook, tespit noktasında, tepki uygulanmadan önce, senkron olarak tetiklenir - yani çağırdığı senkron bir fonksiyon önce biter, ardından break VM'i durdurur.

Yanıtı vmDefenseHook'unuz olarak tanımlayın. debugger tespiti çalışma zamanında - programınız yüklenip hook'u tanımladıktan sonra - tetiklendiği için, hook obfuscate edilmiş kaynağınızın bir parçası olabilir ve paketin geri kalanıyla birlikte bayt koduna dönüştürülür. Her koşulun doğru yanıtı alması için signal.category üzerinden dallanın, işi senkron tutun, ardından tepkinin çalışmasına izin verin:

JavaScript

JavaScript

Bu, uygulamanız çalışırken tetiklenen tespitler için geçerlidir - aşağıdaki Hook'u bayt koduna dönüştürme ne zaman işe yarar bölümüne bakın.

Şu noktaları aklınızda tutun:

  • Yalnızca senkron işin önce biteceği garanti edilir. Tepki, hook döndükten hemen sonraki ifadede çalışır. Hemen devreden çıkan, gönder-unut çağrıları uygundur (navigator.sendBeacon, senkron DOM ve tuval düzenlemeleri); daha sonraya zamanladığınız işler - bir setTimeout, bir promise devamı, bir await - değildir ve daha fazla VM bayt koduna ihtiyaç duyan hiçbir şey çalışmaz, çünkü break'in durdurduğu şey budur.
  • Hook, tepkiden önce çalışır; onun yerine geçmez. Dönüş değeri yok sayılır ve tepkinin ne yaptığını iptal edemez, geciktiremez veya değiştiremez. Onu break'i veto etmek için değil, break'ten önce işlem yapmak için kullanın - tepkinin kendisini değiştirmek için vmDefenseReaction kullanın (Tarif 2).

Hook'u bayt koduna dönüştürme ne zaman işe yarar

Hook'u bu şekilde obfuscate edilmiş paketin içine koymak yalnızca debugger tespiti çalışma zamanında tetiklendiği için işe yarar. VM, vmDefenseHook'u hâlâ canlıyken, programınız yüklenip hook'u tanımladıktan sonra tetikler, dolayısıyla bayt koduna dönüştürülmüş hook önce çözülüp çalıştırılır, ardından break. Hook'un kendi kaynağını koruyan da budur.

Başlatmada tetiklenen tespitler için çalışmaz - automation, sandbox, domain veya sayfa yüklenirken zaten açık olan bir hata ayıklayıcı - çünkü o noktada bayt koduna dönüştürülmüş hook henüz tanımlı değildir, dolayısıyla savunma çağıracak bir fonksiyon bulamaz. Bunlar için hook'u bunun yerine, Tarif 1'deki gibi ana sayfada düz bir global olarak kaydedin. Kuşkuya düştüğünüzde, ana sayfadaki düz bir global, hook'a ulaşan her tespiti kapsar; bayt koduna dönüştürme yalnızca hook'un kendi kaynağı için koruma ekler ve yalnızca çalışma zamanı tespitleri için.

Telemetriden zorlamaya

Görünürlük ve zorlama birlikte yayına alınmak zorunda değildir. Savunmaları iki aşamada devreye alın: önce yalnızca raporlayan bir derleme, 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 dedektör yine çalışır ve her isabeti arka ucunuza raporlar, ama hiçbir şey kırılmaz:

JavaScript

Adım 2 - toplanan sinyalleri inceleyin

Derleme gerçek trafiği gördükten sonra, meşru kullanımın tetiklediği tespitleri 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ıtları savunmalar olmadan derleyin.
  • vmDomainLock izin listesine eklemeyi unuttuğunuz bir hazırlık 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 rahatça görmezden gelebileceği bir dedektördür.

Adım 3 - tepkileri açın

Yerleşik kategori başına tepkilerin geçerli olması için default: 'none' geçersiz kılmasını kaldırın; o tek satır tüm değişikliktir. Bir kategori ortadan kaldıramadığınız yanlış pozitifler üretmeyi sürdürüyorsa, yalnızca o kategoriyi none olarak bırakın (örn. vmDefenseReaction: { automation: 'none' }) ve gerisini zorlayın.

Zorlama açıldıktan sonra vmDefenseHook'u ayarlı tutun - hook, tepkiden bağımsız olarak tetiklenir, böylece savunmalar harekete geçerken paketinizi kimin yokladığına dair görünürlüğü korursunuz.