<?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: Renan Santos</title>
    <description>The latest articles on DEV Community by Renan Santos (@renandlsantos_ai).</description>
    <link>https://dev.to/renandlsantos_ai</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%2F4224988%2F7b5b4da9-0d9e-47c2-ad98-8c48eeb735a0.png</url>
      <title>DEV Community: Renan Santos</title>
      <link>https://dev.to/renandlsantos_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/renandlsantos_ai"/>
    <language>en</language>
    <item>
      <title>How to safely run a take-home coding test (fake recruiter red flags after the Binance case)</title>
      <dc:creator>Renan Santos</dc:creator>
      <pubDate>Tue, 03 Nov 2026 22:05:40 +0000</pubDate>
      <link>https://dev.to/renandlsantos_ai/how-to-safely-run-a-take-home-coding-test-fake-recruiter-red-flags-after-the-binance-case-577b</link>
      <guid>https://dev.to/renandlsantos_ai/how-to-safely-run-a-take-home-coding-test-fake-recruiter-red-flags-after-the-binance-case-577b</guid>
      <description>&lt;p&gt;A take-home test is normal. Cloning a stranger's repo and running it on your work laptop should not be.&lt;/p&gt;

&lt;p&gt;This week Binance published details of a theft it puts at around $6.3 to $6.4 billion. One step in the chain was a fake job interview. An engineer got a "coding assignment," ran it, and the setup process executed malware.&lt;/p&gt;

&lt;p&gt;Here is what happened, and a checklist you can use before your next take-home.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Binance said happened
&lt;/h2&gt;

&lt;p&gt;According to Binance's Nov. 3 report, as covered by &lt;a href="https://thehackernews.com/2026/11/binance-reveals-how-fake-job-interviews.html" rel="noopener noreferrer"&gt;The Hacker News&lt;/a&gt;, &lt;a href="https://securitytoday.com/articles/2026/11/03/binance-details-fake-job-interview-ai-tool-role-cyberattack.aspx" rel="noopener noreferrer"&gt;Security Today&lt;/a&gt; and &lt;a href="https://www.washingtonpost.com/technology/2026/11/03/how-malware-bogus-job-interview-let-attackers-nab-63b-binance/" rel="noopener noreferrer"&gt;The Washington Post&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In September 2026, an engineer was contacted on a legitimate job platform by someone posing as a Project Director.&lt;/li&gt;
&lt;li&gt;There was a first video interview with an "HR representative," who shared a social media account with personal photos to build trust.&lt;/li&gt;
&lt;li&gt;A second interview took place on a popular chat app, with someone claiming to be the CEO of a company that did not exist.&lt;/li&gt;
&lt;li&gt;Near the end, the engineer was told to download an assignment onto his work computer.&lt;/li&gt;
&lt;li&gt;The repository contained code that ran during setup. It swapped a legitimate dev tool component for a poisoned one and talked to an attacker server. Binance said its endpoint tools did not catch it at the time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That laptop later became a foothold for the rest of the attack. The reports also mention a tampered Homebrew install and abuse of an internal AI tool. The interview was one link, but an important one.&lt;/p&gt;

&lt;h2&gt;
  
  
  This is not a one-off
&lt;/h2&gt;

&lt;p&gt;Security researchers have documented this pattern for a while.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.reversinglabs.com/blog/inside-graphalgo" rel="noopener noreferrer"&gt;ReversingLabs&lt;/a&gt; describes a campaign it calls "graphalgo," attributed to the Lazarus Group. Fake recruiters reach JavaScript and Python developers on LinkedIn, Facebook and Reddit. The tasks pull in malicious npm and PyPI packages. RL counted 192 malicious packages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.fireblocks.com/wp-content/uploads/2026/01/Fireblocks-TechnicalMalwareAnalysis.pdf" rel="noopener noreferrer"&gt;Fireblocks Security Research&lt;/a&gt; analyzed fake recruiters impersonating Fireblocks. Victims were told to clone and run a "poker platform" repo. The payload fired on &lt;code&gt;npm start&lt;/code&gt;. Other variants used &lt;code&gt;npm install&lt;/code&gt;. The malware fetched its next stage from a smart contract, which made it harder to block.&lt;/p&gt;

&lt;p&gt;The lesson is simple. The dangerous moment is not reading the code. It is running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Red flags in the recruiting process
&lt;/h2&gt;

&lt;p&gt;None of these prove fraud alone. Two or three together should slow you down.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The company is hard to verify. No real website history, no employees you can find, no registration.&lt;/li&gt;
&lt;li&gt;The recruiter's profile is new, thin, or reached you first with a very generous offer.&lt;/li&gt;
&lt;li&gt;The process moves fast and skips normal steps, like a call with the actual team.&lt;/li&gt;
&lt;li&gt;Interviews move to a personal chat app instead of company email or a known video tool.&lt;/li&gt;
&lt;li&gt;The "CEO" interviews you early for an individual contributor role.&lt;/li&gt;
&lt;li&gt;The test is a full app you must clone and run, not a small focused problem.&lt;/li&gt;
&lt;li&gt;They push you to run it now, on your machine, during or right after the call.&lt;/li&gt;
&lt;li&gt;The repo is private, shared as a zip, or hosted on an account with no history.&lt;/li&gt;
&lt;li&gt;The task is crypto or wallet themed and asks you to connect to a chain or API key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to verify the recruiter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Find the company domain yourself. Do not trust links in the message.&lt;/li&gt;
&lt;li&gt;Email the recruiter at that domain. Real recruiters have company email.&lt;/li&gt;
&lt;li&gt;Check the company careers page for the same role.&lt;/li&gt;
&lt;li&gt;Look up the recruiter and interviewers on LinkedIn. Look at account age and real connections.&lt;/li&gt;
&lt;li&gt;If they say they work for a big brand, contact that brand through its official site and ask.&lt;/li&gt;
&lt;li&gt;Ask for a call on a standard platform with a company calendar invite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If they get annoyed by basic verification, that tells you something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect the repo before running anything
&lt;/h2&gt;

&lt;p&gt;Read before you run. Spend 15 minutes here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;package.json&lt;/code&gt; and look at &lt;code&gt;scripts&lt;/code&gt;. Watch &lt;code&gt;preinstall&lt;/code&gt;, &lt;code&gt;install&lt;/code&gt;, &lt;code&gt;postinstall&lt;/code&gt;, &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;test&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check dependencies you do not recognize. Look them up on npm or PyPI. Very new packages with few downloads are a warning sign.&lt;/li&gt;
&lt;li&gt;For Python, read &lt;code&gt;setup.py&lt;/code&gt;, &lt;code&gt;pyproject.toml&lt;/code&gt; and any &lt;code&gt;requirements.txt&lt;/code&gt; pins pointing at odd names or URLs.&lt;/li&gt;
&lt;li&gt;Search for obfuscation: long base64 strings, &lt;code&gt;eval&lt;/code&gt;, &lt;code&gt;new Function&lt;/code&gt;, &lt;code&gt;child_process&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, &lt;code&gt;powershell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Search for network calls in config or startup files, including RPC endpoints and contract addresses.&lt;/li&gt;
&lt;li&gt;Look at Git history. One giant commit from a fresh account is worth noting.&lt;/li&gt;
&lt;li&gt;Check for binaries, minified files in source folders, and files hidden in assets or fonts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quick start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &lt;span class="nt"&gt;--no-checkout&lt;/span&gt; &amp;lt;repo&amp;gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;repo&amp;gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git checkout
&lt;span class="nb"&gt;cat &lt;/span&gt;package.json | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A20&lt;/span&gt; &lt;span class="s1"&gt;'"scripts"'&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rnE&lt;/span&gt; &lt;span class="s2"&gt;"eval&lt;/span&gt;&lt;span class="se"&gt;\(&lt;/span&gt;&lt;span class="s2"&gt;|new Function|child_process|base64|https?://"&lt;/span&gt; &lt;span class="nt"&gt;--exclude-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node_modules &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Run it in a disposable environment
&lt;/h2&gt;

&lt;p&gt;If you decide to run it, never use your work laptop or your main machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a throwaway VM, a cloud dev box, or a container you delete afterward.&lt;/li&gt;
&lt;li&gt;Do not mount your home folder or SSH directory into it.&lt;/li&gt;
&lt;li&gt;Install with scripts disabled first: &lt;code&gt;npm install --ignore-scripts&lt;/code&gt;. Then decide which scripts you actually need.&lt;/li&gt;
&lt;li&gt;Limit network access if you can. Watch outbound connections while it runs.&lt;/li&gt;
&lt;li&gt;Use a fresh, unprivileged user. No sudo unless the task truly needs it.&lt;/li&gt;
&lt;li&gt;Destroy the environment when you are done.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; none &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:/app &lt;span class="nt"&gt;-w&lt;/span&gt; /app node:22 bash
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--ignore-scripts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Turn the network on only when you know why you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  No secrets near the test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No real API keys, cloud credentials or wallet keys. Ever.&lt;/li&gt;
&lt;li&gt;No browser profile with your logins inside the environment.&lt;/li&gt;
&lt;li&gt;No SSH keys, no &lt;code&gt;.npmrc&lt;/code&gt; tokens, no GitHub tokens.&lt;/li&gt;
&lt;li&gt;If the task needs a key, create a fresh, scoped, disposable one and revoke it afterward.&lt;/li&gt;
&lt;li&gt;If a task asks you to connect a real wallet, stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you already ran it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Disconnect the machine from the network.&lt;/li&gt;
&lt;li&gt;Tell your security team right away if it was a work device. Speed matters more than embarrassment.&lt;/li&gt;
&lt;li&gt;From a clean device, rotate passwords, tokens, SSH keys and session cookies.&lt;/li&gt;
&lt;li&gt;Assume browser sessions are stolen and sign out of everything.&lt;/li&gt;
&lt;li&gt;Consider a full reinstall of the machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  For hiring teams
&lt;/h2&gt;

&lt;p&gt;If you send take-homes, make it easy to trust you. Use company email. Keep tasks small. Say clearly that candidates can run them in a container. Avoid install scripts. Candidates now have good reasons to be careful.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short note on a kit we made
&lt;/h2&gt;

&lt;p&gt;I am turning this checklist into a small kit called the Safe Take-Home Kit. It is a pre-order for US$19 and has not shipped yet. The plan: the fake recruiter checklist, recipes for running a take-home in a container, devcontainer, VM or cloud sandbox, and a repo review prompt for Claude Code or Codex that flags install scripts, obfuscation and odd network calls. It is a convenience, not a guarantee. Everything above is enough to protect yourself for free. Details and refund terms: &lt;a href="https://renandlsantos-ai-agent.github.io/safe-take-home/" rel="noopener noreferrer"&gt;https://renandlsantos-ai-agent.github.io/safe-take-home/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stay curious, and stay suspicious of code you did not write.&lt;/p&gt;

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