<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bibek Khatri</title>
    <description>The latest articles on DEV Community by Bibek Khatri (@bibekkhatri1115).</description>
    <link>https://dev.to/bibekkhatri1115</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F840413%2F539a86c4-29eb-40ab-8574-1ea2315fd397.png</url>
      <title>DEV Community: Bibek Khatri</title>
      <link>https://dev.to/bibekkhatri1115</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bibekkhatri1115"/>
    <language>en</language>
    <item>
      <title>30,000 Machines Hacked by Fake Job Offers. Mine Was Almost Next.</title>
      <dc:creator>Bibek Khatri</dc:creator>
      <pubDate>Tue, 13 Oct 2026 20:43:49 +0000</pubDate>
      <link>https://dev.to/bibekkhatri1115/30000-machines-hacked-by-fake-job-offers-mine-was-almost-next-f37</link>
      <guid>https://dev.to/bibekkhatri1115/30000-machines-hacked-by-fake-job-offers-mine-was-almost-next-f37</guid>
      <description>&lt;p&gt;I got hired without an interview. That alone should have told me everything.&lt;/p&gt;

&lt;p&gt;A "recruiter" from a company called &lt;strong&gt;Carmlize&lt;/strong&gt; added me to their Slack workspace. Nobody called me, nobody asked about my experience, and I never spoke to an engineer. The first real message I got was a link to a GitHub repo and a friendly &lt;em&gt;"Here's the technical assessment, clone it and get it running."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've done enough take-homes to know how hiring usually goes. Companies make you jump through three rounds before they let you near their code. This one skipped straight to "please run our code on your laptop". My gut said no, so I didn't type &lt;code&gt;npm install&lt;/code&gt;. I started digging instead.&lt;/p&gt;

&lt;p&gt;A few weeks later I read a joint government cybersecurity advisory describing exactly this trick. Fake job interviews had compromised &lt;strong&gt;more than 30,000 machines in over 100 countries&lt;/strong&gt; in about eight months. So yes, the gut feeling was worth listening to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers made me a little sick
&lt;/h2&gt;

&lt;p&gt;I went looking for how common this is. Short answer: very.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;30,000+ devices&lt;/strong&gt; compromised across &lt;strong&gt;100+ countries&lt;/strong&gt; between December 2025 and July 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7,000+ crypto wallets&lt;/strong&gt; hit, with roughly &lt;strong&gt;$10.7 million&lt;/strong&gt; stolen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;338+ malicious npm packages&lt;/strong&gt; tied to fake-interview lures, downloaded &lt;strong&gt;50,000+ times&lt;/strong&gt;, found by researchers at Socket since July 2025.&lt;/li&gt;
&lt;li&gt;One wave alone in November 2025 added &lt;strong&gt;197 packages&lt;/strong&gt; and &lt;strong&gt;31,000+ downloads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Another in June 2025 used &lt;strong&gt;24 different npm accounts&lt;/strong&gt; to publish &lt;strong&gt;35 packages&lt;/strong&gt;, and many were pulled before anyone could count them properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of those downloads is a developer who thought they were doing a coding test.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, I tried to find the company
&lt;/h2&gt;

&lt;p&gt;Before I opened a single file, I tried to figure out whether Carmlize was a real business. It didn't go well.&lt;/p&gt;

&lt;p&gt;There was a website and a nice pitch about "AI-powered crypto market intelligence". That was about it. No product I could find anyone using, no press, no customers and no history.&lt;/p&gt;

&lt;p&gt;Then I looked them up on the UK business registry. The registered address was one of those shared virtual-office addresses that hundreds of unrelated companies use. That's not illegal, and plenty of real startups use them. But it does mean nobody is actually sitting there.&lt;/p&gt;

&lt;p&gt;LinkedIn was the part that really bothered me. The people listed as employees each had about one post, thin work histories and almost no activity. It felt like a cast of extras hired to make the company page look busy.&lt;/p&gt;

&lt;p&gt;Any one of these on its own, I might have shrugged off. All of them together? I decided to read the code very carefully and run absolutely nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code looked fine, and that's the scary part
&lt;/h2&gt;

&lt;p&gt;I opened the files in a plain editor without installing anything. Honestly, it looked like a decent project: a Next.js crypto dashboard with live markets, a swap screen, an order matching engine, wallet connect and a small Solidity token contract.&lt;/p&gt;

&lt;p&gt;One odd detail: the task brief (&lt;code&gt;FULLSTACK_DEVELOPER.md&lt;/code&gt;) says "No Solidity, no RPC work", while the repo is full of exactly that. Sloppy, or a sign the brief was copy-pasted onto bait.&lt;/p&gt;

&lt;p&gt;I didn't find anything nasty in the code itself. That's how these attacks are designed. The bad stuff isn't in the repo; it's in what the repo pulls in.&lt;/p&gt;

&lt;h3&gt;
  
  
  There was an npm token in &lt;code&gt;.npmrc&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//registry.npmjs.org/:_authToken=&amp;lt;redacted&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've never seen a legitimate take-home ship an npm credential, and I can't think of a good reason to. With that file in place, &lt;code&gt;npm install&lt;/code&gt; logs in to the npm registry as &lt;em&gt;someone else&lt;/em&gt;, which lets it download packages the public can't see.&lt;/p&gt;

&lt;h3&gt;
  
  
  Then there was a Tailwind plugin nobody needs
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;package.json&lt;/code&gt; lists a dev dependency called &lt;code&gt;animatecss-tailwind-adapter&lt;/code&gt;, and the Tailwind config loads it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;animatecss-tailwind-adapter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)({&lt;/span&gt;
    &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;200ms&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1s&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;iterationCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It sounds harmless. Who'd question an animation helper? So I checked the npm registry metadata (just the metadata; nothing ran).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was &lt;strong&gt;first published on 2026-07-28&lt;/strong&gt;, and the only version that has ever existed is &lt;code&gt;2.0.6&lt;/code&gt;. A brand-new package starting at version 2 is a classic way to look established.&lt;/li&gt;
&lt;li&gt;The maintainer account didn't match the GitHub repo or author name in the package.&lt;/li&gt;
&lt;li&gt;It depends on a scoped package called &lt;strong&gt;&lt;code&gt;@aaron205whitmore/postcss-animate-utils&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  And that package doesn't publicly exist
&lt;/h3&gt;

&lt;p&gt;When I looked up &lt;code&gt;@aaron205whitmore/postcss-animate-utils&lt;/code&gt;, the public registry returned a &lt;strong&gt;404&lt;/strong&gt;. I couldn't see it, download it or read it. You can only get it with the right credentials... like the token sitting in &lt;code&gt;.npmrc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Put it together and the trap is pretty neat:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You run &lt;code&gt;npm install&lt;/code&gt;. npm quietly uses the bundled token.&lt;/li&gt;
&lt;li&gt;It downloads the hidden package, and any install scripts in it run straight away.&lt;/li&gt;
&lt;li&gt;You run &lt;code&gt;npm run dev&lt;/code&gt;. Tailwind loads its config, the config loads the plugin, and the plugin loads the hidden package inside your Node process, with access to everything your user account can touch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You could read every line of that repo and never find the malware, because it was never in the repo. The repo is just the delivery van.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they're after
&lt;/h2&gt;

&lt;p&gt;The advisory lists the malware these campaigns use, with names like BeaverTail, InvisibleFerret and OtterCookie. Cute names, ugly jobs. They go after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your crypto wallets and seed phrases&lt;/li&gt;
&lt;li&gt;browser cookies and saved passwords, so they can log in as you&lt;/li&gt;
&lt;li&gt;SSH keys, &lt;code&gt;.env&lt;/code&gt; files, and GitHub and cloud credentials&lt;/li&gt;
&lt;li&gt;a backdoor so they can come back later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bit that stuck with me: the advisory warns that stolen developer credentials can lead attackers into the developer's &lt;em&gt;employer&lt;/em&gt;. If I'd run this on a work laptop, I wouldn't just have been risking my own stuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  8 signs your take-home might be a trap
&lt;/h2&gt;

&lt;p&gt;These are the things I'll be checking from now on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;You skipped the interview.&lt;/strong&gt; If you're "hired" or in their Slack before anyone has spoken to you, slow down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;They really want you to run it.&lt;/strong&gt; A real reviewer cares about your code, not whether you ran theirs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There are credentials in the repo.&lt;/strong&gt; &lt;code&gt;.npmrc&lt;/code&gt; tokens, real keys in &lt;code&gt;.env&lt;/code&gt; files and private registry URLs are all bad news.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dependency is weirdly new.&lt;/strong&gt; &lt;code&gt;npm view &amp;lt;pkg&amp;gt; time maintainers repository&lt;/code&gt; takes ten seconds and tells you a lot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config files load packages.&lt;/strong&gt; &lt;code&gt;tailwind.config&lt;/code&gt;, &lt;code&gt;postcss.config&lt;/code&gt;, &lt;code&gt;next.config&lt;/code&gt; and &lt;code&gt;vite.config&lt;/code&gt; all run code when you build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There are install scripts.&lt;/strong&gt; Read every &lt;code&gt;preinstall&lt;/code&gt;, &lt;code&gt;postinstall&lt;/code&gt; and &lt;code&gt;prepare&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't find real people at the company.&lt;/strong&gt; Virtual-office address, ghost employees, nobody you can actually reach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The brief and the code disagree.&lt;/strong&gt; Mine said "no Solidity, no wallet work" and shipped a token contract and wallet integration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How I'd review one safely next time
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open it in an editor and &lt;strong&gt;don't install anything&lt;/strong&gt;. If you use VS Code, say no when it asks whether you trust the folder, because &lt;code&gt;.vscode&lt;/code&gt; tasks can run code too.&lt;/li&gt;
&lt;li&gt;Check packages without running them: &lt;code&gt;npm view &amp;lt;pkg&amp;gt;&lt;/code&gt; for metadata, &lt;code&gt;npm pack &amp;lt;pkg&amp;gt;&lt;/code&gt; to download the tarball and read it.&lt;/li&gt;
&lt;li&gt;If you really need to run it, use a throwaway VM or container with no wallets, no SSH keys, no browser logins and no cloud credentials. Delete &lt;code&gt;.npmrc&lt;/code&gt; first.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm install --ignore-scripts&lt;/code&gt; helps, but it won't stop a plugin that gets loaded from a config file at build time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you've already run something like this
&lt;/h2&gt;

&lt;p&gt;Don't panic, but act quickly and assume the machine is compromised:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take it off the network.&lt;/li&gt;
&lt;li&gt;Using a &lt;strong&gt;different, clean device&lt;/strong&gt;, move any crypto to a brand-new wallet, then change your passwords and rotate your SSH keys, GitHub tokens and cloud keys.&lt;/li&gt;
&lt;li&gt;Log out of active sessions everywhere that matters: Google, GitHub, exchanges and email.&lt;/li&gt;
&lt;li&gt;Scan the machine, or better, wipe and reinstall it.&lt;/li&gt;
&lt;li&gt;Report the npm packages to npm security, and the workspace and recruiter to Slack and LinkedIn.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Trust the weird feeling
&lt;/h2&gt;

&lt;p&gt;What saved me wasn't some clever security tool. It was the feeling that something was off, and twenty minutes of looking around before running anything.&lt;/p&gt;

&lt;p&gt;The code in these traps usually looks clean on purpose. The giveaways are everything around it: a company you can't find, employees who barely exist, no interview, and a password nobody should have shipped.&lt;/p&gt;

&lt;p&gt;A real employer will happily do a proper interview and won't mind you asking questions before you run their code. If someone's in a hurry for you to run it, that's your answer.&lt;/p&gt;

</description>
      <category>security</category>
      <category>career</category>
      <category>npm</category>
      <category>interview</category>
    </item>
  </channel>
</rss>
