The e-commerce market is booming. A rare person does not buy online now. However, the convenience of online shopping has its downsides: those who use payment cards for online shopping face countless cyber threats, JavaScript-sniffers is one of them. JS-sniffer is a malicious code that is injected into the websites designed to steal customer payment data, personal details, credentials etc. Until recently, when the first RiskIQ report on this type of malware was published, the threat posed by JS-sniffers remained under the radar of malware analysts, who deemed it insignificant and unworthy of an in-depth research. However, several incidents have shown the opposite to be true, including 380,000 victims of a JS-sniffer that infected the British Airways website and mobile app, the compromise of Ticketmaster users’ payment data, and the recent incident involving the UK website of the international sporting goods giant Fila, which could have led to the theft of payment details of at least 5,600 customers. All these incidents indicate that this threat has to be taken seriously.

In our recent comprehensive report on the analysis of JavaScript-sniffers, Group-IB researchers analyzed 2440 infected ecommerce websites all around the world with a total of around 1.5 million unique daily visitors whose data could have been compromised. When a website is infected, everyone is potentially a victim – online shoppers, ecommerce websites, payment processing systems, and banks that issued compromised cards. Group-IB’s report features an in-depth analysis of JS-sniffers’ darknet market, their entire infrastructure and the monetization methods, which bring their developers millions of dollars. This is a first blog post in a series that features detailed technical analysis of different families of JS-sniffers.

Meet ReactGet

I think that ReactGet is one of the most interesting families of JS-sniffers, designed to steal banking cards data from online stores. Despite that ReactGet is considered as specialized JS-sniffer, it is capable of stealing payment and personal info from the websites that use a variety of different payment processing systems. In case with traditional specialized JS-sniffers, one version value corresponds to one specific payment gateway, while some of the detected versions of the ReactGet can be used for either credentials or payment information stealing from payment forms of multiple payment systems at once. It was established that in some cases, JS-sniffer’s operators carry out targeted phishing attacks aimed at the online shops’ administrators in order to obtain the credentials to access the administrative panel.

The campaign involving the use of the ReactGet JS-sniffer family started in May 2017. ReactGet was used to infect websites running on CMS and e-commerce platforms such as Magento, Bigcommerce, and Shopify.

Description

The analysis of infected websites made it possible to explore the techniques used to add malicious script to the HTML code of infected websites. Apart from the classic technique involving the “src” parameter, the attackers developed their own specific method: they used a JavaScript script that checks whether the URL address in the victim’s browser matches, based on keywords indicating that the page is a checkout page. The malicious script starts only if the URL address includes substrings such as “checkout”. The malicious script is therefore executed only after users have filled in the form with their payment and personal information.

JS-Sniffers ReactGet malicious script

Samples of the ReactGet JS-sniffer family use a special technique for sending stolen information to the attackers’ server: the victim’s payment and personal information is encoded with Base64, after which the result string is used as a parameter for the URL for sending requests to the attackers’ server. In most cases, the path to the gate imitates JavaScript files such as resp.js and data.js, but sometimes the gate path looks like a URL to GIF and PNG files. The JS-sniffer’s distinctive feature is that it creates a pixel-by-pixel image and uses previously generated URLs with encoded credentials as a “src” parameter for this image. In the victim’s network traffic, this request looks like a simple HTTP GET request to the image. A similar technique was used in the case of the ImageID JS-sniffer family. However, the technique is also used by various legitimate services to collect statistics about website visitors, which might confuse a user.

Samples of the ReactGet JS-sniffer family

Analysis of versions

Analysis of active domain names used by the operators of ReactGet family as script hosts and gates led to the discovery of a large number of different versions. Each version was designed for stealing credentials from the payment form of a specific payment gateway used for processing payments on e-commerce websites. In addition, the difference between these JS-sniffer versions was whether it was obfuscated or not. By fuzzing the value of the version on some of the gates, Group-IB specialists obtained the full list of versions used by the attackers. Analysing the list of payment form IDs hardcoded in each JS-sniffer made it possible to determine the target payment system of each JS-sniffer sample. See Appendix 1.

JS-sniffer for stealing passwords

One of the main features of every JS-sniffer is the ability to steal any type of data from POST forms on infected websites. JS-sniffers steal not only credit card information but also user credentials such as login and password pairs. Group-IB specialists detected a specific version of the JS-sniffer linked to the ReactGet family, which was designed to steal user email addresses and passwords from infected websites.

specific version of the JS-sniffer ReactGet

Overlap with ImageID JS-sniffer

While analysing one of the infected websites, it was discovered that it had been infected twice: in addition to the infection by the ReactGet JS-sniffer, the website was infected with the ImageID JS-sniffer. This could mean that operators of both JS-sniffers use similar tools and tactics to infect e-commerce websites.

Sample of the ReactGet JS-sniffer family

Universal JS-sniffer

While analysing one of the domain names used by the attackers, it was discovered that the same actor created three other domain names imitating three legitimate websites which belonged to online stores. These domain names were used to store JS-sniffers in past waves of infection campaigns conducted by the same actors. The analysis of three infected websites showed that the JS-sniffers used on these shops were replaced by an updated version of the ReactGet JS-sniffer. In this case, the attackers used a universal version of the JS-sniffer that steals information not from one specific payment form but from 15 different types of payment forms that could be used on e-commerce websites to process payments.

During the first stages of execution, the JS-sniffer searches for basic fields containing the victim’s personal information: full name, address, phone number, etc.

Sample of the ReactGet JS-sniffer family

The JS-sniffer then searches for payment information using 15 different prefixes for various payment gateways for e-commerce websites.

Sample of the ReactGet JS-sniffer family

The JS-sniffer’s script collects the victim’s payment and personal information and sends it to the server controlled by the attackers. In this case, two versions of this universal JS-sniffer stored on two compromised websites were discovered, but both versions sent stolen information to a gate located on one of these compromised websites, zoobashop.com.

JS-sniffer's ReactGet script

Analysis of the prefixes used by the JS-sniffer to find the victim’s payment information on the page allowed to determine the list of affected payment gateways. The JS-sniffer steals information from payment forms of the following payment processing systems:

  • Authorize.Net
  • Verisign
  • First Data
  • USAePay
  • Stripe
  • PayPal
  • ANZ eGate
  • Braintree
  • DataCash (MasterCard)
  • Realex Payments
  • PsiGate
  • Heartland Payment Systems

Tools

The analysis of attackers’ infrastructure revealed the tools used by ReactGet operators during their attacks. The first discovered tool is aimed at obfuscation of malicious scripts responsible for stealing payment cards data. A bash script using CLI of the project javascript-obfuscator for automatization of script obfuscation was discovered on one of the attackers’ hosts.

JS-Sniffers ReactGet script obfuscation

The second discovered tool is aimed at generation of scripts responsible for loading the JS-sniffer. This tool generates JavaScript code which checks if the user is on the checkout page searching for keywords (e.g. checkout, card etc.) in the URL address of the victims’ browser. Thus, the JS-sniffer is downloaded from the attackers’ server if the user is on the checkout page. In order to hide the malicious activity all strings including test strings for checkout page detection and the link to JS-sniffer are encoded with Base64.

JS-sniffer encoded with Base64

Phishing attacks

While analyzing the network infrastructure used by ReactGet operators, it was established that in order to access the administrative panel of the targeted online store cybercriminals quite often carry out targeted phishing attacks. The attackers register a domain that is very similar to the legitimate one used by the targeted online store, and fake admin panel access form. If successful, such phishing attacks allows cybercriminals to get access to the Magento CMS website control panel and inject a JS-Sniffer to steal customer payment data.

access to the Magento CMS website control panel

Infrastructure

Domain Detection / creation date
mediapack.info 04.05.2017
adsgetapi.com 15.06.2017
simcounter.com 14.08.2017
mageanalytics.com 22.12.2017
maxstatics.com 16.01.2018
reactjsapi.com 19.01.2018
mxcounter.com 02.02.2018
apitstatus.com 01.03.2018
orderracker.com 20.04.2018
tagstracking.com 25.06.2018
adsapigate.com 12.07.2018
trust-tracker.com 15.07.2018
fbstatspartner.com 02.10.2018
billgetstatus.com 12.10.2018
aldenmlilhouse.com 20.10.2018
balletbeautlful.com 20.10.2018
bargalnjunkie.com 20.10.2018
payselector.com 21.10.2018
tagsmediaget.com 02.11.2018
hs-payments.com 16.11.2018
ordercheckpays.com 19.11.2018
geisseie.com 24.11.2018
gtmproc.com 29.11.2018
livegetpay.com 18.12.2018
sydneysalonsupplies.com 18.12.2018
newrelicnet.com 19.12.2018
nr-public.com 03.01.2019
cloudodesc.com 04.01.2019
ajaxstatic.com 11.01.2019
livecheckpay.com 21.01.2019
asianfoodgracer.com 25.01.2019

Appendix 1

Sniffer URL Payment gateway
http://reactjsapi.com/react.js Authorize.Net
https://ajaxstatic.com/api.js?v=2.1.1 Cardsave
https://ajaxstatic.com/api.js?v=2.1.2 Authorize.Net
https://ajaxstatic.com/api.js?v=2.1.3 Authorize.Net
https://ajaxstatic.com/api.js?v=2.1.4 eWAY Rapid
https://ajaxstatic.com/api.js?v=2.1.5 Authorize.Net
https://ajaxstatic.com/api.js?v=2.1.6 Adyen
https://ajaxstatic.com/api.js?v=2.1.7 USAePay
https://ajaxstatic.com/api.js?v=2.1.9 Authorize.Net
https://apitstatus.com/api.js?v=2.1.1 USAePay
https://apitstatus.com/api.js?v=2.1.2 Authorize.Net
https://apitstatus.com/api.js?v=2.1.3 Moneris
https://apitstatus.com/api.js?v=2.1.5 USAePay
https://apitstatus.com/api.js?v=2.1.6 PayPal
https://apitstatus.com/api.js?v=2.1.7 Sage Pay
https://apitstatus.com/api.js?v=2.1.8 Verisign
https://apitstatus.com/api.js?v=2.1.9 PayPal
https://apitstatus.com/api.js?v=2.3.0 Stripe
https://apitstatus.com/api.js?v=3.0.2 Realex
https://apitstatus.com/api.js?v=3.0.3 PayPal
https://apitstatus.com/api.js?v=3.0.4 LinkPoint
https://apitstatus.com/api.js?v=3.0.5 PayPal
https://apitstatus.com/api.js?v=3.0.7 PayPal
https://apitstatus.com/api.js?v=3.0.8 DataCash
https://apitstatus.com/api.js?v=3.0.9 PayPal
https://asianfoodgracer.com/footer.js Authorize.Net
https://billgetstatus.com/api.js?v=1.2 Authorize.Net
https://billgetstatus.com/api.js?v=1.3 Authorize.Net
https://billgetstatus.com/api.js?v=1.4 Authorize.Net
https://billgetstatus.com/api.js?v=1.5 Verisign
https://billgetstatus.com/api.js?v=1.6 Authorize.Net
https://billgetstatus.com/api.js?v=1.7 Moneris
https://billgetstatus.com/api.js?v=1.8 Sage Pay
https://billgetstatus.com/api.js?v=2.0 USAePay
https://billgetstatus.com/react.js Authorize.Net
https://cloudodesc.com/gtm.js?v=1.2 Authorize.Net
https://cloudodesc.com/gtm.js?v=1.3 ANZ eGate
https://cloudodesc.com/gtm.js?v=2.3 Authorize.Net
https://cloudodesc.com/gtm.js?v=2.4 Moneris
https://cloudodesc.com/gtm.js?v=2.6 Sage Pay
https://cloudodesc.com/gtm.js?v=2.7 Sage Pay
https://cloudodesc.com/gtm.js?v=2.8 Chase Paymentech
https://cloudodesc.com/gtm.js?v=2.9 Authorize.Net
https://cloudodesc.com/gtm.js?v=2.91 Adyen
https://cloudodesc.com/gtm.js?v=2.92 PsiGate
https://cloudodesc.com/gtm.js?v=2.93 CyberSource
https://cloudodesc.com/gtm.js?v=2.95 ANZ eGate
https://cloudodesc.com/gtm.js?v=2.97 Realex
https://geisseie.com/gs.js USAePay
https://gtmproc.com/age.js Authorize.Net
https://gtmproc.com/gtm.js?v=1.2 Authorize.Net
https://gtmproc.com/gtm.js?v=1.3 ANZ eGate
https://gtmproc.com/gtm.js?v=1.5 PayPal
https://gtmproc.com/gtm.js?v=1.6 PayPal
https://gtmproc.com/gtm.js?v=1.7 Realex
https://livecheckpay.com/api.js?v=2.0 Sage Pay
https://livecheckpay.com/api.js?v=2.1 PayPal
https://livecheckpay.com/api.js?v=2.2 Verisign
https://livecheckpay.com/api.js?v=2.3 Authorize.Net
https://livecheckpay.com/api.js?v=2.4 Verisign
https://livecheckpay.com/react.js Authorize.Net
https://livegetpay.com/pay.js?v=2.1.2 ANZ eGate
https://livegetpay.com/pay.js?v=2.1.3 PayPal
https://livegetpay.com/pay.js?v=2.1.5 CyberSource
https://livegetpay.com/pay.js?v=2.1.7 Authorize.Net
https://livegetpay.com/pay.js?v=2.1.8 Sage Pay
https://livegetpay.com/pay.js?v=2.1.9 Realex
https://livegetpay.com/pay.js?v=2.2.0 CyberSource
https://livegetpay.com/pay.js?v=2.2.1 PayPal
https://livegetpay.com/pay.js?v=2.2.2 PayPal
https://livegetpay.com/pay.js?v=2.2.3 PayPal
https://livegetpay.com/pay.js?v=2.2.4 Verisign
https://livegetpay.com/pay.js?v=2.2.5 eWAY Rapid
https://livegetpay.com/pay.js?v=2.2.7 Sage Pay
https://livegetpay.com/pay.js?v=2.2.8 Sage Pay
https://livegetpay.com/pay.js?v=2.2.9 Verisign
https://livegetpay.com/pay.js?v=2.3.0 Authorize.Net
https://livegetpay.com/pay.js?v=2.3.1 Authorize.Net
https://livegetpay.com/pay.js?v=2.3.2 First Data Global Gateway
https://livegetpay.com/pay.js?v=2.3.3 Authorize.Net
https://livegetpay.com/pay.js?v=2.3.4 Authorize.Net
https://livegetpay.com/pay.js?v=2.3.5 Moneris
https://livegetpay.com/pay.js?v=2.3.6 Authorize.Net
https://livegetpay.com/pay.js?v=2.3.8 PayPal
https://livegetpay.com/pay.js?v=2.4.0 Verisign
https://maxstatics.com/site.js USAePay
https://mediapack.info/track.js?d=funlove.com USAePay
https://mediapack.info/track.js?d=qbedding.com Authorize.Net
https://mediapack.info/track.js?d=vseyewear.com Verisign
https://mxcounter.com/c.js?v=1.2 PayPal
https://mxcounter.com/c.js?v=1.3 Authorize.Net
https://mxcounter.com/c.js?v=1.4 Stripe
https://mxcounter.com/c.js?v=1.6 Authorize.Net
https://mxcounter.com/c.js?v=1.7 eWAY Rapid
https://mxcounter.com/c.js?v=1.8 Sage Pay
https://mxcounter.com/c.js?v=2.0 Authorize.Net
https://mxcounter.com/c.js?v=2.1 Braintree
https://mxcounter.com/c.js?v=2.10 Braintree
https://mxcounter.com/c.js?v=2.2 PayPal
https://mxcounter.com/c.js?v=2.3 Sage Pay
https://mxcounter.com/c.js?v=2.31 Sage Pay
https://mxcounter.com/c.js?v=2.32 Authorize.Net
https://mxcounter.com/c.js?v=2.33 PayPal
https://mxcounter.com/c.js?v=2.34 Authorize.Net
https://mxcounter.com/c.js?v=2.35 Verisign
https://mxcounter.com/click.js?v=1.2 PayPal
https://mxcounter.com/click.js?v=1.3 Authorize.Net
https://mxcounter.com/click.js?v=1.4 Stripe
https://mxcounter.com/click.js?v=1.6 Authorize.Net
https://mxcounter.com/click.js?v=1.7 eWAY Rapid
https://mxcounter.com/click.js?v=1.8 Sage Pay
https://mxcounter.com/click.js?v=2.0 Authorize.Net
https://mxcounter.com/click.js?v=2.1 Braintree
https://mxcounter.com/click.js?v=2.2 PayPal
https://mxcounter.com/click.js?v=2.3 Sage Pay
https://mxcounter.com/click.js?v=2.31 Sage Pay
https://mxcounter.com/click.js?v=2.32 Authorize.Net
https://mxcounter.com/click.js?v=2.33 PayPal
https://mxcounter.com/click.js?v=2.34 Authorize.Net
https://mxcounter.com/click.js?v=2.35 Verisign
https://mxcounter.com/cnt.js Authorize.Net
https://mxcounter.com/j.js Authorize.Net
https://newrelicnet.com/api.js?v=1.2 Authorize.Net
https://newrelicnet.com/api.js?v=1.4 Authorize.Net
https://newrelicnet.com/api.js?v=1.8 Sage Pay
https://newrelicnet.com/api.js?v=4.5 Sage Pay
https://newrelicnet.com/api.js?v=4.6 Westpac PayWay
https://nr-public.com/api.js?v=2.0 PayFort
https://nr-public.com/api.js?v=2.1 PayPal
https://nr-public.com/api.js?v=2.2 Authorize.Net
https://nr-public.com/api.js?v=2.3 Stripe
https://nr-public.com/api.js?v=2.4 First Data Global Gateway
https://nr-public.com/api.js?v=2.5 PsiGate
https://nr-public.com/api.js?v=2.6 Authorize.Net
https://nr-public.com/api.js?v=2.7 Authorize.Net
https://nr-public.com/api.js?v=2.8 Moneris
https://nr-public.com/api.js?v=2.9 Authorize.Net
https://nr-public.com/api.js?v=3.1 Sage Pay
https://nr-public.com/api.js?v=3.2 Verisign
https://nr-public.com/api.js?v=3.3 Moneris
https://nr-public.com/api.js?v=3.5 PayPal
https://nr-public.com/api.js?v=3.6 LinkPoint
https://nr-public.com/api.js?v=3.7 Westpac PayWay
https://nr-public.com/api.js?v=3.8 Authorize.Net
https://nr-public.com/api.js?v=4.0 Moneris
https://nr-public.com/api.js?v=4.0.2 PayPal
https://nr-public.com/api.js?v=4.0.3 Adyen
https://nr-public.com/api.js?v=4.0.4 PayPal
https://nr-public.com/api.js?v=4.0.5 Authorize.Net
https://nr-public.com/api.js?v=4.0.6 USAePay
https://nr-public.com/api.js?v=4.0.7 EBizCharge
https://nr-public.com/api.js?v=4.0.8 Authorize.Net
https://nr-public.com/api.js?v=4.0.9 Verisign
https://nr-public.com/api.js?v=4.1.2 Verisign
https://ordercheckpays.com/api.js?v=2.11 Authorize.Net
https://ordercheckpays.com/api.js?v=2.12 PayPal
https://ordercheckpays.com/api.js?v=2.13 Moneris
https://ordercheckpays.com/api.js?v=2.14 Authorize.Net
https://ordercheckpays.com/api.js?v=2.15 PayPal
https://ordercheckpays.com/api.js?v=2.16 PayPal
https://ordercheckpays.com/api.js?v=2.17 Westpac PayWay
https://ordercheckpays.com/api.js?v=2.18 Authorize.Net
https://ordercheckpays.com/api.js?v=2.19 Authorize.Net
https://ordercheckpays.com/api.js?v=2.21 Sage Pay
https://ordercheckpays.com/api.js?v=2.22 Verisign
https://ordercheckpays.com/api.js?v=2.23 Authorize.Net
https://ordercheckpays.com/api.js?v=2.24 PayPal
https://ordercheckpays.com/api.js?v=2.25 PayFort
https://ordercheckpays.com/api.js?v=2.29 CyberSource
https://ordercheckpays.com/api.js?v=2.4 PayPal Payflow Pro
https://ordercheckpays.com/api.js?v=2.7 Authorize.Net
https://ordercheckpays.com/api.js?v=2.8 Authorize.Net
https://ordercheckpays.com/api.js?v=2.9 Verisign
https://ordercheckpays.com/api.js?v=3.1 Authorize.Net
https://ordercheckpays.com/api.js?v=3.2 Authorize.Net
https://ordercheckpays.com/api.js?v=3.3 Sage Pay
https://ordercheckpays.com/api.js?v=3.4 Authorize.Net
https://ordercheckpays.com/api.js?v=3.5 Stripe
https://ordercheckpays.com/api.js?v=3.6 Authorize.Net
https://ordercheckpays.com/api.js?v=3.7 Authorize.Net
https://ordercheckpays.com/api.js?v=3.8 Verisign
https://ordercheckpays.com/api.js?v=3.9 PayPal
https://ordercheckpays.com/api.js?v=4.0 Authorize.Net
https://ordercheckpays.com/api.js?v=4.1 Authorize.Net
https://ordercheckpays.com/api.js?v=4.2 Sage Pay
https://ordercheckpays.com/api.js?v=4.3 Authorize.Net
https://reactjsapi.com/api.js?v=0.1.0 Authorize.Net
https://reactjsapi.com/api.js?v=0.1.1 PayPal
https://reactjsapi.com/api.js?v=4.1.2 Flint
https://reactjsapi.com/api.js?v=4.1.4 PayPal
https://reactjsapi.com/api.js?v=4.1.5 Sage Pay
https://reactjsapi.com/api.js?v=4.1.51 Verisign
https://reactjsapi.com/api.js?v=4.1.6 Authorize.Net
https://reactjsapi.com/api.js?v=4.1.7 Authorize.Net
https://reactjsapi.com/api.js?v=4.1.8 Stripe
https://reactjsapi.com/api.js?v=4.1.9 Fat Zebra
https://reactjsapi.com/api.js?v=4.2.0 Sage Pay
https://reactjsapi.com/api.js?v=4.2.1 Authorize.Net
https://reactjsapi.com/api.js?v=4.2.2 First Data Global Gateway
https://reactjsapi.com/api.js?v=4.2.3 Authorize.Net
https://reactjsapi.com/api.js?v=4.2.4 eWAY Rapid
https://reactjsapi.com/api.js?v=4.2.5 Adyen
https://reactjsapi.com/api.js?v=4.2.7 PayPal
https://reactjsapi.com/api.js?v=4.2.8 QuickBooks Merchant Services
https://reactjsapi.com/api.js?v=4.2.9 Verisign
https://reactjsapi.com/api.js?v=4.2.91 Sage Pay
https://reactjsapi.com/api.js?v=4.2.92 Verisign
https://reactjsapi.com/api.js?v=4.2.94 Authorize.Net
https://reactjsapi.com/api.js?v=4.3.97 Authorize.Net
https://reactjsapi.com/api.js?v=4.5 Sage Pay
https://reactjsapi.com/react.js Authorize.Net
https://sydneysalonsupplies.com/gtm.js eWAY Rapid
https://tagsmediaget.com/react.js Authorize.Net
https://tagstracking.com/tag.js?v=2.1.2 ANZ eGate
https://tagstracking.com/tag.js?v=2.1.3 PayPal
https://tagstracking.com/tag.js?v=2.1.5 CyberSource
https://tagstracking.com/tag.js?v=2.1.7 Authorize.Net
https://tagstracking.com/tag.js?v=2.1.8 Sage Pay
https://tagstracking.com/tag.js?v=2.1.9 Realex
https://tagstracking.com/tag.js?v=2.2.0 CyberSource
https://tagstracking.com/tag.js?v=2.2.1 PayPal
https://tagstracking.com/tag.js?v=2.2.2 PayPal
https://tagstracking.com/tag.js?v=2.2.3 PayPal
https://tagstracking.com/tag.js?v=2.2.4 Verisign
https://tagstracking.com/tag.js?v=2.2.5 eWAY Rapid
https://tagstracking.com/tag.js?v=2.2.7 Sage Pay
https://tagstracking.com/tag.js?v=2.2.8 Sage Pay
https://tagstracking.com/tag.js?v=2.2.9 Verisign
https://tagstracking.com/tag.js?v=2.3.0 Authorize.Net
https://tagstracking.com/tag.js?v=2.3.1 Authorize.Net
https://tagstracking.com/tag.js?v=2.3.2 First Data Global Gateway
https://tagstracking.com/tag.js?v=2.3.3 Authorize.Net
https://tagstracking.com/tag.js?v=2.3.4 Authorize.Net
https://tagstracking.com/tag.js?v=2.3.5 Moneris
https://tagstracking.com/tag.js?v=2.3.6 Authorize.Net
https://tagstracking.com/tag.js?v=2.3.8 PayPal

Crime without punishment: in-depth analysis of JS-sniffers

Group-IB experts have researched this type of malware and have discovered at least 38 families of JS-sniffers, whereas only 12 were known previously.