Dependency-confusion package that steals AWS, SSH and npm credentials from Across Protocol developers
The npm package @across-toolkit/[email protected] is a dependency-confusion attack aimed at developers of Across Protocol (across.to). It masquerades as an internal “ESLint/TypeScript config for the across.to toolkit,” and publishes an absurdly high version (99.0.0) so a misconfigured install resolves it from the public registry instead of the private one. Its postinstall hook then reads the host’s AWS credentials, SSH private key, npm token and environment and POSTs them to a hardcoded webhook.site endpoint — a straight credential grab on any developer machine or CI runner that installs it.
The npm package @across-toolkit/typescript-config (version 99.0.0) describes itself as an “ESLint configuration for the across.to toolkit.” The @across-toolkit scope and that description are the lure: this is a dependency-confusion package aimed squarely at Across Protocol (a real cross-chain bridge, across.to), betting that one of their internal build tools resolves a shared-config name from the public npm registry.
The 99.0.0 version is the tell: publishing an implausibly high version is the standard dependency-confusion trick to win npm’s version resolution over a legitimate private package of the same name.
Its package.json declares postinstall: node postinstall.js, so the payload runs automatically on npm install, before any code is imported — including in CI, containers and developer machines. codelake surfaced it from the live npm feed via its install-hook behaviour pipeline; it was verified as absent from OSV and GHSA at detection — a novel first-catch.
1 · Harvests credentials. Using os.homedir(), it reads the host’s AWS credentials (~/.aws/credentials), SSH private key (~/.ssh/id_rsa) and npm token (~/.npmrc), and collects process.env.
2 · Exfiltrates to webhook.site. It POSTs the collected data to a hardcoded https://webhook.site/… endpoint — a free request-capture service used here as a disposable, low-effort collector.
3 · Runs on install. Both the root postinstall.js and a nested eslint-config/postinstall.js carry the payload; it executes on npm install via the postinstall hook and uses child_process.
Why it matters. A single npm install — on a developer laptop or, worse, a CI runner with cloud roles — hands the operator AWS credentials, an SSH key and an npm publish token: enough to reach cloud infrastructure, move laterally and publish further malicious packages.
Detected + classified independently by codelake Research via its install-hook behaviour pipeline · deterministic structural analysis of the packed tarball (package.json postinstall hook, os.homedir credential reads, webhook.site POST exfil). Verified absent from OSV/GHSA at detection (novel first-catch); npm takedown filed and OpenSSF malicious-packages submission opened crediting codelake Research as finder.
This is a confirmed-malware advisory. No working payload or reproduction is published — the behaviour is described from structural analysis, and the exfil endpoint is named as a defensive indicator only. The original artifact is preserved in the codelake archive and available to verified security researchers on request.