Three Ways Your Dependency Tree Bites You This Week
libssh2 is worse than a typical CVE because of transitive linkage. It compiles into curl for SCP/SFTP, Git for SSH transport, and PHP via the ssh2 extension. CI runners doing git clone over SSH are candidates. So are deploy scripts calling curl sftp:// and every base image still shipping old libssh2. The flaw fires before authentication, so credential hardening does nothing. With 130+ weaponized PoCs from the Exploitarium dump in the wild, the disclosure-to-exploitation gap is probably already closed.
Second, self-inflicted. npm 12 disables install scripts, git deps and remote-URL installs by default. npm install succeeds. package.json looks fine. But native addons — sharp, bcrypt, better-sqlite3, Prisma's postinstall generate — silently never compile. You find out at runtime, possibly in production. An explicit package.json allowlist is now required. Monorepos take a second hit: the 2FA changes make automated npm publish in CI ask for human approval, which breaks release automation.
Third, the direction supply-chain attacks are moving. The Injective Labs SDK compromise shipped 50K weekly downloads and stayed dormant until the app called wallet key-generation. Then it exfiltrated keys over HTTP POST. Static package analysis and postinstall inspection see nothing. Alibaba's XQUIC has a single-wrong-variable HTTP/3 DoS, XRING, that crashes servers with fully legal QUIC traffic. WAFs cannot see it. no patch available.
The through-line: install-time and static defenses no longer cover the threat. Behavioral triggers and transitive linkage walk right past them.
What to do
Audit all container base images, CI runners and build hosts for libssh2 < 1.11.1 this sprint; rebuild or pin patched images before the next deploy cycle
Before upgrading to npm 12, run npm ls --install-strategy=shallow and grep hasInstallScript to build a package.json allowlist for native modules
Grep dependency trees for xquic; fall back to HTTP/2 or swap to quiche/msquic until XRING is patched