The Ghost in the Marketplace

The Ghost in the Marketplace

During routine scanning of new Open VSX submissions on March 20, we noticed an unusual spike in the volume of extensions entering our pipeline. A closer look at the data revealed 174 new publishers had appeared within hours of each other, all backed by recently created GitHub accounts. The extensions themselves appear clean, but the infrastructure behind them points to a coordinated campaign preparing for a future delivery phase.

The Surge

All 174 GitHub accounts were created on March 11, 2026, in a five-hour window between ~09:57 UTC and ~14:59 UTC, at a rate of roughly one account every 100 seconds. Nine days later, on March 20, those accounts began publishing extensions to Open VSX in a second burst from ~17:43 UTC to ~22:17 UTC.

Every account shares the same profile:

  • Created exactly 9 days before its first upload.
  • At most one public repository. No commit history, no issues, no stars.
  • No prior activity of any kind: no followers, no contributions, no indication of a real developer.

We refer to these as “ghost” accounts throughout this report.

Naming and Identity Patterns

The publishers use two distinct naming conventions across two layers of identity.

The Open VSX namespaces (the publisher names visible on the registry) are a mix of Slavic-sounding names with digit strings (olgakuznetsova717, sorokinanatalya234, firsovaoksana320) and randomized gibberish (oyoqenej151, nogiveputu258, u7ctm4z2xn). The GitHub accounts behind them follow a completely separate convention: auto-generated compound English words like FlameToneSheave, MagicStarfishBoost, and LairLightningDerrick.

The use of two separate name generators suggests programmatic account creation with different tooling for the public-facing namespace and the backing GitHub identity. The 9-day gap between account creation and publishing also appears intentional, creating enough separation to avoid simple heuristics that flag accounts publishing on the same day they were created.

The Staging Ground

Our manual analysis and deobfuscation efforts have not uncovered explicitly malicious behavior in any of the published extensions.

This is consistent with infrastructure pre-positioning, a well-documented precursor to malware distribution. By publishing a large volume of clean extensions, the threat actor allows them to age in the marketplace and accumulate downloads, building a “trust” profile that bypasses basic security checks. When a malicious update eventually ships, 174 extensions with established download histories are harder to flag than fresh ones.

The extension names are also worth noting. Many clone popular developer tools: isort, bash-debug, git-graph, php-namespace-resolver. By flooding the registry with lookalikes, the threat actor increases the chance that a developer installs a counterfeit version. The targeted categories (linting, debugging, visualization, language support) are tools that typically require elevated permissions within the IDE, making them effective vectors for a future malicious payload.

A Broader Pattern

The Open VSX ecosystem has been under sustained pressure from multiple directions.

One week before the GhostDrop publishing wave, we disclosed PackRAT, a separate campaign that abused the extensionPack field in package.json to chain benign-looking “distribution” extensions to malicious payloads. PackRAT accumulated nearly 100,000 downloads through indirection rather than volume.

In December, our analysis of RustImplant documented attackers using compiled Rust binaries with anti-analysis guardrails to hide malicious logic inside native Node.js addons.

Three campaigns, three different approaches:

  • RustImplant: quality of obfuscation (compiled binary, geofencing, encrypted config)
  • PackRAT: indirection (clean extensions funneling installs to malicious ones)
  • GhostDrop: quantity of entry points (174 staged accounts, trust farming at scale)

Attackers are diversifying their supply chain tactics. Defenders looking for only one pattern will miss the others.

Conclusion & Remediation

This campaign underscores the need for marketplaces to integrate meaningful account verification. 174 accounts were created in a single afternoon, sat dormant for nine days, and then published extensions to a global registry without triggering any flags.

The absence of an immediate payload does not mean the absence of a threat. We recommend checking your internal developer environments for extensions published by the accounts listed at the end of this report. Disable automatic updates for extensions that are not from verified publishers. Monitor for suspicious behaviors common to malicious extensions: unusual network traffic, unauthorized credential access, and persistence mechanisms. Regular validation of detection rules and proactive threat hunting can help catch variants that evolve beyond known indicators.

The dev-guard extension, built and maintained by the Yeeth Security team, adds another layer of protection for VS Code and Cursor AI users. By continuously monitoring new campaigns and pushing live updates, dev-guard helps shut down these threats before they spread across the developer community.

We will continue to monitor these ghost accounts for the moment they decide to wake up.


Indicators of Compromise (IOCs)

Open VSX Extensions

  • wilderdanehy.cloudformation-yaml-snippets
  • zolotarevaviktoriya044.output-colorizer
  • kravtsovae88.cody-testing
  • romaskevich4.veriloghdl
  • matushevskayao0.php-namespace-resolver
  • deandreavrich.kcl-language-server
  • elenaskorik590.snowflake-vsc
  • faixmercedezmcpnnt3i.laravel-extra-intellisense
  • seltzroxieo2t64lsk.kylin-cpp-pack
  • carluccimerriezyiwg9.bash-debug
  • firsovaoksana320.texlab
  • sytnike910.vscode-peacock
  • koshkarevay998.code-for-ibmi
  • chekalovaolga30.cline-nightly
  • goncharovatatyana828.builtin-notebook-renderers
  • tchebotareva613.extension-editing
  • enemanezhina91.kimi-code
  • kovtunnataliya87.text-power-tools
  • innadudar23.godot-tools
  • okishtanova034.vscode-altimate-mcp-server
  • irinakrupnik40.pochi
  • kopaevaanna739.vscode-conventional-commits
  • oksanakurinnaya39.sheetjs-demo
  • sorokinanatalya234.git-blame
  • alenaletuta06.vscode-test-explorer
  • el702791.salesforcedx-vscode-core
  • yanag748.calva
  • yetevipe056.kylin-clangd
  • ahoxepow64.vscode-azurefunctions
  • oyoqenej151.salesforcedx-vscode-apex-testing
  • xemekicariv881.salesforcedx-vscode-expanded
  • romosumo659.microsoft-authentication
  • qehiyesubame27.vscode-npm-dependency
  • cheresovasvetlana58.tldraw-vscode
  • walosivarom079.git-ui
  • aleksandrafisyurenko65.whycode
  • olgakotovich91.markdown-preview-github-styles
  • vyshinskayatatyana38.hardhat-solidity
  • mboncheva64.xasnippets
  • dubitskayaa5.vscord
  • egraf829.gitpod-monitor
  • elenamarych83.vscode-bazel
  • burovan514.i18n-ally
  • svetlanachevychelova5.devdb
  • tkorotchenko76.vscode-mermaid-chart
  • evgeniyaalekseeva988.jinja
  • oksanalevko882.markdown-language-features
  • etamohoxisay72.gulp
  • wakelokul066.vscode-boot-dev-pack
  • ykiseleva077.vscode-wakatime
  • yuliyakotova472.jake
  • gorobetselena52.grunt
  • savchenkoyuliya752.debug-auto-launch
  • nemufiwozego92.cursorless
  • xuxiqigomom401.vetur
  • brazhenkomariya320.css-language-features
  • vohohonozas00.roo-code-nightly
  • ofotolazez988.console-ninja
  • logacehefo39.catppuccin-vsc-icons
  • hiviheyodu35.bloc
  • akuwikam872.merge-conflict
  • rumatiju04.vscode-language-pack-de
  • sunevaelena43.nix-ide
  • viktoriyaadam937.vscode-openapi
  • yufotole71.snyk-vulnerability-scanner
  • vrogach954.media-preview
  • yuliyalolenko89.coderoad
  • yuliyagrisenko81.file-bunny
  • gerasimenkoandriana656.vscode-azureresourcegroups
  • edrobot46.vscode-versionlens
  • oliynik102.colab
  • markaryanevgeniya19.excalidraw-editor
  • sheleverelena383.vscode-graphql
  • alinaogolenko35.cdt-gdb-vscode
  • semenovichyuliya195.vscode-neovim
  • davtyank791.git-graph
  • otitenko854.pdf
  • jewellmccullin2327975.isort
  • u7ctm4z2xn.malloy-vscode
  • samaraxlauridsenrqy3.tongyi-lingma
  • yuliyabogomolova342.markdown-mermaid
  • elizavetayakovleva57.salesforcedx-vscode-visualforce
  • olgamelnichuk813.astro-vscode
  • dittacathernbe.vscode-stylelint
  • hodellkendaf.coding-copilot
  • nogiveputu258.configuration-editing
  • raspopinad31.gemini-coder
  • chinellbrinton.coderabbit-vscode
  • ikhalyavka18.cmake
  • vtkachenko437.salesforcedx-vscode-lightning
  • smithymardis.vscode-deno
  • rikkestatham8960153.vscode-duplicate
  • keeshaarnhold5nzbf.salesforcedx-vscode-apex
  • albertinejunghans31jtv.oxc-vscode
  • francoisebunk2cg85m.ocaml-platform
  • larisamironenko787.metals
  • irinadatsyuk07.superblocks
  • khlevnyukn54.kotlin
  • tatyanakrasnokutskaya913.vscode-postfix-ts
  • karinadubovichenko53.kylin-cpp-pack
  • yistomina690.code-for-ibmi
  • ttnchalaya.kcl-language-server
  • daryashcherbatyuk42.cloudformation-yaml-snippets
  • olesyatulainova797.cody-testing
  • sadlerzakai.laravel-extra-intellisense
  • geleteytatyana48.sheetjs-demo
  • innadenisenko153.snowflake-vsc
  • merrylfrock3093725.veriloghdl
  • bystrikovao52.vscode-peacock
  • luzschnettler6675543.output-colorizer
  • alinabondarevich50.texlab
  • is4704153.text-power-tools
  • yuliyasylenko81.bash-debug
  • ovchinnikovairina691.cline-nightly
  • nataliyasuprunenko14.php-namespace-resolver
  • tmatsiychuk724.builtin-notebook-renderers
  • allagrokholskaya21.vscode-altimate-mcp-server
  • yuliyachaykovskaya17.kimi-code
  • tkhilko21.git-blame
  • tfostik895.pochi
  • krivoshey302.vscode-conventional-commits
  • ubiyabihowiy99.calva
  • utiwoziyus462.extension-editing
  • cathrinegomm6798038.vscode-test-explorer
  • lysenkotatyana525.vscode-npm-dependency
  • vefimenko167.salesforcedx-vscode-core
  • alekseenkonatalya844.whycode
  • igordienko495.godot-tools
  • cherkast9.vscode-azurefunctions
  • bashkatovam4.gulp
  • tklienko82.kylin-clangd
  • vasilevalyudmila252.tldraw-vscode
  • volodinan750.salesforcedx-vscode-apex-testing
  • mskubenich698.vscord
  • olgakuznetsova717.microsoft-authentication
  • khrushcheval758.hardhat-solidity
  • rochellshivy1357619.git-ui
  • shayastarita4322082.salesforcedx-vscode-expanded
  • ungurovayuliya53.devdb
  • ynikolaeva519.vscode-bazel
  • jasongyfbxangfd.markdown-language-features
  • xhriswarmack.i18n-ally
  • charleskoavpmjske.gitpod-monitor
  • anthonydlrpnlsaog.vscode-wakatime
  • josephfwflqsgala.markdown-preview-github-styles
  • ekaterinachayka34.jinja
  • mikhovay82.xasnippets
  • goncharovanatalya842.vscode-mermaid-chart
  • oksanapolyashchenko90.grunt
  • andrusenkooksana458.jake
  • nsinyuk51.css-language-features
  • idixajakah88.roo-code-nightly
  • valerygravitz6410310.vetur
  • anastasiyakomyurdzhu36.debug-auto-launch
  • abramovat831.merge-conflict
  • fitsaya902.cursorless
  • tatyanakravchuk15.console-ninja
  • glynisblaum5916422.vscode-language-pack-de
  • rosalynvanaprasert2852089.catppuccin-vsc-icons
  • angovelondaudpq6puy.nix-ide
  • ruschakvernellvz7gdzd.colab
  • landhamjennine580lavrp.file-bunny
  • tavissandah15vp9ok.media-preview
  • biscardileo3sq1uto.bloc
  • anastasiyao673.excalidraw-editor
  • ekaterinapolishchuk24.vscode-graphql
  • sinyushkoanna636.coderoad
  • melifonda7.vscode-neovim
  • evarejagiy510.vscode-azureresourcegroups
  • ibowitihugo32.snyk-vulnerability-scanner
  • wogopehuzis356.vscode-openapi
  • uniximayegu511.cdt-gdb-vscode
  • etuqubidij861.pdf
  • kotohitesu21.git-graph

Publisher

  • sparkfinderoven
  • coalrectorstrike
  • LengthColonel
  • Axisfrommall
  • nightwayvibrate
  • RadianLayer41
  • orangevoinULTRA
  • mistchandlergazebo
  • AgentTestingClamp
  • CooperUncouple
  • JaguarPillage
  • PlasmaButterfly
  • guardtrailclip
  • ShareSwordsmanRuin
  • SoapmakerRepresent
  • zeptostagetrap88
  • Passiondershout
  • Topclicondense
  • freestageline90
  • dendonormind
  • FenceBoulderHeal
  • LairLightningDerrick
  • LacquerPharaohCover
  • paintairsever
  • OctagonWoodpecker
  • Tameoltreasure34
  • gigafiremanwhisper
  • Crystalograb
  • Fieldterruffle
  • Legionkyomanacle
  • nick48459
  • FuseScorpionBeam
  • Cruelshuillustrate
  • KnitCockatooKey
  • retrocenterspark24
  • TestingRadial
  • Plateeocondense
  • weldscreenagora73
  • MockingbirdTrail
  • Frostruturbine
  • victorsenatorbear59
  • MartinUpgrade
  • rockexecutivesee
  • Fjordshejack
  • ConsciousnessBrawler
  • Splitflucover93
  • ceilingmedicunveil
  • MagentaJaguar
  • Dimensionparail
  • NestMeadowlark
  • RollerRemember
  • FiendJackdawSilo
  • SentryNodePartition
  • ChipSpiderWarm
  • InnerPrawn98
  • Ultimatedenpruner
  • SheenEmpress
  • pondhelpplain
  • femtopremiertag
  • Holddrespell
  • MagicStarfishBoost
  • timenavigatorrage
  • Gravityaespot
  • freewaychameleonnode
  • mythicnoteshed
  • Signonrecall
  • Winnershitram
  • centiofficermultiply
  • centerbytemanage
  • BanSailmakerDitch
  • zenithbaseshadow
  • bansheegiraffecode
  • HelperMenhir
  • Pennantpholeap
  • HemomancerRepair
  • PrefectFlourish22
  • Quakedudone94
  • MoonWeaponsmith
  • RestraintSound
  • macrohelpclippers
  • lavendertalesun
  • StreetTsuchikage
  • DesertYULIA232
  • OhmWhaleIncrease
  • BayHorseFurnace
  • slayerassassinjack
  • FlameToneSheave
  • PulverizeDirector
  • BanMartinCode
  • CometBureaucratEquip
  • BitExpertMarket
  • FountainStorkLoop
  • DensityFletcher
  • novabaronlast
  • freewaylinksnap
  • ScarletLarkConverter
  • CableAdmiralContinue
  • ChamberTeller
  • peakchieftomb
  • romchemistremain
  • NexusRainMode
  • Webacrossnail
  • SolarZoneRejuvenate
  • Masterkrasculpt
  • Toothoiwarm33
  • mergegumshoerafter73
  • Scarletlunavault
  • DensityLobsterHoe
  • hypercounselorgrade
  • Radiustensocket
  • Needleeroven
  • BasinMerchantMold
  • Typhoonofrejuvenate
  • ScarletShipperWire
  • xxfinder071
  • Ally83741
  • BattalionFencer13
  • ScorpionTomb
  • FloorWarriorPush
  • torrentlakeflash
  • DownloadData
  • naturewidowplunder
  • HideGrenadierExalt
  • Joinpiboiler61
  • Crushbeyondlight
  • wingpupachannel92
  • HertzCockatoo
  • ShogunPortalShackle
  • Tempestbroboutique51
  • Aquamcpincers
  • PhotonWeaverCrush
  • Facetzichange
  • PatchTradesman59
  • QuarkScholarAmp
  • Constrainterboil49
  • ProviderCorridor31
  • LayerHeadBorder
  • RatDisconnect
  • BrightCentipede
  • UniteSenator
  • StarfishJudge
  • WishFlamingo
  • RedGumshoeEmbody
  • GladiatorBoutique14
  • CycloneJonin
  • Loopdestrowel18
  • streetbuntingveil
  • fieldabjurerline
  • MortarBoatwright
  • BorderConjurerDenote
  • HeronFlash25
  • ViceroyBorder
  • skycommercialstage
  • PlankEchoDash
  • NatureRunner
  • MediatorSpeed
  • devilmooseobelisk25
  • LawyerLightning
  • ModernShinobi
  • GravityWeaver
  • ShinobiVitalize
  • SoundRecapture
  • galelieutenantglow
  • KnotCarpenter
  • wallarmorerbar
  • royalversegive
  • Kilophodoor76
  • BuilderBazaar
  • Awarenesstohum
  • Degreetreappraise44
  • BeigeCheetahSheave
  • ColonyBailiff9
  • Flintpatouch
  • SonicTortoiseCool