Skip to content

BuildNot yet confirmed elsewhere1 publisher3 min readPublished

A dropper that runs on folder-open, and why your blocklist never sees it

A dropper committed straight into repos executes from .vscode/tasks.json the moment VS Code opens the project, and resolves its server from an Ethereum transaction. One sample sat five months.

The Engineer · Build desk

How we use AISend a correction

Photograph accompanying A dropper that runs on folder-open, and why your blocklist never sees it
Photo: security.ntt

What happened

  • A dropper is being committed straight into developer repositories and executes on dev-server start or when VS Code opens the folder, with no npm install involved.
  • The vector is a .vscode/tasks.json task set to runOn folderOpen, with hide, reveal never and echo false so nothing appears in the terminal panel.
  • Another sits in postcss.config.js, which reads as four lines of Tailwind config but carries 9,135 characters on line five behind padding.

Why it matters

  • constraint Install-time hygiene sits on the wrong side of this. Lockfile pinning, registry allowlists and dependency review are never consulted, because nothing is installed.
  • capability The operator can relocate all infrastructure with a single transaction that no defender can delete, which makes an IP blocklist accurate only until the next block.
  • exposure Exposure is not scoped to the project. Anything copied on the machine that opened the folder is in reach, including credentials for systems the repository never touches.
  • decision Teams that use folderOpen tasks for real now have to justify each one, because the grep that finds the dropper also finds their own automation.

The two hiding tricks are aimed at different readers. A file in `public/fonts/` is not opened by anyone reviewing a diff, and this one is not a font: it begins with 507 spaces where a real WOFF2 begins with the bytes `wOF2` [5]. The `postcss.config.js` is aimed at the person who does open the file. It renders as four correct lines of Tailwind plugin config and weighs 9,205 bytes, because line five runs 9,135 characters past the closing brace, mostly spaces, then payload [6]. That is about 99 percent of the file sitting off the right edge of an unwrapped pane [17]. Five months of dwell time on one sample [2], per the field guide published on dev.to, is what that buys.

Read the task flags rather than the label: `hide: true`, `reveal: never`, `echo: false`, and `runOn: folderOpen`, which is what makes the editor the trigger [3]. What it executes is `node ./public/fonts/fa-solid-400.woff2` [4]. A developer who never opens the folder in VS Code is not out of it either, because Next.js `require()`s the postcss config on every `next dev` and `next build` [7].

The loader carries no server address at all [8]. It reads the newest outbound transaction from a hardcoded wallet through Blockscout, then decodes the first eight bytes of the 20-byte destination address into a primary and a fallback IPv4 address [9]. Eight of twenty bytes used, twelve ignored [18]: there is room in that field for more than the operator currently needs. Cutting off one RPC provider does nothing, because the resolution falls through four of them [8]. And the stage-two fetch is plain HTTP pointed at port 443 [10], so an egress rule written around port numbers rather than protocols has nothing to object to.

The four suggested checks [14] have a sequencing problem worth naming. Grepping `.vscode/tasks.json` for `folderOpen` requires the clone to be on disk, which means fetch and inspect must happen before the editor is ever pointed at the directory. Once it has run, `spawn` with `detached: true` followed by `unref()` reparents the process to init, so it outlives the editor that started it [12]; quitting VS Code is not a remedy, and the `ps` check is the only one of the four that finds a live loader [14]. The wallet grep, including the history pass, catches this operator only, since deleting the file does not remove it from Git [16].

The observed payload polls the clipboard every 200 ms [13]. That is five reads a second, 18,000 an hour [19]. A token pasted once into a terminal on that machine is captured whether or not it has anything to do with the repository.

What to watch

  • Whether VS Code starts gating folderOpen tasks in freshly cloned or untrusted directories, given the feature is legitimate as shipped.
  • Whether the hardcoded wallet keeps publishing transactions, and whether Blockscout or the RPC providers act on reads pointed at it.
  • Whether the padded-line trick shows up in other config files that frameworks require at dev-server start.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence46
Adoption22
Hype gap+14
Incentives58
Confidence45
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    A dropper family is being committed directly into developer repositories; it does not require npm install, and runs when the dev server starts or when VS Code opens the folder.

    ReportedSupportedSource: dev.to field guide by avioflagosView cited source
  2. [2]

    One sample sat in a repository for five months before anyone noticed.

    ReportedSupportedSource: dev.to field guide by avioflagosView cited source
  3. [3]

    The committed .vscode/tasks.json defines a shell task labelled eslint-check with hide: true, presentation reveal: never and echo: false, and runOptions runOn: folderOpen, so VS Code executes it when the folder is opened.

    ReportedSupportedSource: dev.to field guide by avioflagosView cited source

Sources

1 independent publisher whose own reporting we read for this story.

  1. dev.to

    1 article · August 25, 2026

    Malware that runs the moment you open the project

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Topics

Entities

Loading related stories