96 fake chai plugins on npm that fetch and run remote code
Between May 7, 2026 and Oct 2, 2026, 96 npm packages posed as chai, the JavaScript assertion library, or as plugins for it. Behind the familiar API, most start a hidden Node process that downloads JavaScript and runs it.
Summary
- 96 packages and 160 versions. 60 of the names follow the
chai-as-…pattern of the popularchai-as-promised. - 43 ship copied chai code, README files or metadata so they look and work like the real thing.
- In 55, a detached child process fetches code and runs it with
new Function, outside the test run. - 60 fetch from paste and hosting services such as jsonkeeper, jsonstorage, npoint, tiiny.site and Vercel apps.
- Only 4 use an install script. The rest run when the package is imported or its exported helper is called.
- LPM's own review confirms 36 as malicious, and 90 have an OpenSSF/OSV malicious-package advisory.
How the loader works
- Most of the packages export working assertions or copied library code, so a test that uses one still passes.
- On import, or the first time its exported middleware or helper is called,
index.jsspawns a detached Node process running a helper such aslib/caller.jsorlib/initializeCaller.js, with its output discarded. - The helper decodes a URL hidden with Base64 or a similar encoding and requests it, often from a paste or JSON hosting service.
- It runs the response, or a field from it such as
cookieortoken, withnew Function("require", …), giving the downloaded code full access to Node.
The detached process outlives the test run, and the payload can change on the server at any time. In 9 packages the helper also sends the full process.env, which in CI usually holds cloud, registry and deployment tokens. See all npm packages with remote code execution.
Who they target
Test helpers are installed by developers and run in CI, where credentials are close at hand. Several names and payloads point at web3 developers: 10 packages mention wallets, Solidity or Ethereum, and names such as chai-web3-testkit, chai-solidity-testkit and chai-as-viem fit smart-contract test setups.
Indicators of compromise
Payload hosts
https://ipcheck-hashed.vercel.app/api/auth/<id>https://ipcheckr-hashed.vercel.app/api/auth/<id>http://check-server-state.vercel.app/server/v2http://server-genimi-check.vercel.app/defy/v3https://statecheck.ddns.net/api/scanner.jshttp://coolblast.zapto.org:8888/api/x-handlerhttps://www.ipregionchecker.org/api/ip-check-encrypted/<id>https://testlog.edgeone.cool/data.jsonhttps://1uznbx.s.gy/7xdQmt
Abused paste and hosting services (block the paths, not the services)
https://jsonkeeper.com/b/<id> (PC5CK, XRGF3, 4NAKK, 5IZTJ, U2BTS, CS0FU, O3JR0, EXSIF, HIOEN, AAON3, HIECD)https://api.jsonstorage.net/v1/json/2ef8c758-a96f-459e-b036-b3b90379a165/<id>https://api.npoint.io/c2e881b8bc0fe2121454https://api.npoint.io/c26313f0733957a7d787https://<name>.tiiny.site/index.json (amethyst-lorrin-26, tomato-brunhilda-40, tomato-erminie-2, gray-dyane-31, aqua-margit-84)https://purple-kelila-79.tiiny.site/data.json
Loader file names inside the packages
lib/caller.jslib/initializeCaller.jslib/initstate.jslib/syncResolve.jslib/config.js
What to do
- Search package.json files and lockfiles for the names below. The real packages are
chaiandchai-as-promised, published by the chai maintainers. - If one of them ran in a test or CI job, treat that machine as compromised and rotate every credential its environment held.
- Look for detached
node lib/caller.jsor similar processes left running after tests. - Block the hosts and paths above at network egress.
Affected packages
96 packages. Each name links to its LPM Firewall report and is marked LPM confirmed or advisory.
- chai-as-actadvisory · 1.0.2
- chai-as-agileLPM confirmed · 2.4.7
- chai-as-assuredadvisory · 7.1.2, 6.0.4
- chai-as-attestedadvisory · 6.0.3
- chai-as-balancedLPM confirmed · 2.2.3
- chai-as-benchadvisory · 7.0.3
- chai-as-bufferedadvisory · 3.7.24, 7.2.5
- chai-as-builtadvisory · 6.0.3
- chai-as-byteLPM confirmed · 3.1.5, 3.1.6
- chai-as-constLPM confirmed · 1.4.5, 1.4.6, 1.4.7
- chai-as-crackLPM confirmed · 7.0.5
- chai-as-decryptedadvisory · 4.2.8
- chai-as-deployerLPM confirmed · 2.3.5, 2.3.6
- chai-as-disarmedLPM confirmed · 3.2.3
- chai-as-docLPM confirmed · 2.3.5
- chai-as-forgetedadvisory · 9.24.6
- chai-as-formatLPM confirmed · 2.3.5
- chai-as-fusionLPM confirmed · 2.3.6
- chai-as-gatewayadvisory · 7.1.5
- chai-as-hardenedLPM confirmed · 7.0.9
- chai-as-indexedadvisory · 7.2.8, 6.0.5
- chai-as-initadvisory · 1.4.5, 1.4.6, 1.4.7
- chai-as-inspiredLPM confirmed · 2.2.4
- chai-as-mapadvisory · 2.3.5
- chai-as-mnoLPM confirmed · 1.0.5
- chai-as-modifiedadvisory · 6.0.4
- chai-as-operatedadvisory · 6.0.3
- chai-as-orgLPM confirmed · 1.0.5
- chai-as-otcadvisory · 1.0.5
- chai-as-patchadvisory · 1.1.9
- chai-as-persistedadvisory · 4.2.8, 6.1.9
- chai-as-polishedadvisory · 7.0.8
- chai-as-precisionadvisory · 7.0.6
- chai-as-predictedadvisory · 6.0.3
- chai-as-promised-plusLPM confirmed · 6.1.3
- chai-as-redditadvisory · 7.0.2, 7.0.3, 7.0.4
- chai-as-reformedLPM confirmed · 1.2.0
- chai-as-regulatedadvisory · 2.0.12
- chai-as-relayLPM confirmed · 1.2.1
- chai-as-renderedadvisory · 1.2.0
- chai-as-repairedadvisory · 5.32.10, 5.32.9
- chai-as-setsLPM confirmed · 3.1.3
- chai-as-sleekLPM confirmed · 7.1.2
- chai-as-smartLPM confirmed · 2.3.5
- chai-as-soulLPM confirmed · 2.3.5, 2.3.6
- chai-as-stagedLPM confirmed · 6.0.4
- chai-as-stringifyLPM confirmed · 7.0.2
- chai-as-structuredadvisory · 7.0.5
- chai-as-syncedadvisory · 6.0.3, 7.0.9
- chai-as-testkitadvisory · 2.3.5
- chai-as-testmodeadvisory · 1.4.7
- chai-as-threadadvisory · 7.0.8
- chai-as-tokenizedadvisory · 7.2.3
- chai-as-tunedadvisory · 7.2.2
- chai-as-typeadvisory · 1.1.9, 7.0.5
- chai-as-upheldedadvisory · 6.11.4
- chai-as-verifiedLPM confirmed · 7.1.5
- chai-as-victimedadvisory · 6.1.21
- chai-as-viemLPM confirmed · 1.1.3
- chai-as-viteadvisory · 2.3.5
- chai-assert-kitadvisory · 3.8.1
- chai-assertions-plusLPM confirmed · 6.0.4, 6.0.6
- chai-chain-domadvisory · 1.3.7, 1.3.8, 1.3.9
- chai-check-erroradvisory · 2.1.3, 2.1.5, 2.1.6 +2 more
- chai-decadvisory · 2.3.5
- chai-defenderLPM confirmed · 1.0.0-beta.1, 1.0.1, 1.0.1-beta +3 more
- chai-deflectadvisory · 1.1.5, 1.1.6
- chai-foundryLPM confirmed · 7.0.2, 7.0.3
- chai-guardadvisory · 1.0.0, 1.2.3
- chai-guidadvisory · 1.1.5
- chai-jsonssadvisory · 3.7.7
- chai-leafLPM confirmed · 1.4.5, 1.4.6, 1.4.7, 1.4.8
- chai-logLPM confirmed · 1.1.0
- chai-loggeradvisory · 3.0.2
- chai-mocksadvisory · 1.1.5
- chai-net-testadvisory · 1.1.0, 1.1.2, 1.1.3
- chai-pluginadvisory · 4.5.2, 4.5.3, 4.5.4, 4.5.5
- chai-plugin-helperadvisory · 1.7.3, 1.7.4, 1.7.5, 1.7.6
- chai-plugin-kitadvisory · 5.8.1
- chai-plusLPM confirmed · 6.2.3, 6.2.4, 6.2.5 +2 more
- chai-presentationLPM confirmed · 0.0.1, 0.0.2, 0.0.3, 0.0.4
- chai-promised-testadvisory · 1.3.5
- chai-redirectionLPM confirmed · 0.0.1, 0.0.3, 0.0.4
- chai-sdkLPM confirmed · 1.4.7, 1.4.8
- chai-secureadvisory · 1.2.3, 1.2.5
- chai-smartadvisory · 2.3.5
- chai-smart-assertadvisory · 1.1.9
- chai-solidity-testkitadvisory · 1.6.1, 1.6.4
- chai-spycoreadvisory · 1.1.0, 1.5.3
- chai-test-mocksadvisory · 1.2.0
- chai-trackerLPM confirmed · 1.1.0, 1.1.1, 1.1.2 +2 more
- chai-use-chainadvisory · 1.2.6
- chai-utils-testadvisory · 4.5.5, 4.5.4, 4.5.3 +3 more
- chai-valadvisory · 1.1.9
- chai-web3-testkitadvisory · 1.0.1
- express-chaiLPM confirmed · 3.7.9
How we identified the packages
The list covers every npm package LPM Firewall blocks whose name starts with chai-, plus express-chai, as of Oct 23, 2026. The packages share a disguise and a loader pattern, but not necessarily one publisher. The counts of each behavior come from LPM's reviews and the advisory text for each package, so they are lower bounds.
Read how LPM Firewall reports are produced, or browse more research.