Manifold's coverage has expanded to AI in the browser.Find out more
A circus poster headed “Evil twins — guess the evil one”, showing two identical robots side by side on a stage

77 "evil twin" Open VSX extensions: 19 copy private repo and CI data to a new domain

Aug 4, 202612 Min

TL;DR

  • 77 counterfeit extensions hit Open VSX in a week, each copying a real VS Code Marketplace extension's name and namespace from a pseudonymous account, all beaconing to a domain registered eleven days earlier. Nineteen carry a full reconnaissance payload; the rest send little more than a hostname.
  • Those nineteen profile an organisation, not a machine: git remote host and org, commit email domain, workspace path, branch, HEAD commit, CI project identifiers. On a build runner, that is the private repository path outright.
  • The listings called it "Telemetry" and got one thing wrong. They said CI values never leave the machine. The code sends them.
  • Name resolution is now automated. Agents, devcontainer configs and provisioning scripts install by name across two registries with separate ownership rules, and a squatted name on one is indistinguishable from the real one on the other.
  • Anthropic's July 30 disclosure showed a name is all it takes. One of its models published a PyPI package under a name that existed only in a fictional document; fifteen real systems executed it within the hour.
  • Check what your fleet actually installed, not just what your configs request. Full list with VSIX hashes below.

Every one impersonated a real extension. The listings framed the collection as "telemetry." Nineteen sent more than they disclosed: your git and CI identity.

Between July 26 and August 1, 2026, our monitoring systems identified 77 Open VSX extensions that beacon to the same newly registered domain. Each one republishes the name, namespace and description of a real VS Code Marketplace extension at a low version number, almost always 0.0.1, under an account that does not own the namespace and does not belong to the original author [example 1, example 2, example 3].

The bundled extension.js is swapped for a beacon. In most of the packages it sends little more than the machine's hostname. In nineteen of them it sends a detailed description of the machine, the repository open in the editor, and the CI system the editor is running inside. The Open VSX listings described this under a section headed “Telemetry.”

As of August 3, 2026, these packages have been removed from Open VSX. However, the infrastructure they contact is still up.

Two payloads, one campaign

The 77 samples are not identical, and it is more useful to think of them as a capability spectrum than as two clean families. Data breadth and delivery resilience vary independently across the set. But they fall into two rough groups.

Fifty-eight are lightweight. Between roughly 1.6 and 3.3 KB, sending the hostname and sometimes the workspace folder name or editor version, along with a per-package tracking identifier. Delivery varies: some POST to /api/v1/metrics or /api/v1/events, some use a GET query string, some carry the full multi-endpoint failover logic described below. What stays constant is that the data collected is minimal. This is the bulk of the campaign.

Nineteen are reconnaissance payloads. Around 10 KB, and considerably more thorough. Four to five seconds after activation one of these assembles a single request containing the local hostname and OS username, the editor's name, version, host kind and machine ID, the platform and architecture, the locale and timezone, and the open workspace's folder name and full filesystem path.

Then it reads .git. From config it takes the remote URLs for origin and upstream and reduces each to host plus organisation, and it takes the domain portion of the configured commit email. From HEAD and the ref files it takes the current branch and the HEAD commit SHA. It enumerates up to sixty installed extension IDs and picks up the proxy hostname from the environment. From the CI environment it takes two things: the names of any CI markers present, and separately the values of GITHUB_REPOSITORY, CI_PROJECT_PATH, the Azure DevOps collection URI, the Buildkite organisation slug, the CircleCI project username, the Codespace name and the Gitpod workspace context URL. On a build runner or a cloud development environment, that is the full private repository name, not just the organisation.

It also reads the editor's own telemetry opt-out setting, records whether it is enabled, and sends regardless.

Above: ciIdentity() function within extension.js collecting CI identity data

The names give some sense of who was in scope.

The lightweight majority is a long tail across almost every stack and skill level: Amiga debugging, LEGO EV3 MicroPython, Minecraft JSON schemas, Vim cheatsheets, editor themes, Perl, CoffeeLint, Hugo, WordPress.

That spread looks like names harvested in bulk rather than targets chosen. The reconnaissance nineteen skew differently, toward tooling used by developers working inside organisations: blockchain protocol extensions for IOTA, Move and Obyte, enterprise platform tooling for Salesforce Marketing Cloud, ApexSQL and ConfigCat, an aerospace and automotive bus protocol in UAVCAN DSDL, and a US federal agency namespace.

Nineteen is a small sample and several of them are neutral, so we would call that a skew rather than a strategy. But it points the wider payload at the environments where git and CI identity is worth something. The squatted namespaces across the whole set include AMD, Artsy, LEGO Education, Hyperledger, Azure, IOTA, Salesforce OSS, a .gov agency (“ssagov”), and marketplace.visualstudio, which impersonates the marketplace itself.

The disclosure is the disguise

The interesting part is not the collection. It is how thoroughly the collection is documented, and where the documentation stops being accurate.

Above: Notice the ‘telemetry’ section on the extension’s readme webpage

The Open VSX listings for the recon variant carried a Telemetry section that enumerated most of those fields correctly, hostname and username and workspace path and git organisation and email domain and branch and commit included. It then volunteered a set of reassurances: no source code, no credentials, no tokens, no SSH material, no browser data, no arbitrary environment variables, nothing modified on the machine. Those hold up. We checked them against the code.

One claim does not. The listing describes the CI data as an indicator carrying the names of known CI markers only, never values. The code sends both. Alongside the marker names it sends a second field containing the CI identity values listed above, which is to say the private repository path of whatever project the extension is running inside. The single most sensitive field in the payload is the one the disclosure says is not being sent.

The listing is also silent on three things the code does. It reports whether the open workspace's own configuration files are what pulled the extension in. It reads the editor's telemetry preference. And if its endpoints stop answering, it looks up a DNS TXT record to find a replacement one.

The source comments carry the same reassuring register, and mostly hold up: only .git/config and .git/HEAD are read and never working-tree files, credentials are stripped from repository URLs before transmission, only the domain portion of the git email is kept. One comment is wrong in the two-endpoint samples, describing the endpoints as sitting on different registered domains when they are two subdomains of the same one.

What none of the listings say is that the extensions do nothing else. There is no feature. A status bar item renders a checkmark and the extension's name, one command shows a message box saying it is active, and the beacon fires. The word "telemetry" is doing the work that a functioning extension would normally do, which is to explain why the code is running at all.

Some of the samples go further and describe themselves in comments as a security-research placeholder. We would treat that description the same way we treat the rest of the documentation: as text the author chose to put in front of a reviewer. It sits inside a package that impersonates somebody else's extension, was published from a throwaway account, and misstates its own most sensitive field.

We are not going to guess at intent. The design reads like someone who expected to be reviewed, and the minimisation in places is real: credentials stripped, email reduced to a domain, an environment whitelist rather than a dump. Someone who removes credentials from a git URL understands data sensitivity precisely.

Which is what makes the gap difficult to read charitably. Consent is the only thing separating disclosed telemetry from collection, and consent here rests on a listing that names a tool the package is not, published from an account with no identity attached to it, describing a field set that is not what actually leaves the machine. Nobody agreed to any of this, and the person who installed it could not have agreed on behalf of their employer's private repositories, their colleagues, or the CI system it ran inside. The extensions behave the same on those machines whatever the author meant by them.

The infrastructure is built to outlive the packages

mangorbit[.]com was registered on July 15, 2026, eleven days before the first of these packages appeared, through a registrar that redacts registrant details. The apex serves a generic landing page. The registration runs to 2029, a three-year term. The collector subdomains answer requests with “ok”, which is enough to confirm a live server acknowledging input rather than a parked record.

Above: Mangorbit subdomains responsive at the time of writing

Most samples use pulse.mangorbit[.]com and pulse2.mangorbit[.]com. One uses api.mangorbit[.]com, and one uses a randomised subdomain under cb.mangorbit[.]com. A subset also carry a third endpoint on a second registered domain, hardcoded in the same endpoint array and carrying the same per-package tracking identifier, used purely as a failover. We are not naming it here. It ties to the campaign only through shared infrastructure, and a domain name is not a basis on which to identify anyone.

Above: mangorbit[.]com endpoints within extension.js in one sample

Three details suggest an operator planning for interference rather than running a one-shot experiment.

The retry schedule is patient. In the recon variant, attempts come at roughly fifteen minutes, fifty minutes and three and a half hours, then every seven or eight hours, resuming on every editor restart and giving up only after seven days. A machine that is offline, firewalled, or behind a proxy that drops the first request gets asked again for a week.

The endpoint list is redundant, and the code treats any HTTP response at all as success, including an error status. It is not waiting for a payload. It only needs the request to have arrived.

And if every endpoint fails, the collector queries the DNS TXT record at _beacon.<domain> for a published replacement base URL. That is a takedown contingency. It lets the operator move collection infrastructure after the fact, over a channel that most egress filtering does not inspect, without shipping a new version of anything.

One more field deserves attention. The recon variant checks whether the open workspace's own devcontainer.json or .vscode/extensions.json references the extension's ID, and reports the answer as a single flag. In plain terms, it distinguishes installs that a repository's configuration caused from installs a human chose. That is the field you would want if the question you were asking was how am I being pulled in, and by what.

Name resolution is now an automated step

None of this is specific to Open VSX, and it would be wrong to read it that way. Neither registry is immune. Last month we published a counterfeit of Markdown All in One sitting on Microsoft's own VS Code Marketplace, beaconing the machine's username and hostname to a hardcoded IP over cleartext HTTP and pulling a remote file to disk with no user interaction required. Microsoft removed it within an hour of us reporting it, and a near-identical counterfeit surfaced under a new publisher identity shortly afterwards.

Both marketplaces are legitimate sources of legitimate packages, and plenty of genuine projects publish to both. That is exactly what makes the gap between them usable. They are separate namespaces with separate ownership and verification rules, so a name that is unambiguously owned on one registry can be sitting unclaimed on the other, and a package resolved by name alone cannot tell you which one you got.

In 2025, security researcher Michael Bocanegra described this class of attack as "extension confusion" after finding lookalike Solidity extensions on Open VSX, drawing the analogy to dependency confusion. The analogy holds, and it is worth being precise about why. Dependency confusion is a resolution failure: a resolver prefers a public source over a private one and returns the wrong package for a name that was never ambiguous to the human who wrote it down. Lookalike publisher names are impersonation, which relies on a person misreading. What is happening here sits closer to the former, because the entity resolving the name increasingly is not a person at all.

Until recently that mattered less, because a human read a marketplace page, noticed the install count, and moved on. That decision is now increasingly made by software. An agent asked to set up a Ruby project, add IOTA Move support, or wire up a task runner will resolve a plausible extension name and install it. Devcontainer configs do the same on every container build, and provisioning scripts do it on every image bake. None of those steps look at download counts, publisher verification badges, or repository lineage. An agent working from a model's recollection of tooling names is quite capable of asking for something that only exists because someone squatted it, and confident enough about the name to accept whatever comes back.

On July 30, Anthropic disclosed that during a capture-the-flag evaluation one of its models published a malicious PyPI package under a name that existed only because a fictional setup document had referenced it. The package was live for about an hour. In that time it was downloaded and executed on fifteen real systems, one of them a security vendor's malware scanner, whose credentials the model then used to reach further infrastructure. Nobody was fooled by a listing page. A name appeared in a document and infrastructure resolved it, which is the same failure these 77 packages were positioned for, arriving from the other direction. Our Chief Architect Nate Demuth wrote up that disclosure and OpenAI's Hugging Face incident together.

Signature-based scanning is not going to save you here. There is nothing in these packages for a scanner to match on. No eval, no spawned shell, no credential path, no obfuscation, no write to disk. The code is legible, commented, and honest about most of what it does. Every static signal points at clean, and the listing argues the same case in prose. What surfaces something like this is comparison across a corpus, after the fact, once you already know what to look for — which is no help at the moment a machine installs it.

What gives it away is behaviour. An extension whose stated job is inserting file header comments has no reason to read .git/config, enumerate CI environment variables, or open a connection to an eleven-day-old domain a few seconds after startup. That sequence is only visible while it happens, in the runtime of the process doing it.

This is where Manifold operates. We monitor what extensions, MCP servers and agents actually do once they are running, in the environment where they are running, rather than what their manifests and listings claim about them. If you want to see what is running in your environment, book a demo.

What to check

  • Search developer and CI images for .vscode/extensions.json, .devcontainer/devcontainer.json and .devcontainer.json entries matching the package list below, then check what is actually installed rather than what those files request.
  • If you mirror Open VSX internally, pin by publisher and version.
  • Treat the Open VSX unverified-publisher banner as a blocking condition in automated installs rather than a cosmetic notice.
  • Alert on editor processes making outbound requests to recently registered domains shortly after startup, and on DNS TXT queries for _beacon.* labels.
  • As of August 3, 2026, these packages have been removed from Open VSX. That does not un-provision anything: any machine, image or workspace config that already pinned one of these names keeps the code where it is, and the beacon still runs on every editor start.

Indicators

Network

Type

Value

Domain

mangorbit[.]com and all subdomains (registered 2026-07-15, expires 2029-07-15)

Host

pulse.mangorbit[.]com

Host

pulse2.mangorbit[.]com

Host

api.mangorbit[.]com

Host

randomised subdomains under cb.mangorbit[.]com

Path

/t/<24-hex tracking id>, /api/v1/metrics, /api/v1/events

DNS

TXT lookup for _beacon.<domain>, response prefixed base=https://

User-Agent

vscode-ext-metrics/1.0

A subset of samples also reference a third failover endpoint on a second registered domain, which we are not publishing. Blocking *.mangorbit[.]com covers every sample in the set, since all 77 reference it.

Scope

We excluded several packages that matched the republish pattern but carried no beacon to this infrastructure, including three lookalikes whose injected code makes no network requests at all, and one whose exfiltration host belongs to an unrelated campaign. Everything listed below references mangorbit[.]com directly.

77 counterfeit extensions observed 26 July – 1 August 2026

Scroll sideways for all columns →

#Extension IDVersionPayloadBeacon hostsFirst seenSHA-256 (VSIX)
1lego-education.ev3-micropython0.0.2Ad9j3drkeib4sa01kk82014tt97wxnndam.cb.mangorbit.com2026-07-26b8cd87d5e36f167f51ed6a6d2e824f76dc1b3792de9c10091e46f87ad07f5d5a
2better-ts-errors.better-ts-errors0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-278763bda130fe4305c4d13c25584c981424dc47d3de3df46ae0ef05466b05526a
3groksrc.ruby0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-27415cef17b6560643c0e4dddccd956ae6887c369d84c7f45be638a76dc4930dc1
4maptz.regionfolder0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-277342f26ff97c0f8dc29edb1c5a5460bafcaacbc84356020a785628b36156ab6e
5mitsuhiko.insta0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-275d62cfb190145bd21f930d4c21da01e8dc951e4112992790361e2fd4b09e66f6
6SBSnippets.pytorch-snippets0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-27d51e331ae110eb37d453e78ac4cf3063d4606ebd2357d8ee4342fd8f06933e20
7slb235.vscode-coffeelint0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-270ccd62eb6c1155c252248a98c8ff8e1a45a5cc721d6725511effb770037690d5
8amd.gaia-vscode0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-281b775ad3ca61addf5bf3e326951314d80ab526cbab0d745edb3e2bd85de2fcd9
9artsy.artsy-studio-extension-pack0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-28a3dbc0a35a781c61c34bf41e9d21eadbf2e77d18531236d1d9c1e622aaf418ef
10configcat.configcat-feature-flags0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-28941e9cf4fb7a1cdadb1a0e64fce3262426847f167ad255a3f724d77f2d0ee103
11iotaledger.iota-move0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-28fde634f337ab81b3d6bfa320047ff4fe450556fd90f44a30612d549b996edc86
12marketplace.visualstudio0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-289f8a69c193c3c4b83db18149408a9687d1cb6ca149ffa3a1ca6d72e95e3b6954
13obyte.oscript-vscode-plugin0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-287179f11710f242a578bd50187dadd7fa2ba0062e11e1a631edcd75417bda3f7e
14openeuphoria.vscode-euphoria0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-280e99e23329f3ca908d7a88ccf102e4b10bd9b67f24fc79408aae15d5d10dfd0a
15oss.sfmc-devtools-vscode0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-28fc3a32f59300c7e8b3e486f23146224beb658d10ae04098a9e27faf341356fbe
16rumbledb.jsoniq-vscode0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-28498b0c9632959eb37cc278f35561f0736c91884b370251dfebae07ff9a942bc3
17ssagov.uef-snippets0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-2895fbdc4c81e14a46dd8f3eb5c4207567baae99712e3ccf8644af09680f3caf5e
18taskfile.vscode-task0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-282526c160b6a08377d02e035fc166e91e8029b997fa6c91169640c2ad2c2ec60b
19doi.fileheadercomment0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-3015cd6a4909161c406b8428100d688999377e399ae13aa4da49bb73744933807d
20MengsiCode.vscode-django-boilerplate0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-30d35b690502fd3b73312aacf62dc700ac1e43bbc01b53d129096c2c0cdf92a1c4
21move.move-analyzer0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-303b407a548040927802f2cfa05b81eabf48f8b03785ba9fd69a3caa3981a7bc22
22uavcan.dsdl0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-30d19c076fc8213617f889a313a3da1565d8364e35c53290fa96400183127b1187
23vs-publisher-988541.apexsql-power-tools0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-309e148da1d338c32286b54a102ba3a42c7c2627855c3cc820122cff2ee4fc0d90
24365businessdevelopment.bdev-al-xml-doc0.0.1Apulse.mangorbit.com2026-07-3103d81fce32d898e4791672e8e324ca8854d4667f56131f9c2b9d13d66faade4f
25AcademiaDosDevs.javafx0.0.1Apulse.mangorbit.com2026-07-315a1fb5758a6f4b1635d1e1d3fd83c2c13376f466508a949cdad23114af82db45
26AlDuncanson.react-hooks-snippets0.0.1Apulse.mangorbit.com2026-07-31508d3fb15d317846239e8d1f89ab5a5f31242d159f102602cfbf671103658bd3
27Alex-Chen.gitee-code-settings-sync0.0.1Apulse2.mangorbit.com2026-07-317dc683fc3e0acf757cb48091c259bd71a7e3fe985f83d5b40468fa5b58e70804
28AndenetAlexander.vim-cheatsheet0.0.1Apulse.mangorbit.com2026-07-313f97f02073caab6208d103693b13105f9dd42daca379e07953e433bd50ec5d3a
29AndreyVolosovich.monokai-st30.0.1Apulse.mangorbit.com2026-07-313e9c96b913b54af9d50966b27b878750c3ae9d8e7944c4437a40d5a5cbc5ef21
30angelo-breuer.license-header-manager0.0.2Apulse.mangorbit.com2026-07-31aac1efa84293929006436160f77e58e70d9025fc0b320ecc64953e066785a0fa
31AshhadDevLab.customtkinter-snippets0.0.1Apulse.mangorbit.com2026-07-318e90e637bd7f3a2eaee077f216610248bf4d41c8d1f7880a2d2623be13be339f
32AzureADB2CTools.aadb2c0.0.1Apulse2.mangorbit.com2026-07-31410e6b62b5e62cd8603b374f34e5ec6dad62bb95435fa320e08a850fa359f8c5
33AzurePolicy.azurepolicyextension0.0.1Apulse.mangorbit.com2026-07-31805c0c50271afbe94301d376cc5eb191feb7a409ea05f7771dcb4a07dcb0442a
34BartmanAbyss.amiga-debug0.0.1Apulse2.mangorbit.com2026-07-319afe7dd8f3eece28719edac1572ca7adbf307fdb29580535cbc109dec2e44da0
35BDZNH.c-cpp-compile-run-windows0.0.1Apulse2.mangorbit.com2026-07-311a1211418b048678ff5a219d29587cb4beea251615bd8319b2a39caca0ac9cf9
36bradymholt.pgformatter0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-3167d23c83dfe5199815aeb471bf468bb99faa6103e7238484e26e106194548642
37BretDoyle.javascript-extensions-pack---js-essentials0.0.1Apulse2.mangorbit.com2026-07-31cf3593f41cb52c4b52386b539bc1b5095e6123de3d6bfda6f85f98b4570af6a4
38casualjim.gotemplate0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-31abcdee583b02c827fdd746acad814545f9e823d5c7859743d090e176e0f344f4
39drewbourne.vscode-remark-lint0.0.3Apulse2.mangorbit.com2026-07-3148976edf057d4064db52c8ccd5d2b70769008556072cc411617dc6eeb28cbd53
40garaemon.vscode-emacs-tab0.0.3Apulse.mangorbit.com2026-07-31573072c5107fb2fc749225caeee8ddabe7b1b6c9b45463a9e3247d4658870d33
41jakeboone02.cypher-query-language0.0.2Apulse.mangorbit.com2026-07-31796d0536a0de16cd09f768b24d56763bdf8b36535c4ff946a754ff1f16857a65
42jcamp.dotnet-test-provider-view0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-313d734eb54a45f18ffa885f21240c95fccbd4a222368044ae01920176a3666d0e
43madhavd1.javadoc-tools0.0.2Apulse2.mangorbit.com2026-07-31db253057b1d54c0d4bf2ea5d358e33043292c0e1780989a030f489a194d83cb5
44miclo.sort-typescript-imports0.0.3Apulse.mangorbit.com2026-07-31e25513c12e71784067a36db09670c244eb2f22272a5cf4589cb46bc6a27b6fb7
45Mukundan.python-docs0.0.3Apulse2.mangorbit.com2026-07-311a5b4ea5cb768aec7bbba28d881774a124aeb84ee8827d56aa0213ecf59a77a1
46npxms.hide-gitignored0.0.2Apulse.mangorbit.com2026-07-3152a54dd4b72d7c113b22c54a3fe48131d064215f1987589b4ce5aac13573c96d
47qiu.llvm-ir-language-support0.0.6Apulse.mangorbit.com2026-07-31b0e0615140a5aebf3ef3e99693e11f3fcc2c2c0c8a60e92fd4152a8e29c418a5
48superposition.supertoml-analyzer0.0.1Bpulse.mangorbit.com, pulse2.mangorbit.com2026-07-31b7655dd07d18bfb6f9b724647fd393ce2f312b2a874a046e2f568aa9c1eec32f
49tamuratak.vscode-lezer0.0.1Apulse.mangorbit.com, pulse2.mangorbit.com2026-07-31a27ef5dc929616d46ca1bb3fc12e25195e42726db9135b5946e53036992aa3a5
50tgreen7.vs-code-node-require0.0.1Apulse2.mangorbit.com2026-07-31fd8d100ee32bf3f23f9cf82a16c43a61c701380d443d246c34da5aa1d4352e84
51yardensachs.copy-python-path0.0.1Apulse.mangorbit.com2026-07-3198bcafa86bc15ecb93ab47a4e5b7914932699d0ae38ff5f50020cb3d54f3b603
52zoxon.monokai-deep0.0.1Apulse.mangorbit.com2026-07-31f6ae05bdf6ed9fd092d0c8976850980b7a03703f9412a8369a5d7ccd8412dba8
53bdaeumer.vscode-eslint0.0.1Apulse.mangorbit.com2026-08-0118e952ea9848a7bff90d1fdde4b3d6b6648df30959ce6771840ca8cc67fbdfe6
54chavyleung.vscode-pnpm-verlens0.0.1Apulse2.mangorbit.com2026-08-016682a6142cf38e877b2683269c413eab1580e36f8e40876febaf1bf72e12c0f8
55chris-hock.pioasm0.0.1Apulse.mangorbit.com2026-08-01a4f0dd467b3abbdacd5ebb2929de3899c6b3d7b0b90da9ea4ae58e30d101db8f
56davidpallinder.rails-test-runner0.0.1Apulse.mangorbit.com2026-08-010039e6d3a653d255841320db1dcd9664e1c9ae8b0a0d8a2e9f7e0ecb5fd2c0f6
57Flutterando.flutter-mobx0.0.1Apulse.mangorbit.com2026-08-01280ef259644dfbd888ad3eb630aaf6f895449b5e97e075e459fc96c266fb8682
58Glavin001.unibeautify-vscode0.0.1Apulse.mangorbit.com2026-08-015c41fa68ce0f879199d9b5646cf9b82ebde426e1ee0fa2ae10dd6447b0223c54
59GoBystrokReactJS.gobystrok0.0.1Apulse2.mangorbit.com2026-08-0115cd8ee6f874539d915a9284adf17a3c2eb0b970c331725a8388f58efba48719
60helixquar.asciidecorator0.0.1Apulse.mangorbit.com2026-08-01375216cb58f3700c181da52c62eccd4534b0d2aaa0d84df6a9f476f35a87217d
61HyperledgerComposer.composer-support-client0.0.1Apulse.mangorbit.com2026-08-0158b7c5b92ed0756034af0de02c7addcab215ab612bd37c86bad11aafdfb25d62
62Insigne.powershell0.0.1Apulse2.mangorbit.com2026-08-01041019527f4c13b1007b71d35d4383b13ee8c7bf3eaaff366abe90c6c9a804c3
63Jeremy38100.init-node-script0.0.1Apulse.mangorbit.com2026-08-01b461c72229cefd5f2078db74565451dc656e71af3a1e95f13db70bf7dec94c70
64jt.jakt0.0.1Apulse2.mangorbit.com2026-08-018af30a4e2c57034a64e924a893de50450dd668528f2723a94f907a8a758965ea
65kaellarkin.hugo-shortcode-syntax0.0.1Apulse.mangorbit.com2026-08-01e7ba9bff28fa17d507753e0ca157d7add64cbfed593530504b153e24b6c982c9
66Levertion.mcjson0.0.1Apulse.mangorbit.com2026-08-01f04b8c9af22fd8e20fd070806b1aa21424a0f6d5e2c770fa9fb1d131b08393fd
67magne-sjaastad.opm-flow-editor-support0.0.1Apulse.mangorbit.com2026-08-01b490d56da1c5a4e26de8c07f907157b0e328c84464df38d2bd1cb92858906f83
68MarinhoBrandao.Angular2Tests0.0.1Apulse2.mangorbit.com2026-08-016bbaee0ccfbbd45c7683efbf4688ad4532050f8a0ad6b39ea1b435ce2b6cf546
69microsoft-dciborow.align-bicep0.0.1Apulse.mangorbit.com2026-08-01c5fe26dbc56a84ab672a28d3d3d767dd1496a56b027ecec7e3f8f25f83cd6a7d
70mkdirdocs.mkd-docs0.0.1Apulse.mangorbit.com2026-08-010937bfa48a6b2ee53c978c1edea77a04db6ef407adef108b12fb6612e308b275
71nihilus118.perl-debugger0.0.1Apulse2.mangorbit.com2026-08-01c578b03b8bd150ec9bf71326293f9f1abc2f1d451b3ca2ee05a516ec53866b1b
72pwrs.cem-language-server-vscode0.0.1Apulse2.mangorbit.com2026-08-012364b4cf089da6d4d6c1fe854daca03047eea0849b325a3e9f28fac4584418d2
73wghats.vscode-nxunit-test-adapter0.0.1Aapi.mangorbit.com2026-08-01b301202210164188696b6a6fced62cf0c1641dca650ea4981f81b210ced9116f
74wordpresstools.wordpress0.0.1Apulse.mangorbit.com2026-08-019ec8c53e41766b7b1dbc7fd9acf759b63f65353434231de57d22a6002fef7998
75xnerd.ampscript-language0.0.1Apulse.mangorbit.com2026-08-0181402a5dc2901bc68ae7e866d78ad7c0ab1c77868d1cb026f95a68a0de851f5d
76ydaveluy.xsmp-modeler0.0.1Apulse2.mangorbit.com2026-08-014b3dfffd11366d4171ba57efe53fc4fe4d4c39e9b8590c81365453005aed9b80
77ydaveluy.xsmp-tas-mdk0.0.1Apulse2.mangorbit.com2026-08-01b9f36f1e416a3b6c650cebcad3dc046c0a0164442d0a2c3ed35279179f457c24

All 77 packages

The complete list is published as a CSV. Click below to expand to see all 77 rows and download:

It contains the extension ID and version, payload class (A lightweight beacon, B reconnaissance), beacon hosts, the date our systems first archived the sample, and the SHA-256 of each VSIX.

Legitimate publishers named in this post were not involved. The extensions listed reused the names, namespaces and descriptions of real projects without their knowledge or participation. The genuine versions of those extensions are unaffected.

Want to see what is running in your environment? Book a demo.