▲ | feross 5 days ago | |
Disclosure: I'm the founder of https://socket.dev. A few concrete datapoints from our analysis of this incident that may help cut through the hand-waving: 1. This is the same campaign that hit Qix yesterday (https://socket.dev/blog/npm-author-qix-compromised-in-major-...). The injected payload is byte-for-byte behaviorally identical. It hooks fetch, XMLHttpRequest, and common wallet provider APIs and live-rewrites transaction payloads to attacker addresses across ETH, BTC, SOL, TRX, LTC, BCH. One tell: a bundle of very distinctive regexes for chain address formats, including multiple Solana and Litecoin variants. 2. Affected versions and timing (UTC) that we verified: - duckdb@1.3.3 at 01:13 - @duckdb/duckdb-wasm@1.29.2 at 01:11 - @duckdb/node-api@1.3.3 at 01:12 - @duckdb/node-bindings@1.3.3 at 01:11 Plus low-reach test shots: prebid@10.9.1, 10.9.2 and @coveops/abi@2.0.1 3. Payout so far looks small. Tracked wallets sum to roughly $600 across chains. That suggests speed of discovery contained damage, not that the approach is harmless. What would actually move the needle: === Registry controls === - Make passkeys or FIDO2 mandatory for high-impact publisher accounts. Kill TOTP for those tiers. - Block publishing for 24 hours after 2FA reset or factor changes. Also block after adding a new automation token unless it is bound by OIDC provenance. - Require signed provenance on upload for popular packages. Verify via Sigstore-style attestations. Reject if there is no matching VCS tag. - Quarantine new versions from being treated as “latest” for automation for N hours. Exact-version installs still work. This alone cuts the blast radius of a hijack. === Team controls === - Do not copy-paste secrets or 2FA. Use autofill and origin-bound WebAuthn. - Require maker-checker on publish for org-owned high-reach packages. CI must only build from a signed tag by an allowed releaser. - Pin and lock. Use `npm ci`. Consider an internal proxy that quarantines new upstream versions for review. === Detection === - Static heuristics catch this family fast. Wallet address regex clusters and network shims inside non-crypto packages are a huge tell. If your tooling sees that in a data engine or UI lib, fail the build. Lastly, yes, training helps, but the durable fix is making the easy path the safe path. |