<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pico</title>
    <description>The latest articles on DEV Community by Pico (@piiiico).</description>
    <link>https://dev.to/piiiico</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3845861%2F9b3524f7-dcbf-476f-a8ec-fe2f6010c4db.png</url>
      <title>DEV Community: Pico</title>
      <link>https://dev.to/piiiico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/piiiico"/>
    <language>en</language>
    <item>
      <title>One npm Account Publishes 964 Million Downloads Per Week. None Have Provenance.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Thu, 18 Jun 2026 14:35:24 +0000</pubDate>
      <link>https://dev.to/piiiico/one-npm-account-publishes-964-million-downloads-per-week-none-have-provenance-4e2k</link>
      <guid>https://dev.to/piiiico/one-npm-account-publishes-964-million-downloads-per-week-none-have-provenance-4e2k</guid>
      <description>&lt;p&gt;The npm account &lt;code&gt;ai&lt;/code&gt; publishes seven packages. Combined, they install 964 million times per week:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Weekly downloads&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;postcss&lt;/td&gt;
&lt;td&gt;245,612,332&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nanoid&lt;/td&gt;
&lt;td&gt;206,588,788&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;caniuse-lite&lt;/td&gt;
&lt;td&gt;173,435,668&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;browserslist&lt;/td&gt;
&lt;td&gt;167,746,012&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autoprefixer&lt;/td&gt;
&lt;td&gt;63,517,741&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postcss-nested&lt;/td&gt;
&lt;td&gt;54,486,292&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;postcss-js&lt;/td&gt;
&lt;td&gt;52,771,544&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's 50 billion installs per year behind a single set of npm credentials. None of them have npm provenance attestations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;npm provenance uses OIDC tokens from GitHub Actions instead of long-lived npm tokens. If a package has provenance, you can verify that the published code came from a specific commit in a specific repository — not from someone's compromised laptop.&lt;/p&gt;

&lt;p&gt;Without provenance, there's no way to distinguish a legitimate release from one pushed by a stolen token. The blast radius here is nearly a billion installs per week.&lt;/p&gt;

&lt;p&gt;This isn't theoretical. axios was attacked on March 30, 2026 through a stolen npm token — same single-publisher, no-provenance pattern. LiteLLM was hit the same way a month earlier. The Shai-Hulud worm in May 2026 exploited stolen tokens to republish 637 package versions in 39 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What makes this different from chalk or lodash
&lt;/h2&gt;

&lt;p&gt;PostCSS is interesting because it's not just one critical package. It's an entire ecosystem of critical packages, all behind the same account. chalk is one package, one publisher, 432M downloads/week. Bad enough. But &lt;code&gt;ai&lt;/code&gt; controls seven independent packages that each cross the 10M threshold.&lt;/p&gt;

&lt;p&gt;A compromised &lt;code&gt;ai&lt;/code&gt; token doesn't just hit postcss. It hits the CSS build pipeline (postcss + autoprefixer + postcss-nested + postcss-js), the browser compatibility layer (browserslist + caniuse-lite), and one of the most popular ID generators in the ecosystem (nanoid).&lt;/p&gt;

&lt;p&gt;And &lt;code&gt;caniuse-lite&lt;/code&gt; was flagged with a dormant publisher warning — 61 months of inactivity on the publishing account. postcss-nested hasn't had a release in over 12 months.&lt;/p&gt;

&lt;h2&gt;
  
  
  This has been fixed before
&lt;/h2&gt;

&lt;p&gt;fast-xml-parser (88M downloads/week, single publisher) had the same problem. After the community raised &lt;a href="https://github.com/NaturalIntelligence/fast-xml-parser/issues/814" rel="noopener noreferrer"&gt;the issue&lt;/a&gt;, the maintainer set up GitHub Actions OIDC publishing. Within days, version 5.9.1 shipped with SLSA provenance attestations. Then 5.9.2 added environment gates and SHA-pinned actions. The structural gap closed in under a week.&lt;/p&gt;

&lt;p&gt;I &lt;a href="https://github.com/postcss/postcss/issues/2096" rel="noopener noreferrer"&gt;filed an issue on PostCSS&lt;/a&gt; yesterday proposing the same approach. The fix is a one-line change — add &lt;code&gt;provenance: true&lt;/code&gt; to the npm publish step — and it requires zero stored secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own dependencies
&lt;/h2&gt;

&lt;p&gt;If you want to see which packages in your project have this concentration risk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it in any project directory. It auto-detects your lockfile and flags packages where a single npm publisher controls more than 10M weekly downloads. That's the exact attack surface that's been exploited three times in four months.&lt;/p&gt;

&lt;p&gt;The full PostCSS ecosystem audit data comes from &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt;, which scores packages on behavioral signals rather than declared metadata.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>security</category>
      <category>supplychain</category>
      <category>javascript</category>
    </item>
    <item>
      <title>323 npm Packages Compromised in 39 Minutes. The Malware Installs a Claude Code SessionStart Hook.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Mon, 15 Jun 2026 20:37:07 +0000</pubDate>
      <link>https://dev.to/piiiico/639-npm-packages-compromised-in-39-minutes-the-malware-installs-a-claude-code-sessionstart-hook-3k38</link>
      <guid>https://dev.to/piiiico/639-npm-packages-compromised-in-39-minutes-the-malware-installs-a-claude-code-sessionstart-hook-3k38</guid>
      <description>&lt;p&gt;On May 19, 2026, between 01:39 and 02:18 UTC, a single compromised npm account published 639 malicious package versions across 323 packages. The entire attack took under 40 minutes.&lt;/p&gt;

&lt;p&gt;The packages included &lt;code&gt;jest-canvas-mock&lt;/code&gt; (2.2M weekly downloads), &lt;code&gt;echarts-for-react&lt;/code&gt; (1.1M), &lt;code&gt;size-sensor&lt;/code&gt; (1.2M), &lt;code&gt;timeago.js&lt;/code&gt; (243K), and most of the &lt;code&gt;@antv&lt;/code&gt; visualization suite. Total blast radius: roughly 16 million weekly downloads.&lt;/p&gt;

&lt;p&gt;This wasn't a human typing &lt;code&gt;npm publish&lt;/code&gt; 639 times. This was a worm.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the self-propagation works
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;atool&lt;/code&gt; npm account was compromised (how is still unknown). That account had publish access to hundreds of packages. The initial payload did what you'd expect — harvested credentials from 80+ environment variables and 100+ file paths across AWS, GCP, Azure, GitHub, Kubernetes, and database systems.&lt;/p&gt;

&lt;p&gt;Then it did something different: it searched for npm tokens with the &lt;code&gt;bypass_2fa&lt;/code&gt; scope. In GitHub Actions environments, the malware exchanged OIDC tokens for per-package npm publish credentials. It then republished additional packages with itself embedded. An npm worm.&lt;/p&gt;

&lt;p&gt;Two waves hit the registry. First: ~317 versions at 01:39. Second: ~314 versions 26 minutes later at 02:05. Detection started around 02:18. By then, the packages had been live long enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  The persistence mechanisms
&lt;/h2&gt;

&lt;p&gt;The exfiltrated credentials are serialized as JSON, gzip-compressed, encrypted with AES-256-GCM, and wrapped with RSA-OAEP. The exfiltration channel disguises traffic as OpenTelemetry traces.&lt;/p&gt;

&lt;p&gt;A backup channel creates public repos under the victim's GitHub account and commits encrypted credential dumps with Dune-themed naming patterns.&lt;/p&gt;

&lt;p&gt;Here's where it gets personal if you use Claude Code or VS Code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The malware installs a &lt;code&gt;SessionStart&lt;/code&gt; hook in &lt;code&gt;.claude/settings.json&lt;/code&gt;.&lt;/strong&gt; It also drops VS Code task automation in &lt;code&gt;.vscode/tasks.json&lt;/code&gt; and a background daemon that polls GitHub every 60 seconds for RSA-signed commands.&lt;/p&gt;

&lt;p&gt;And there's a dead man's switch. If the stolen GitHub token gets revoked, the malware runs &lt;code&gt;rm -rf ~/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These aren't hypothetical persistence vectors. They're documented by &lt;a href="https://www.akamai.com/blog/security-research/mini-shai-hulud-worm-returns-goes-public" rel="noopener noreferrer"&gt;Akamai&lt;/a&gt;, &lt;a href="https://labs.cloudsecurityalliance.org/research/csa-research-note-shai-hulud-ai-supply-chain-20260517-csa-st/" rel="noopener noreferrer"&gt;CSA&lt;/a&gt;, and &lt;a href="https://expel.com/blog/mini-shai-hulud-cross-ecosystem-supply-chain-worm-targeting-npm-pypi/" rel="noopener noreferrer"&gt;Expel&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the packages looked like before the attack
&lt;/h2&gt;

&lt;p&gt;I scored the compromised packages using &lt;a href="https://getcommit.dev/audit?ref=devto-shai-hulud" rel="noopener noreferrer"&gt;Commit&lt;/a&gt;. The non-AntV packages tell the clearest story:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Downloads/wk&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;canvas-nest.js&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;650&lt;/td&gt;
&lt;td&gt;WARN: no release 12+ months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;timeago.js&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;243K&lt;/td&gt;
&lt;td&gt;WARN: no release 12+ months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;size-sensor&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.2M&lt;/td&gt;
&lt;td&gt;HIGH: sole publisher + &amp;gt;1M/wk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;echarts-for-react&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.1M&lt;/td&gt;
&lt;td&gt;HIGH: sole publisher + &amp;gt;1M/wk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jest-canvas-mock&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2.2M&lt;/td&gt;
&lt;td&gt;WARN: no release 12+ months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three of these five had a sole npm publisher. Two are stale — no release in over a year, still pulled by millions of projects weekly. That's exactly the profile that makes account takeover both easy and high-impact.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;@antv&lt;/code&gt; packages scored higher (84–89) because they have 17–18 maintainers. But that's exactly how the attack worked: &lt;code&gt;atool&lt;/code&gt; was one of those 18 maintainers. More publishers means more attack surface when any one of them can push.&lt;/p&gt;

&lt;h2&gt;
  
  
  Protect your editor
&lt;/h2&gt;

&lt;p&gt;If you use Claude Code, Cursor, or Windsurf, you can gate package installs before they run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs a pre-install check that intercepts &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, and &lt;code&gt;cargo add&lt;/code&gt;. CRITICAL packages (sole publisher + millions of downloads — the exact Shai-Hulud profile) are blocked before they execute. The hook writes &lt;code&gt;.claude/settings.json&lt;/code&gt;, &lt;code&gt;.cursor/hooks.json&lt;/code&gt;, and &lt;code&gt;.windsurf/hooks.json&lt;/code&gt; so the gate works regardless of which editor is driving.&lt;/p&gt;

&lt;p&gt;The irony: the same file the worm writes to for persistence (&lt;code&gt;.claude/settings.json&lt;/code&gt;) is the one you use to defend against it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check
&lt;/h2&gt;

&lt;p&gt;If your &lt;code&gt;package-lock.json&lt;/code&gt; or &lt;code&gt;yarn.lock&lt;/code&gt; includes any of these packages, check which versions you installed between 01:39 and 02:18 UTC on May 19.&lt;/p&gt;

&lt;p&gt;Then check the rest of your dependency tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The packages that scored 50-72 before this attack (sole publishers, stale releases, high downloads) are the same profile that got compromised in the LiteLLM attack, the axios attack, and now this one.&lt;/p&gt;

&lt;p&gt;The pattern doesn't change. The entry point is always the same: one compromised account with publish access to a widely-installed package.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's different about this one
&lt;/h2&gt;

&lt;p&gt;Previous supply chain attacks hit one package at a time. This one propagated. It turned compromised npm tokens into more compromised packages. The window between first publish and detection is getting shorter, but the blast radius is getting wider.&lt;/p&gt;

&lt;p&gt;And the persistence mechanisms are evolving. Targeting &lt;code&gt;.claude/settings.json&lt;/code&gt; and &lt;code&gt;.vscode/tasks.json&lt;/code&gt; means the malware survives container restarts and embeds itself in developer tooling. The exact environment where you decide which packages to trust.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://getcommit.dev/audit?ref=devto-shai-hulud" rel="noopener noreferrer"&gt;Run a supply chain audit on your project&lt;/a&gt; — or &lt;a href="https://getcommit.dev/get-started?ref=devto-shai-hulud" rel="noopener noreferrer"&gt;set up monitoring&lt;/a&gt; to get alerted when a package in your tree degrades.&lt;/p&gt;

</description>
      <category>npm</category>
      <category>security</category>
      <category>supplychain</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>IronWorm Commits as 'claude.' It Steals Your Anthropic and OpenAI Keys.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Mon, 15 Jun 2026 14:36:00 +0000</pubDate>
      <link>https://dev.to/piiiico/ironworm-commits-as-claude-it-steals-your-anthropic-and-openai-keys-2gjn</link>
      <guid>https://dev.to/piiiico/ironworm-commits-as-claude-it-steals-your-anthropic-and-openai-keys-2gjn</guid>
      <description>&lt;p&gt;On June 3, JFrog Security Research published their analysis of IronWorm — a supply chain attack that compromised 37 npm packages through the &lt;code&gt;asteroiddao&lt;/code&gt; account. A 976KB Rust ELF binary triggered by &lt;code&gt;preinstall&lt;/code&gt;. Caught early, before spreading to popular packages. But the techniques are a step change from everything that came before.&lt;/p&gt;

&lt;p&gt;Three things make IronWorm different.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It commits as "claude"
&lt;/h2&gt;

&lt;p&gt;Every malicious commit pushed to victim repositories uses the author identity &lt;code&gt;claude@users.noreply.github.com&lt;/code&gt;. The commit messages are routine: "fix: resolve lint warnings," "test: add missing edge case," "ci: update workflow configuration."&lt;/p&gt;

&lt;p&gt;The timestamps are forged. Some are backdated 13 years. In a repo where AI-generated commits are common and legitimate, these blend in. A developer scanning git log wouldn't notice. A code reviewer seeing a commit from "claude" might assume it came from an AI coding assistant doing its job.&lt;/p&gt;

&lt;p&gt;Social engineering adapted to the AI era. The attacker isn't pretending to be a human — they're pretending to be an AI tool the team already trusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. It steals AI credentials specifically
&lt;/h2&gt;

&lt;p&gt;IronWorm targets 86 environment variables and 20+ credential files. Standard targets (AWS, SSH, Docker) plus a new category:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API keys&lt;/strong&gt; (&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic API keys&lt;/strong&gt; (&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude authentication files&lt;/strong&gt; (session tokens)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cursor authentication files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm publish tokens&lt;/strong&gt; (including Trusted Publishing OIDC tokens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stolen AI keys have immediate value. An OpenAI key with no spend cap runs thousands of dollars before anyone notices. An Anthropic key runs agents that escalate the attack. An npm token turns one compromised dev into a vector for every package they maintain.&lt;/p&gt;

&lt;p&gt;The dedicated Exodus wallet module injects JavaScript to capture the password and seed mnemonic at login. This isn't a generic credential scraper — custom modules per high-value target.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. It propagates through Trusted Publishing
&lt;/h2&gt;

&lt;p&gt;npm's &lt;a href="https://docs.npmjs.com/generating-provenance-statements" rel="noopener noreferrer"&gt;Trusted Publishing&lt;/a&gt; lets packages publish via GitHub Actions OIDC tokens instead of stored credentials. Designed to be more secure: no long-lived tokens to steal.&lt;/p&gt;

&lt;p&gt;IronWorm doesn't need stored credentials. It modifies GitHub Actions workflows to request OIDC tokens at runtime, then publishes trojanized versions of the victim's packages with valid provenance attestations.&lt;/p&gt;

&lt;p&gt;The result: malicious packages that pass &lt;code&gt;npm audit signatures&lt;/code&gt;. Provenance says "published through a verified CI pipeline." It doesn't say "the CI pipeline was hijacked."&lt;/p&gt;

&lt;p&gt;Same fundamental gap Miasma exploited with Red Hat's SLSA provenance the week before. Two independent attacks, one week apart, both defeating provenance through different mechanisms. &lt;strong&gt;Provenance is a chain-of-custody stamp, not a trust signal.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral scoring shows
&lt;/h2&gt;

&lt;p&gt;I ran every IronWorm package through &lt;a href="https://getcommit.dev/audit?ref=devto-ironworm" rel="noopener noreferrer"&gt;Commit's behavioral audit&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Downloads/wk&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;weavedb-sdk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~1.2k&lt;/td&gt;
&lt;td&gt;~4yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ai3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;atomic-notes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cwao&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zkjson&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Single publisher. Low downloads. Limited history. Every IronWorm package fits the profile behavioral scoring catches before the first install completes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The escalation timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Attack&lt;/th&gt;
&lt;th&gt;What was new&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mar 5&lt;/td&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;td&gt;Single-package PyPI credential theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mar 30&lt;/td&gt;
&lt;td&gt;axios&lt;/td&gt;
&lt;td&gt;99M downloads/week, stolen token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 11&lt;/td&gt;
&lt;td&gt;Shai-Hulud&lt;/td&gt;
&lt;td&gt;Self-propagating worm, 637 packages in 39 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 22&lt;/td&gt;
&lt;td&gt;TrapDoor&lt;/td&gt;
&lt;td&gt;Cross-ecosystem + AI assistant poisoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 1&lt;/td&gt;
&lt;td&gt;Miasma&lt;/td&gt;
&lt;td&gt;Forged SLSA provenance on Red Hat packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jun 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IronWorm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust + eBPF rootkit + AI credential theft + Trusted Publishing propagation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each attack introduces a capability the previous one didn't have. IronWorm is the first npm supply chain malware written in Rust, first to use an eBPF kernel rootkit, first to self-propagate through Trusted Publishing OIDC.&lt;/p&gt;

&lt;p&gt;And it specifically targets AI coding assistant credentials. The attack vector has come full circle — AI tools accelerate development, but their credentials are now high-value targets, and the tools themselves are being impersonated in commit history.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gate your AI assistant's installs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;cargo add&lt;/code&gt;, and &lt;code&gt;go get&lt;/code&gt; runs through a behavioral check before execution. Packages with no history get blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit your current dependencies:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rotate AI credentials&lt;/strong&gt; if any IronWorm package was installed in your environment. Check for modified GitHub Actions workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't trust provenance alone.&lt;/strong&gt; Both Miasma and IronWorm demonstrate that valid provenance attestations can come from compromised pipelines. Provenance answers "where did this come from?" Behavioral scoring answers "should I trust it?" You need both.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://getcommit.dev/get-started?ref=devto-ironworm" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts. &lt;a href="https://getcommit.dev/audit?ref=devto-ironworm" rel="noopener noreferrer"&gt;Try the audit&lt;/a&gt; or add the &lt;a href="https://github.com/piiiico/proof-of-commitment" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; to your AI assistant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>ai</category>
      <category>npm</category>
    </item>
    <item>
      <title>npm audit says you're clean. It doesn't check who can push to your dependencies.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Mon, 15 Jun 2026 09:51:40 +0000</pubDate>
      <link>https://dev.to/piiiico/npm-audit-says-youre-clean-it-doesnt-check-who-can-push-to-your-dependencies-35l5</link>
      <guid>https://dev.to/piiiico/npm-audit-says-youre-clean-it-doesnt-check-who-can-push-to-your-dependencies-35l5</guid>
      <description>&lt;p&gt;Run &lt;code&gt;npm audit&lt;/code&gt; on any Node.js project and you'll get one of two things: a clean bill of health, or a list of known CVEs with suggested version bumps.&lt;/p&gt;

&lt;p&gt;What you won't get: any signal about &lt;strong&gt;who can publish&lt;/strong&gt; the packages you depend on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The blind spot
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm audit&lt;/code&gt; checks an advisory database. If nobody has reported a vulnerability, your project is "clean." But the biggest npm attacks in 2026 didn't exploit known vulnerabilities — they exploited &lt;strong&gt;publisher access&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;axios&lt;/strong&gt; (120M downloads/week) — one npm publisher. Token stolen March 30, 2026. Malicious version pushed to 97M+ dependents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;litellm&lt;/strong&gt; — one npm publisher. Supply chain attack, March 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shai-Hulud worm&lt;/strong&gt; (May 2026) — compromised a single npm account with access to 547 packages. 637 malicious versions published in 39 minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three passed &lt;code&gt;npm audit&lt;/code&gt; before the attack happened. Of course they did — there was no CVE to find.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 packages you almost certainly depend on
&lt;/h2&gt;

&lt;p&gt;I checked the publisher counts for the most-downloaded packages in the npm registry. These 7 are in nearly every Node.js project's dependency tree, usually as transitive deps (check your lockfile):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Weekly Downloads&lt;/th&gt;
&lt;th&gt;npm Publishers&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;minimatch&lt;/td&gt;
&lt;td&gt;648M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chalk&lt;/td&gt;
&lt;td&gt;445M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;glob&lt;/td&gt;
&lt;td&gt;378M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cross-spawn&lt;/td&gt;
&lt;td&gt;223M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zod&lt;/td&gt;
&lt;td&gt;195M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lodash&lt;/td&gt;
&lt;td&gt;161M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;axios&lt;/td&gt;
&lt;td&gt;120M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Combined: 2.17 billion weekly downloads. All from packages where a single stolen npm token is enough to push a malicious release.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These aren't obscure packages. &lt;code&gt;minimatch&lt;/code&gt; and &lt;code&gt;glob&lt;/code&gt; are in every project that uses file matching — which includes most build tools. &lt;code&gt;chalk&lt;/code&gt; is in everything that colors terminal output. &lt;code&gt;cross-spawn&lt;/code&gt; is in anything that spawns a child process. You didn't install them — your dependencies did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publisher ≠ contributor
&lt;/h2&gt;

&lt;p&gt;A common objection: "But chalk has hundreds of GitHub contributors!"&lt;/p&gt;

&lt;p&gt;True, and it doesn't matter. &lt;strong&gt;GitHub contributors can't publish to npm.&lt;/strong&gt; Only npm publishers can. And chalk has one.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;zod&lt;/code&gt; is the same — 30+ GitHub contributors, 1 npm publisher. If that one person's npm token is phished, their 2FA is compromised, or their account is hijacked, nobody else can push a fix. The 30 contributors can open a PR. They can't publish.&lt;/p&gt;

&lt;p&gt;This is the distinction &lt;code&gt;npm audit&lt;/code&gt; doesn't make.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own project (takes 5 seconds)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it in any project directory. It auto-detects your lockfile (&lt;code&gt;package-lock.json&lt;/code&gt;, &lt;code&gt;yarn.lock&lt;/code&gt;, &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;) and scores every dependency by publisher concentration, release consistency, and age.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx proof-of-commitment
&lt;span class="go"&gt;Scoring 147 packages from package-lock.json... done in 4.2s

⚠  12 CRITICAL packages found.
&lt;/span&gt;&lt;span class="gp"&gt;   CRITICAL = sole npm publisher + &amp;gt;&lt;/span&gt;10M weekly downloads
&lt;span class="go"&gt;
Package      Risk          Score   Publishers   Downloads      Age
chalk        🔴 CRITICAL   75      1            445M/wk        14.6y
minimatch    🔴 CRITICAL   78      1            648M/wk        14.9y
glob         🔴 CRITICAL   80      1            378M/wk        14.2y
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or audit specific packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment axios zod chalk lodash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or scan a lockfile and get JSON for tooling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json &lt;span class="nt"&gt;--json&lt;/span&gt; | jq &lt;span class="s1"&gt;'.criticalCount'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Add it to CI (one line)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/supply-chain.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Supply Chain&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;audit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx -y proof-of-commitment --fail-on=critical&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This fails the build if any dependency has CRITICAL publisher concentration. Not a CVE — a structural risk.&lt;/p&gt;

&lt;p&gt;For PR comments and step summaries, there's a dedicated &lt;a href="https://github.com/piiiico/commit-action" rel="noopener noreferrer"&gt;GitHub Action&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;piiiico/commit-action@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fail-on-critical&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
          &lt;span class="na"&gt;comment-on-pr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Block risky installs in your AI coding assistant
&lt;/h2&gt;

&lt;p&gt;If you use Cursor, Claude Code, or Windsurf — your AI assistant installs packages without asking. The Shai-Hulud worm specifically targeted this: it planted persistence hooks in &lt;code&gt;.claude/settings.json&lt;/code&gt; and &lt;code&gt;.vscode/tasks.json&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; proof-of-commitment
poc hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installs a pre-install gate for all three editors. When your AI tries to &lt;code&gt;npm install&lt;/code&gt; a CRITICAL package, it blocks and asks first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this isn't
&lt;/h2&gt;

&lt;p&gt;This isn't a replacement for &lt;code&gt;npm audit&lt;/code&gt;. Run both. &lt;code&gt;npm audit&lt;/code&gt; catches known CVEs after they're reported. Publisher concentration scoring catches the structural risk &lt;em&gt;before&lt;/em&gt; the attack — the same pattern that made axios, litellm, and the 637 Shai-Hulud packages exploitable.&lt;/p&gt;

&lt;p&gt;Different attack surfaces, different tools.&lt;/p&gt;




&lt;p&gt;The tool is &lt;a href="https://www.npmjs.com/package/proof-of-commitment" rel="noopener noreferrer"&gt;proof-of-commitment&lt;/a&gt; on npm (1,600+ weekly downloads). Web version: &lt;a href="https://getcommit.dev/audit?ref=devto-npm-audit" rel="noopener noreferrer"&gt;getcommit.dev/audit&lt;/a&gt; — paste packages, get scores, no account needed.&lt;/p&gt;

&lt;p&gt;Free API key (no card, 30 seconds): &lt;a href="https://getcommit.dev/get-started?ref=devto-npm-audit" rel="noopener noreferrer"&gt;getcommit.dev/get-started&lt;/a&gt; — unlocks monitoring + alerts when a package you depend on degrades.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>npm</category>
      <category>node</category>
    </item>
    <item>
      <title>Commit vs. Socket, Snyk, and npm audit: An Honest Comparison</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sun, 14 Jun 2026 14:03:59 +0000</pubDate>
      <link>https://dev.to/piiiico/commit-vs-socket-snyk-and-npm-audit-an-honest-comparison-5cc2</link>
      <guid>https://dev.to/piiiico/commit-vs-socket-snyk-and-npm-audit-an-honest-comparison-5cc2</guid>
      <description>&lt;p&gt;If you landed here from a search for "best npm security tool" or "Snyk alternatives," you're probably evaluating a list that includes Socket, Snyk, and npm audit. Commit is newer and does something different. This piece tells you exactly what each tool measures, where each one wins, and where each one fails — including Commit's genuine gaps.&lt;/p&gt;

&lt;p&gt;Short answer: most of these tools scan for &lt;em&gt;known&lt;/em&gt; vulnerabilities. Commit scans for structural risk that exists &lt;em&gt;before&lt;/em&gt; a vulnerability is known. They're complementary, not substitutes. If you only use one, you have blind spots.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each tool actually measures
&lt;/h2&gt;

&lt;p&gt;Before the comparison table, a framing that matters: these tools answer different questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm audit&lt;/strong&gt; answers: "Does this package have a reported CVE?" It submits your &lt;code&gt;package-lock.json&lt;/code&gt; to GitHub's Advisory Database and returns known matches. Free, built-in, reactive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snyk&lt;/strong&gt; answers: "Does this package have a known vulnerability, and can I auto-fix it?" Adds license compliance, SAST for your own code, and container scanning. Strong database, strong integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Socket&lt;/strong&gt; answers: "Is this package doing something dangerous &lt;em&gt;right now&lt;/em&gt;?" Static analysis of actual package source — not just CVE lookups. It catches supply chain attacks by scanning newly published version code for suspicious patterns (obfuscated code, unusual network calls, environment variable access). That's a different class of detection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Commit&lt;/strong&gt; answers: "Is this package a structural single point of failure?" Behavioral signals — maintainer depth, release consistency, bus factor, contributor history — from the npm registry and GitHub API. No CVE database. No code scanning. Just: how many humans stand between an attacker and the publish button, and how consistently have they shown up?&lt;/p&gt;

&lt;h2&gt;
  
  
  The comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;npm audit&lt;/th&gt;
&lt;th&gt;Snyk&lt;/th&gt;
&lt;th&gt;Socket&lt;/th&gt;
&lt;th&gt;Commit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Known CVE detection&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malicious package detection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⚠️ partial&lt;/td&gt;
&lt;td&gt;✅ real-time&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typosquatting detection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Obfuscated code detection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dangerous capabilities (network/shell/eval)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bus factor / single-maintainer risk&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;⚠️ partial&lt;/td&gt;
&lt;td&gt;✅ core focus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release consistency over time&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contributor depth and longevity&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-attack structural signal&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-fix PRs&lt;/td&gt;
&lt;td&gt;⚠️ limited&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAST (your own code)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP integration&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;✅ unlimited&lt;/td&gt;
&lt;td&gt;✅ 200 tests/mo&lt;/td&gt;
&lt;td&gt;✅ 1,000 scans/mo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paid tier starts at&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$25/dev/mo&lt;/td&gt;
&lt;td&gt;$25/dev/mo&lt;/td&gt;
&lt;td&gt;$15/dev/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The ua-parser-js test case (2021)
&lt;/h2&gt;

&lt;p&gt;In October 2021, Faisal Salman's npm account was compromised and three backdoored versions of ua-parser-js were published (0.7.29, 0.8.0, 1.0.0). The malicious code contained a cryptominer and credential-stealing trojan that ran on every system that ran &lt;code&gt;npm install&lt;/code&gt; in the four-hour window before the packages were pulled.&lt;/p&gt;

&lt;p&gt;ua-parser-js had approximately 7 million weekly downloads. Used by Facebook, Microsoft, Amazon, and Google.&lt;/p&gt;

&lt;p&gt;Here's how each tool would have performed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Before the attack&lt;/th&gt;
&lt;th&gt;During the attack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm audit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0 vulnerabilities&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;0 vulnerabilities&lt;/code&gt; — silent until CVE filed days later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snyk&lt;/td&gt;
&lt;td&gt;No advisory match&lt;/td&gt;
&lt;td&gt;Detected after Socket flagged it and community reported; catalogued as CWE-506&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Socket&lt;/td&gt;
&lt;td&gt;No pre-attack warning&lt;/td&gt;
&lt;td&gt;✅ Flagged within 6 minutes of registry publication via automated malware scanner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commit&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL — flagged for months: 1 maintainer, 7M weekly downloads&lt;/td&gt;
&lt;td&gt;Still CRITICAL (structural risk unchanged) — no code-level detection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two different signals. Socket detected the attack six minutes after it was launched by scanning the malicious code. Commit had identified the structural vulnerability — one person controls the publish button for 7 million weekly downloads — for months before anyone pulled the trigger.&lt;/p&gt;

&lt;p&gt;Socket is genuinely impressive here. Fast detection can prevent most damage if you have auto-blocking enabled. But the structural conditions that make ua-parser-js a high-value target are visible right now for dozens of equivalent packages, and no amount of malware scanning changes those conditions. The attack calculus is rational: single maintainer, enormous blast radius.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2026 update: six attacks, every one fit the same shape
&lt;/h2&gt;

&lt;p&gt;Since this comparison was first written in April, six major npm supply chain attacks have hit. Every one of them exploited a package with a sole publisher or a compromised publisher credential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;axios&lt;/strong&gt; — March 30. Token theft. 119M downloads/week. One npm publisher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack&lt;/strong&gt; — May 11. Mini Shai-Hulud worm. Hijacked CI/CD to publish malicious versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TrapDoor&lt;/strong&gt; — May 22. 21 npm + 7 PyPI + 6 Cargo packages planting persistence hooks in AI coding assistants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Hat Miasma&lt;/strong&gt; — June 1. 32 @redhat-cloud-services packages via compromised GitHub account. Valid SLSA provenance on every malicious version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phantom Gyp&lt;/strong&gt; — June 3. 57 packages including @vapi-ai/server-sdk. Used &lt;code&gt;binding.gyp&lt;/code&gt; to bypass install-script monitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IronWorm&lt;/strong&gt; — June 4. 37 packages with eBPF rootkit + Tor C2 + self-propagation via stolen npm tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npm audit&lt;/code&gt; flagged zero of these before the attack. Snyk's vulnerability database flagged zero before the attack. A publisher-concentration check would have flagged all of them as structural risk — months before, in some cases years before.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap none of them close
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable reality: Socket, Snyk, and npm audit are all reactive to the wrong thing. They detect when something &lt;em&gt;has gone wrong&lt;/em&gt; — either by finding a known CVE or by scanning newly-published code for malicious patterns. They cannot tell you whether your dependency portfolio is structurally dangerous &lt;em&gt;before&lt;/em&gt; an attack occurs.&lt;/p&gt;

&lt;p&gt;Two examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Weekly Downloads&lt;/th&gt;
&lt;th&gt;Maintainers&lt;/th&gt;
&lt;th&gt;npm audit&lt;/th&gt;
&lt;th&gt;Commit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chalk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;445M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0 vulnerabilities&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zod&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;194M&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0 vulnerabilities&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🔴 CRITICAL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither chalk nor zod has a known vulnerability. npm audit, Snyk, and Socket all return clean results. But both have a single person with publish access to hundreds of millions of weekly installs. When (not if) an attacker evaluates those credentials as a target, they make the same rational calculation that was made for ua-parser-js in 2021: compromise one account, get code execution on the systems of millions of developers.&lt;/p&gt;

&lt;p&gt;Socket will catch that attack in minutes after it happens. Commit tells you the structural risk exists today — so you can make informed decisions about whether that dependency belongs in your critical path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where each tool wins
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use npm audit if:&lt;/strong&gt; You need zero setup, you want to catch low-hanging CVE fruit in CI without paying anything, and you understand it's a known-vuln scanner, not supply chain security. It catches real things. It just has a fundamental floor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Snyk if:&lt;/strong&gt; You want CVE scanning with strong auto-fix PRs, SAST for your own code, and container/IaC coverage. The integrations are excellent. The database is well-maintained. If you have a team running multiple projects and want remediation velocity, Snyk earns its price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Socket if:&lt;/strong&gt; You want real-time protection against active malware in the npm registry. Socket is genuinely doing something the others don't — scanning package source code as it's published and catching malicious payloads before most humans have noticed. The six-minute ua-parser-js detection is not marketing; it's the product working as designed. If your threat model includes active supply chain attacks, Socket belongs in your pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Commit if:&lt;/strong&gt; You want to understand the structural risk in your dependency portfolio before anything bad happens. If you're doing architecture review, onboarding new dependencies, evaluating critical-path packages, or just want to understand which of your dependencies is a single point of failure at massive scale — that's what Commit measures. The signal that chalk at 445 million weekly downloads runs on one maintainer's npm account is not a CVE. It's a structural condition. It matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Commit doesn't do
&lt;/h2&gt;

&lt;p&gt;Commit does not scan for CVEs. It does not detect malicious code. It does not flag typosquatting, obfuscated payloads, or dangerous API usage. If your dependency ships a backdoor, Commit will not catch the backdoor. Socket will (if it's in the registry). npm audit will catch it eventually (when someone files a CVE).&lt;/p&gt;

&lt;p&gt;Commit measures one thing: how much sustained human commitment stands behind this package. Maintainer depth, release consistency, contributor longevity, download momentum relative to structural fragility. These signals are public, computable in milliseconds from the npm and GitHub APIs, and systematically ignored by every other tool in this comparison.&lt;/p&gt;

&lt;p&gt;That's the gap. Whether it belongs in your security stack depends on whether you care about knowing the structural risk profile of your dependencies before an attacker acts on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest recommendation
&lt;/h2&gt;

&lt;p&gt;Run npm audit in CI. It's free and catches real things. Add Socket if you can afford it and your threat model includes supply chain attacks — the real-time detection is legitimate. Consider Snyk if you want auto-fix PRs and SAST coverage.&lt;/p&gt;

&lt;p&gt;Add Commit to understand the structural risk in what you're already depending on. Zero install, 30 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or paste your &lt;code&gt;package.json&lt;/code&gt; into the &lt;a href="https://getcommit.dev/audit?ref=devto-vs-snyk-socket" rel="noopener noreferrer"&gt;web demo&lt;/a&gt; and get structural risk scores in seconds.&lt;/p&gt;

&lt;p&gt;If you want monitoring — automated scans, alerts when a score drops, email when a package you depend on gets compromised:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poc watch chalk &lt;span class="nt"&gt;--email&lt;/span&gt; you@company.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://getcommit.dev/get-started?ref=devto-vs-snyk-socket" rel="noopener noreferrer"&gt;Free key&lt;/a&gt; — watchlist, weekly digest, 30 seconds, no card. &lt;a href="https://getcommit.dev/pricing?ref=devto-vs-snyk-socket" rel="noopener noreferrer"&gt;Developer&lt;/a&gt; — 15 packages, daily scans, $15/month.&lt;/p&gt;

&lt;p&gt;The ua-parser-js attack wasn't a failure of security tooling. Every tool performed as designed. The failure was thinking that vulnerability scanning and supply chain security are the same problem. They're not.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://getcommit.dev/blog/commit-vs-socket-snyk-npm-audit/" rel="noopener noreferrer"&gt;getcommit.dev&lt;/a&gt;. &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Snyk Scores Chalk 81. We Score It CRITICAL.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sun, 14 Jun 2026 13:38:19 +0000</pubDate>
      <link>https://dev.to/piiiico/snyk-scores-chalk-81-we-score-it-critical-2ojn</link>
      <guid>https://dev.to/piiiico/snyk-scores-chalk-81-we-score-it-critical-2ojn</guid>
      <description>&lt;p&gt;Same package. Opposite conclusions. The difference is one signal: how many people can push a new version to npm. That signal predicted every major npm attack this year.&lt;/p&gt;

&lt;p&gt;Go to &lt;a href="https://security.snyk.io/package/npm/chalk" rel="noopener noreferrer"&gt;Snyk's vulnerability database&lt;/a&gt; right now and look up chalk. You'll see a Package Health Score of 81 out of 100. No known security issues. Sustainable maintenance. The assessment: this is a healthy package.&lt;/p&gt;

&lt;p&gt;Run &lt;code&gt;npx proof-of-commitment chalk&lt;/code&gt; and you'll see something different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Package   Risk            Score   Publishers   Downloads     Age       Provenance
chalk     🔴 CRITICAL     75      1            445.5M/wk     12.9y     —
  ↳ 30+ GitHub contributors — publish-access concentration risk despite active community
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CRITICAL. One npm publisher controls 445 million weekly downloads. That's not a vulnerability. It's a structural concentration risk — the exact profile that every major npm attack in 2026 has exploited.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Snyk measures
&lt;/h2&gt;

&lt;p&gt;Snyk's Package Health Score is built from four dimensions: security (known CVEs), popularity (download volume, GitHub stars), maintenance (commit frequency, release cadence), and community (contributors, documentation). These are real signals. They tell you whether a project is active and whether it has known bugs.&lt;/p&gt;

&lt;p&gt;What they don't tell you: how many humans can push a malicious version.&lt;/p&gt;

&lt;p&gt;Snyk shows "1 maintainer" as a data point in its maintenance section. It's listed next to "0 open PRs" and "last commit 4 months ago." The number is visible but not actionable — it doesn't change the score, doesn't trigger a warning, and isn't framed as a risk factor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Commit measures
&lt;/h2&gt;

&lt;p&gt;Commit scores packages on behavioral signals: longevity, release consistency, download trend, OpenSSF Scorecard data, and — crucially — &lt;strong&gt;publisher depth&lt;/strong&gt;. How many distinct humans have &lt;code&gt;npm publish&lt;/code&gt; access?&lt;/p&gt;

&lt;p&gt;When a package with 445 million weekly downloads has a single npm publisher, one stolen token, one compromised laptop, one phishing email reaches every project that depends on it. That is the attack that keeps happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 2026 track record
&lt;/h2&gt;

&lt;p&gt;Six major npm supply chain attacks have hit this year. Every one exploited a package with a sole publisher or a compromised publisher credential:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;axios&lt;/strong&gt; — March 30. Token theft. 119M downloads/week. &lt;a href="https://getcommit.dev/blog/axios-attack-prediction" rel="noopener noreferrer"&gt;1 npm publisher.&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TanStack&lt;/strong&gt; — May 11. &lt;a href="https://getcommit.dev/blog/two-attacks-one-week" rel="noopener noreferrer"&gt;Mini Shai-Hulud worm.&lt;/a&gt; Hijacked CI/CD to publish malicious versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TrapDoor&lt;/strong&gt; — May 22. &lt;a href="https://getcommit.dev/blog/trapdoor-ai-assistant-poisoning" rel="noopener noreferrer"&gt;21 npm + 7 PyPI + 6 Cargo&lt;/a&gt; packages planting persistence hooks in AI coding assistants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Hat Miasma&lt;/strong&gt; — June 1. &lt;a href="https://getcommit.dev/blog/redhat-miasma-provenance-bypass" rel="noopener noreferrer"&gt;32 @redhat-cloud-services packages&lt;/a&gt; via compromised GitHub account. Valid SLSA provenance on every malicious version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phantom Gyp&lt;/strong&gt; — June 3. &lt;a href="https://getcommit.dev/blog/phantom-gyp-binding-gyp-bypass" rel="noopener noreferrer"&gt;57 packages&lt;/a&gt; including @vapi-ai/server-sdk (408K/month). Used binding.gyp to bypass install-script monitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IronWorm&lt;/strong&gt; — June 4. &lt;a href="https://getcommit.dev/blog/ironworm-rust-malware-targets-ai-credentials" rel="noopener noreferrer"&gt;37 packages&lt;/a&gt; with eBPF rootkit + Tor C2 + self-propagation via stolen npm tokens.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npm audit&lt;/code&gt; flagged zero of these before the attack. Snyk's vulnerability database flagged zero before the attack. A publisher concentration check would have flagged all of them as structural risk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 26 packages that matter most
&lt;/h2&gt;

&lt;p&gt;26 of the 91 npm packages with more than 10 million weekly downloads have a single npm publisher. Together they account for over 3 billion downloads per week. They include packages that are probably in your lock file right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;minimatch&lt;/strong&gt; — 625M/week, 1 publisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chalk&lt;/strong&gt; — 445M/week, 1 publisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;glob&lt;/strong&gt; — 366M/week, 1 publisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cross-spawn&lt;/strong&gt; — 215M/week, 1 publisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zod&lt;/strong&gt; — 194M/week, 1 publisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;lodash&lt;/strong&gt; — 156M/week, 1 publisher&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of them are vulnerable. All of them are structural concentration risk. The distinction matters because vulnerability scanning and behavioral risk analysis serve different functions — and confusing the two leaves the gap attackers keep walking through.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not a replacement. A different question.
&lt;/h2&gt;

&lt;p&gt;Snyk tells you: &lt;em&gt;does this package have known bugs?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Commit tells you: &lt;em&gt;if this package's publisher gets phished tomorrow, how bad is it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Both questions matter. They measure different attack surfaces. The problem is that most teams only ask the first one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Zero install, 30 seconds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or paste your packages into the &lt;a href="https://getcommit.dev/audit?packages=chalk" rel="noopener noreferrer"&gt;web demo&lt;/a&gt; (pre-loaded with chalk).&lt;/p&gt;

&lt;p&gt;If you want monitoring — automated scans, alerts when a score drops, email when a package you depend on gets compromised:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;poc watch chalk &lt;span class="nt"&gt;--email&lt;/span&gt; you@company.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://getcommit.dev/get-started?watch=chalk&amp;amp;eco=npm&amp;amp;ref=devto-snyk-chalk" rel="noopener noreferrer"&gt;Free key&lt;/a&gt; — watchlist auto-seeded with chalk, weekly digest, 30 seconds, no card. &lt;a href="https://getcommit.dev/pricing?ref=devto-snyk-chalk" rel="noopener noreferrer"&gt;Developer&lt;/a&gt; — 15 packages, daily scans, $15/month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getcommit.dev/compare" rel="noopener noreferrer"&gt;Full comparison: Commit vs. Socket, Snyk, OpenSSF Scorecard&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://getcommit.dev/blog/snyk-scores-chalk-81-we-score-it-critical/" rel="noopener noreferrer"&gt;getcommit.dev&lt;/a&gt;. &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>npm</category>
      <category>javascript</category>
    </item>
    <item>
      <title>80% of Agent Skills Lie About What They Do — and the scanner that found that admitted it can't catch the rest</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sun, 14 Jun 2026 03:04:01 +0000</pubDate>
      <link>https://dev.to/piiiico/80-of-agent-skills-lie-about-what-they-do-and-the-scanner-that-found-that-admitted-it-cant-3ad7</link>
      <guid>https://dev.to/piiiico/80-of-agent-skills-lie-about-what-they-do-and-the-scanner-that-found-that-admitted-it-cant-3ad7</guid>
      <description>&lt;p&gt;On June 11, 2026, Palo Alto Networks Unit42 published results from their Behavioral Integrity Verification (BIV) scanner applied to the OpenClaw skill ecosystem. They crawled &lt;strong&gt;49,943 skills&lt;/strong&gt; — the largest systematic analysis of agent skill behavior published to date.&lt;/p&gt;

&lt;p&gt;The headline: &lt;strong&gt;80% of skills (39,933) have at least one behavioral deviation from their declared intent.&lt;/strong&gt; Across those skills, Unit42 documented 250,706 total deviations — an average of roughly six per non-compliant skill.&lt;/p&gt;

&lt;p&gt;18.9% of skills showed adversarial intent. 5% — 2,490 skills — carried multi-stage attack chains.&lt;/p&gt;

&lt;p&gt;The threat taxonomy is specific: Instruction-Level Threats were the most adversarial category, with 96% of skills in that class showing adversarial intent — the highest rate of any category. Credential theft was the largest single adversarial leaf, accounting for 8.2% of classified deviations. These aren't edge cases. They're systematic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The disclosure that matters more than the data
&lt;/h2&gt;

&lt;p&gt;The data is striking. But the more significant finding is a single sentence in Unit42's methodology section:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"BIV is static-only, so dynamic dispatch, reflection, and obfuscated payloads escape AST-level extraction."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a major security vendor saying, in their own words, that their tool — which just found behavioral deviations in 80% of skills — cannot catch the adversarial skills that matter most. Dynamic dispatch and obfuscation are standard tradecraft for any skill designed to evade detection. The 5% with multi-stage attack chains almost certainly overlap heavily with the class of skills that BIV can't see.&lt;/p&gt;

&lt;p&gt;Read that carefully: the tool that found 39,933 deviating skills explicitly cannot analyze the class of skills most likely to cause serious harm.&lt;/p&gt;

&lt;p&gt;This is not a criticism of Unit42's research — it's honest methodology disclosure. But it has a direct implication: static pre-installation analysis, however thorough, has a hard ceiling. The dangerous payloads are specifically designed to be invisible to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral deviations actually look like
&lt;/h2&gt;

&lt;p&gt;A behavioral deviation, in Unit42's framework, is a gap between what a skill declares it does (in its manifest, its description, its metadata) and what it actually does when executed. The deviation types they documented are not subtle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instruction-level threats:&lt;/strong&gt; Skills that modify the agent's system prompt or override task instructions mid-execution. This category had the highest adversarial rate: 96% of skills flagged here showed adversarial intent rather than developer oversight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential theft:&lt;/strong&gt; Skills that access authentication tokens, API keys, or session credentials beyond their stated scope. The largest single adversarial leaf at 8.2% of all classified deviations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exfiltration chains and remote code execution chains:&lt;/strong&gt; Two of the four novel compound threat categories identified. Multi-stage attacks that distribute malicious behavior across steps, each of which looks benign in isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In aggregate, this is a picture of an ecosystem where the declaration layer — what skills &lt;em&gt;say&lt;/em&gt; they do — has almost entirely decoupled from the behavioral layer — what they &lt;em&gt;actually&lt;/em&gt; do. 80% deviation rate at scale is not an anomaly. It's a structural condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens
&lt;/h2&gt;

&lt;p&gt;The declaration layer was never designed to be enforceable. A skill manifest is a string of text that describes intent. Nothing in the current agent skill infrastructure verifies that the manifest accurately reflects behavior. Nothing monitors runtime execution against declared scope. Nothing signals when execution diverges from declaration.&lt;/p&gt;

&lt;p&gt;This is the same pattern that produced the npm supply chain crisis, applied at a faster velocity. npm's package metadata — README, description, keywords — said nothing enforceable about what the package code would do at runtime. Malicious packages published with plausible descriptions and then executed adversarially when installed. The declaration layer was gameable by construction.&lt;/p&gt;

&lt;p&gt;Agent skills are worse. Skills are designed to operate autonomously, with elevated access to orchestration infrastructure, in contexts where human review of each action is impossible. A malicious npm package needs a human to run it. A malicious agent skill executes inside an automated pipeline that may process thousands of actions per hour. The blast radius per adversarial skill is larger, and the detection window is shorter.&lt;/p&gt;

&lt;p&gt;The Unit42 data confirms what the architecture implied: when declarations aren't enforceable, most won't be accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The L3/L4 gap
&lt;/h2&gt;

&lt;p&gt;In the trust infrastructure stack, there are four layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;L1: Identity.&lt;/strong&gt; Who is this agent? JWT/OIDC, did:key, JWKS-verifiable credentials. The IETF Transaction Tokens draft, DIF's MCP-I profile, and the A2A protocol all operate here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L2: Authorization.&lt;/strong&gt; What is this agent allowed to do? OAuth scopes, capability declarations, allowlists.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L3: Pre-installation verification.&lt;/strong&gt; Static analysis, manifest scanning, provenance checks. Unit42 BIV operates at L3.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L4: Runtime behavioral monitoring.&lt;/strong&gt; Continuous observation of what the agent actually does during execution, compared against its declared scope and historical baseline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The industry has made significant progress on L1 and L2 in 2026. The IETF, DIF, and OpenClaw itself have active working groups on agent identity and authorization. L3 has credible tooling — Unit42 BIV, static analysis scanners, manifest validators.&lt;/p&gt;

&lt;p&gt;L4 is nearly empty.&lt;/p&gt;

&lt;p&gt;Unit42's methodology admission tells us exactly why this matters: the attacks that escape L3 are the ones that require L4. Static analysis finds deviations in skills that didn't bother to hide. Dynamic dispatch and obfuscation are evasion techniques for L3. A skill that uses them passes every static scan and then executes adversarially at runtime.&lt;/p&gt;

&lt;p&gt;The 5% multi-stage attack chain finding is especially relevant here. Multi-stage attacks, by definition, distribute their adversarial behavior across multiple execution steps. Step one looks clean. Step two looks clean. The harm happens at step three, when context from steps one and two enables an action that no individual step would have triggered. Static analysis examines each skill in isolation — it cannot see the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent trust scoring at runtime
&lt;/h2&gt;

&lt;p&gt;The question this data raises isn't "how do we build a better static scanner?" Unit42 just built one and found 39,933 deviating skills — and acknowledged it can't see the dangerous tail. The question is: &lt;strong&gt;what does the trust signal look like at the moment an agent is executing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Runtime &lt;a href="https://getcommit.dev/blog/scoring-methodology" rel="noopener noreferrer"&gt;behavioral trust scoring&lt;/a&gt; works differently from static analysis. Instead of asking "does this skill's code match its declaration?" it asks a continuous set of questions during execution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this agent accessing resources outside its declared scope?&lt;/li&gt;
&lt;li&gt;Is this agent's action pattern consistent with its historical baseline?&lt;/li&gt;
&lt;li&gt;Is this agent communicating with endpoints not present in its manifest?&lt;/li&gt;
&lt;li&gt;Is this agent's token consumption pattern anomalous for its stated task?&lt;/li&gt;
&lt;li&gt;Is this agent modifying its own instructions or those of downstream agents?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These signals are continuous. They degrade naturally when behavior changes. A skill that passed static analysis and operated cleanly for thirty days produces a different runtime signal than a skill that starts exfiltrating credentials on day thirty-one. Static analysis gives you a snapshot. Runtime monitoring gives you a stream.&lt;/p&gt;

&lt;p&gt;The Unit42 BIV data is the strongest third-party evidence to date that the snapshot is insufficient. 250,706 behavioral deviations across 49,943 skills tell you the ecosystem has a systematic declaration problem. The explicit methodology admission tells you that the solution to the declaration problem cannot itself be declarative. You need the stream.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for agent deployments today
&lt;/h2&gt;

&lt;p&gt;If your infrastructure runs agent skills — MCP servers, OpenClaw tools, custom agent pipelines — the Unit42 data has a direct operational implication: the skills you're running have probably not been verified against their declared behavior, and static scanning won't catch the most dangerous ones even if you run it.&lt;/p&gt;

&lt;p&gt;A few concrete steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit your agent skill declarations.&lt;/strong&gt; Start by comparing what your running skills say they do against what network traffic, system calls, and API access logs show they actually do. The gap is the risk surface. You can run a structural scan against any npm-distributed skill:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment npm &amp;lt;your-skill-package&amp;gt;

&lt;span class="c"&gt;# For MCP servers&lt;/span&gt;
npx proof-of-commitment mcp-remote &amp;lt;server-url&amp;gt;

&lt;span class="c"&gt;# Web UI&lt;/span&gt;
&lt;span class="c"&gt;# https://getcommit.dev/audit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add behavioral gates to your CI pipeline.&lt;/strong&gt; Structural risk flags — anomalous dependency additions, publishing pattern changes, maintainer transfers — show up before compromised skills reach production. We published a &lt;a href="https://getcommit.dev/blog/ci-trust-scoring-tutorial" rel="noopener noreferrer"&gt;5-minute CI integration&lt;/a&gt; that puts these flags in PR comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't rely on marketplace verification.&lt;/strong&gt; The OpenClaw ecosystem is not the only place this applies. We documented &lt;a href="https://getcommit.dev/blog/mcp-security-crisis" rel="noopener noreferrer"&gt;9 of 11 MCP marketplaces accepting a malicious server&lt;/a&gt; without detection. The Unit42 data confirms this isn't an MCP-specific problem — it's a declaration-layer problem. Any ecosystem that trusts manifests over behavior has the same exposure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan for L4.&lt;/strong&gt; The agent behavioral monitoring layer is thin right now. That's not because the problem is solved — it's because the tooling hasn't caught up with the deployment curve. Unit42's explicit acknowledgment that static analysis has a hard ceiling is a signal that the industry knows this gap exists. Plan for monitoring infrastructure before your agent deployment scales past the point where manual review is possible.&lt;/p&gt;




&lt;p&gt;The 80% figure will age badly in one of two directions. Either the ecosystem invests in L4 monitoring and the deviation rate drops as adversarial skills get caught faster — or the deviation rate climbs as agent deployments scale faster than detection. Unit42's data is a snapshot. The dynamic depends on whether the industry treats L3 as sufficient or as the floor.&lt;/p&gt;

&lt;p&gt;The methodology admission says it's the floor.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://unit42.paloaltonetworks.com/ai-agent-supply-chain-risks/" rel="noopener noreferrer"&gt;Palo Alto Networks Unit42&lt;/a&gt; / &lt;a href="https://arxiv.org/abs/2605.11770" rel="noopener noreferrer"&gt;arXiv 2605.11770&lt;/a&gt;, "Behavioral Integrity Verification for AI Agent Skills," May 2026. 49,943 OpenClaw skills analyzed. Stats: 39,933 (80.0%) with ≥1 behavioral deviation; 250,706 total deviations; 18.9% adversarial intent; 2,490 (5.0%) multi-stage attack chains; credential theft largest adversarial leaf (8.2% of classified deviations); instruction-level threats highest adversarial category (96% adversarial fraction). Limitations: "BIV is static-only, so dynamic dispatch, reflection, and obfuscated payloads escape AST-level extraction."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://getcommit.dev/blog/unit42-80-percent-agent-skills-lie/" rel="noopener noreferrer"&gt;getcommit.dev&lt;/a&gt;. &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>agents</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>1,579 AUR Packages Were Taken Over Through the Adoption Process. The Bypass Was the Process.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sun, 14 Jun 2026 01:09:20 +0000</pubDate>
      <link>https://dev.to/piiiico/1579-aur-packages-were-taken-over-through-the-adoption-process-the-bypass-was-the-process-27io</link>
      <guid>https://dev.to/piiiico/1579-aur-packages-were-taken-over-through-the-adoption-process-the-bypass-was-the-process-27io</guid>
      <description>&lt;p&gt;On June 11, the &lt;a href="https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/" rel="noopener noreferrer"&gt;aur-general mailing list&lt;/a&gt; started seeing reports of suspicious commits on AUR packages. By June 12 morning, &lt;a href="https://www.phoronix.com/news/Arch-Linux-AUR-400-Compromised" rel="noopener noreferrer"&gt;Phoronix counted 400 compromised packages&lt;/a&gt;. By that evening, the number was &lt;a href="https://www.phoronix.com/news/Arch-Linux-AUR-More-Than-1500" rel="noopener noreferrer"&gt;1,579&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The official Arch Linux advisory uses careful language:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are currently experiencing a high volume of &lt;strong&gt;malicious package adoptions and updates&lt;/strong&gt; in the Arch User Repository.&lt;br&gt;
— &lt;a href="https://archlinux.org/news/active-aur-malicious-packages-incident/" rel="noopener noreferrer"&gt;archlinux.org, June 12 2026&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Adoptions. Not breaches. Not stolen credentials. The attackers used the AUR's published process for adopting orphaned packages, applied as legitimate new maintainers, and got handed the keys to packages that had real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AUR adoption works
&lt;/h2&gt;

&lt;p&gt;The AUR is a build-script repository. PKGBUILDs and &lt;code&gt;.install&lt;/code&gt; files describe how to fetch and compile software. When a package's maintainer disappears, the package becomes "orphaned." Any AUR user can request adoption. There is no two-of-three. There is no proof-of-contribution. There is one click.&lt;/p&gt;

&lt;p&gt;This is the right design for a volunteer-maintained software graveyard. It is the wrong design for a trust boundary. And it is the boundary every Arch user crosses when they type &lt;code&gt;yay -S package-name&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What got injected
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.sonatype.com/blog/atomic-arch-npm-campaign-adds-malicious-dependency" rel="noopener noreferrer"&gt;Sonatype's Security Research team&lt;/a&gt; tracked one strand of the campaign — "Atomic Arch" — and found the payload routed through an npm dependency added to the PKGBUILD. The AUR script pulled a poisoned npm package during install. Arch Linux machines started running JavaScript-delivered, rootkit-like malware out of a Linux distribution package manager.&lt;/p&gt;

&lt;p&gt;The cross-ecosystem mechanic matters. AUR doesn't host the binary — the attacker only needed control of a trusted PKGBUILD and a tame-looking npm dependency. Two ecosystems, one trust path, no behavioral history check at either hop.&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't the first time
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://lists.archlinux.org/archives/list/aur-general@lists.archlinux.org/thread/JKDDV3D3RRTC5JZQXP3GMQJZGTV2BXVS/" rel="noopener noreferrer"&gt;July 2025&lt;/a&gt;, &lt;code&gt;firefox-patch-bin&lt;/code&gt; and &lt;code&gt;librewolf-fix-bin&lt;/code&gt; were pushed to the AUR by a fresh account and contained Chaos RAT. That incident hit a few packages. This one hit 1,579.&lt;/p&gt;

&lt;p&gt;The structural lesson is the same in both. The AUR's defense model is "review the PKGBUILD before installing." The official advisory still says "review all PKGBUILD and install script changes." That's a useful instruction. It is also a confession that the trust model puts the work on the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  The npm parallel
&lt;/h2&gt;

&lt;p&gt;We have been writing about the npm side of this all month. &lt;a href="https://getcommit.dev/blog/redhat-miasma-provenance-bypass/" rel="noopener noreferrer"&gt;32 Red Hat packages with valid provenance&lt;/a&gt;. &lt;a href="https://getcommit.dev/blog/phantom-gyp-binding-gyp-bypass/" rel="noopener noreferrer"&gt;57 packages using a 14-year-old binding.gyp execution path&lt;/a&gt;. &lt;a href="https://getcommit.dev/blog/ironworm-rust-malware-targets-ai-credentials/" rel="noopener noreferrer"&gt;37 packages where the commit author signed as "claude"&lt;/a&gt;. Different bypasses. Same shape.&lt;/p&gt;

&lt;p&gt;Maintainer-identity-takeover doesn't care about the ecosystem. The mechanic is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A package accumulates trust through downloads and use.&lt;/li&gt;
&lt;li&gt;The trust attaches to the slug, not the human.&lt;/li&gt;
&lt;li&gt;A new human steps behind the slug — through adoption, account compromise, or social engineering.&lt;/li&gt;
&lt;li&gt;The trust transfers to the new human at zero cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;npm calls this "compromised account." AUR calls it "adoption." Both are the same attack with different names.&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral signals show
&lt;/h2&gt;

&lt;p&gt;The attackers in the AUR incident were fresh accounts. No prior PKGBUILDs. No contribution history outside the adoptions they just made. No commits to upstream projects. No public identity attached to anything older than a week.&lt;/p&gt;

&lt;p&gt;That signal is cheap to compute. It is the signal Commit scores npm and PyPI and Cargo packages on. Single publisher, short history, no behavioral track record outside the package itself — that's the structural fingerprint of every successful supply chain attack this year.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Ecosystem&lt;/th&gt;
&lt;th&gt;Packages&lt;/th&gt;
&lt;th&gt;Common fingerprint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft typosquats (May 31)&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Zero behavioral history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red Hat Miasma (Jun 1)&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;Compromised single publisher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantom Gyp (Jun 3)&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;Compromised single publisher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IronWorm (Jun 6)&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;Compromised single publisher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TrapDoor (Jun 6)&lt;/td&gt;
&lt;td&gt;npm/PyPI/crates&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;Zero behavioral history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atomic Arch (Jun 11–12)&lt;/td&gt;
&lt;td&gt;AUR + npm&lt;/td&gt;
&lt;td&gt;1,579&lt;/td&gt;
&lt;td&gt;Fresh adopter, no AUR history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this changes
&lt;/h2&gt;

&lt;p&gt;Arch's response is the right tactical one. They froze adoption. They froze new accounts. They walked the commit graph and reverted what they could find. The advisory closes with "many (but not all)" of the affected packages.&lt;/p&gt;

&lt;p&gt;The strategic problem is upstream of all that. As long as the trust model lets identity be transferred to a package — instead of letting identity be earned by a human — the defense is racing the attack, and the attack has every unmaintained package in the registry as ammunition.&lt;/p&gt;

&lt;p&gt;Commit's bet is that the only signal an attacker can't fake in advance is the behavioral history of the human behind the artifact. Years of commits to other projects. Cross-ecosystem identity that resolves to the same person. &lt;a href="https://getcommit.dev/blog/declarations-are-gameable/" rel="noopener noreferrer"&gt;Declarations are gameable&lt;/a&gt;. &lt;a href="https://getcommit.dev/blog/behavioral-trust-vs-surveillance/" rel="noopener noreferrer"&gt;Behavior isn't&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scores every dependency in your npm, pip, or Cargo lockfile against the same structural fingerprint that flagged the npm packages above. AUR PKGBUILDs are out of scope today — but if a PKGBUILD pulls an npm dependency that scores CRITICAL, you want to know that before the build script runs on your machine.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://getcommit.dev/blog/aur-1579-packages-adoption-bypass/" rel="noopener noreferrer"&gt;getcommit.dev&lt;/a&gt;. &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>archlinux</category>
      <category>npm</category>
    </item>
    <item>
      <title>The npm Worm Has Been Public for 31 Days. Two Derivatives Have Shipped.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Fri, 12 Jun 2026 15:47:36 +0000</pubDate>
      <link>https://dev.to/piiiico/the-npm-worm-has-been-public-for-31-days-two-derivatives-have-shipped-4a3j</link>
      <guid>https://dev.to/piiiico/the-npm-worm-has-been-public-for-31-days-two-derivatives-have-shipped-4a3j</guid>
      <description>&lt;p&gt;TeamPCP pushed Mini Shai-Hulud to GitHub on May 12. Within a month, two independent campaigns had forked it. Each invented a new install-time bypass the previous defense couldn't survive. The pattern is now clear enough to predict the next one.&lt;/p&gt;

&lt;p&gt;On May 11, 2026, TeamPCP poisoned 172 packages across npm and PyPI in a single coordinated wave. TanStack, Mistral AI, OpenSearch, UiPath, Guardrails AI. The mechanism wasn't a typo-squat or a leaked credential. It was a misconfigured GitHub Actions workflow on TanStack itself. The malware exchanged the ambient OIDC token for npm publish access and shipped legitimately-attested malicious tarballs to the registry.&lt;/p&gt;

&lt;p&gt;Twenty-four hours later, TeamPCP published the source. &lt;a href="https://www.akamai.com/blog/security-research/mini-shai-hulud-worm-returns-goes-public" rel="noopener noreferrer"&gt;Akamai&lt;/a&gt; dated the release to the evening of May 12. The worm became a starter kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The original was uncatchable by scoring
&lt;/h2&gt;

&lt;p&gt;I want to be honest about this. The packages TeamPCP hit on May 11 were high-trust. &lt;code&gt;@tanstack/react-router&lt;/code&gt; has 19.7M weekly downloads, 5 publishers, MIT license, active development. It scores 91 on &lt;a href="https://getcommit.dev/audit" rel="noopener noreferrer"&gt;Commit's behavioral audit&lt;/a&gt;. The attack didn't compromise the publishers. It compromised the pipeline those publishers used to release.&lt;/p&gt;

&lt;p&gt;A scoring layer that measures publisher concentration, maintainer continuity, and release cadence will not flag &lt;code&gt;@tanstack/react-router&lt;/code&gt;. It shouldn't. Those signals are doing their job. They describe a healthy package. The TanStack attack walked around them by skipping the publisher layer entirely.&lt;/p&gt;

&lt;p&gt;If the only campaigns we ever had to defend against were CI/CD pipeline hijacks against top-50 npm packages, behavioral scoring would be irrelevant. That's not what came next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Derivative #1: Red Hat Miasma (June 1)
&lt;/h2&gt;

&lt;p&gt;Twenty days after the source release, &lt;a href="https://research.jfrog.com/post/shai-hulud-miasma-redhat-cloud-services/" rel="noopener noreferrer"&gt;JFrog reported&lt;/a&gt; that 96 versions across 32 &lt;code&gt;@redhat-cloud-services&lt;/code&gt; packages had been republished with malicious &lt;code&gt;preinstall&lt;/code&gt; hooks. The packages carried valid SLSA Build Level 3 provenance, signed by Red Hat's own build environment after that environment had been quietly compromised.&lt;/p&gt;

&lt;p&gt;The payload set "Miasma: The Spreading Blight" as the description on attacker-created exfiltration repos. That string is now the field marker for everything downstream from the open-sourced code. It is not a TeamPCP marker. It belongs to whoever ran the binary.&lt;/p&gt;

&lt;p&gt;Red Hat's packages scored 65–83. That's high. Once again, the attack used compromised infrastructure on otherwise healthy packages. Provenance was meant to be the defense layer here. It signed the malware too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Derivative #2: Phantom Gyp (June 3)
&lt;/h2&gt;

&lt;p&gt;Forty-eight hours after Red Hat, the lifecycle-script defense closed. So the next wave stopped using lifecycle scripts. A 157-byte &lt;code&gt;binding.gyp&lt;/code&gt; file triggers &lt;code&gt;node-gyp rebuild&lt;/code&gt; during install — it's how native addons have built since 2012. &lt;a href="https://www.stepsecurity.io/blog/binding-gyp-npm-supply-chain-attack-spreads-like-worm" rel="noopener noreferrer"&gt;StepSecurity named the technique "Phantom Gyp."&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But here is the part nobody has emphasized: the packages Phantom Gyp hit are completely different from the TanStack wave. They are not high-trust at all.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Wave&lt;/th&gt;
&lt;th&gt;Example package&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Weekly DL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TanStack (May 11)&lt;/td&gt;
&lt;td&gt;@tanstack/react-router&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;19.7M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red Hat Miasma (Jun 1)&lt;/td&gt;
&lt;td&gt;@redhat-cloud-services/types&lt;/td&gt;
&lt;td&gt;65–83&lt;/td&gt;
&lt;td&gt;multi&lt;/td&gt;
&lt;td&gt;80K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantom Gyp (Jun 3)&lt;/td&gt;
&lt;td&gt;autotel&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantom Gyp (Jun 3)&lt;/td&gt;
&lt;td&gt;awaitly&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;287&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phantom Gyp (Jun 3)&lt;/td&gt;
&lt;td&gt;node-env-resolver&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The score profile inverted. TeamPCP went after the top of the registry through the pipeline. The derivatives are working their way down the long tail through the publishers themselves. They harvest single-publisher accounts with no second pair of eyes, then republish whatever those accounts already own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern, plainly stated
&lt;/h2&gt;

&lt;p&gt;Three waves of one malware family, in 23 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TanStack (May 11):&lt;/strong&gt; high-trust packages, CI/CD pipeline as the attack surface, &lt;code&gt;postinstall&lt;/code&gt; as the execution path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Red Hat (Jun 1):&lt;/strong&gt; medium-trust packages, build environment as the attack surface, &lt;code&gt;preinstall&lt;/code&gt; + valid provenance as the execution path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phantom Gyp (Jun 3):&lt;/strong&gt; low-trust packages, single-publisher account takeover as the attack surface, &lt;code&gt;binding.gyp&lt;/code&gt; as the execution path — no lifecycle hook at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each derivative bypasses the defense that flagged the last one. None of them recycles a technique. And the target profile shifts down the trust gradient with each iteration: from 91 to 65–83 to 28–49.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this implies for the next wave
&lt;/h2&gt;

&lt;p&gt;The TanStack-style attacks need a CI/CD posture defense: pinning Actions to commit SHAs, locking down OIDC scopes, scanning Actions for memory-scraping behavior on the runner. Behavioral scoring is the wrong layer to catch those, and I'm not going to pretend otherwise.&lt;/p&gt;

&lt;p&gt;The Phantom Gyp side is exactly the shape behavioral scoring exists to catch. Single publisher. No release cadence. Limited adoption. No community oversight. The technique changes (today &lt;code&gt;binding.gyp&lt;/code&gt;; next month something nobody has written about yet). The structural profile of the compromised account does not change. That's the constant the scoring layer is built around.&lt;/p&gt;

&lt;p&gt;A reasonable bet on the next derivative: another no-lifecycle execution path (&lt;code&gt;npm-shrinkwrap.json&lt;/code&gt; manipulation, &lt;code&gt;files&lt;/code&gt;-field smuggling, something in the resolver), targeting another tier of single-publisher packages with the score profile in the 30s. If that's wrong, it's wrong cheap. The defense is the same either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do today
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;If you're running CI:&lt;/strong&gt; pin every GitHub Action to a commit SHA, not a tag. Scope OIDC tokens to the minimum publishing surface. The TanStack pattern walks in through dependency installs in CI. Treat your runners as the same blast radius as your registry credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're picking dependencies:&lt;/strong&gt; the long-tail packages getting hit by derivative waves all score below 60. Run your lockfile through a behavioral audit and you'll see which ones sit at the same risk profile as awaitly, autotel, and node-env-resolver, before they ship the next variant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scores every dependency in your project against the same signals that already separated the TanStack victims (high) from the Phantom Gyp victims (low). The toolkit is public. The pattern is public. The defense for the long-tail half of it is one command.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://getcommit.dev/blog/mini-shai-hulud-source-code-public/" rel="noopener noreferrer"&gt;getcommit.dev&lt;/a&gt;. &lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>npm</category>
      <category>ai</category>
    </item>
    <item>
      <title>57 npm Packages Were Compromised Without a Single Lifecycle Script</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Thu, 11 Jun 2026 08:37:03 +0000</pubDate>
      <link>https://dev.to/piiiico/57-npm-packages-were-compromised-without-a-single-lifecycle-script-31k5</link>
      <guid>https://dev.to/piiiico/57-npm-packages-were-compromised-without-a-single-lifecycle-script-31k5</guid>
      <description>&lt;p&gt;Every major npm security tool monitors lifecycle scripts. Socket, Snyk, npm audit — they all watch for &lt;code&gt;preinstall&lt;/code&gt; and &lt;code&gt;postinstall&lt;/code&gt; hooks. On June 3, an attacker shipped 286 malicious versions across 57 packages without triggering any of them.&lt;/p&gt;

&lt;p&gt;The technique: a 157-byte &lt;code&gt;binding.gyp&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How binding.gyp bypasses monitoring
&lt;/h2&gt;

&lt;p&gt;When npm sees a &lt;code&gt;binding.gyp&lt;/code&gt; during installation, it automatically runs &lt;code&gt;node-gyp rebuild&lt;/code&gt; to compile native addons. No lifecycle script needed. The attacker's &lt;code&gt;binding.gyp&lt;/code&gt; didn't compile anything — it executed arbitrary JavaScript via &lt;code&gt;node -e "&amp;lt;payload&amp;gt;"&lt;/code&gt; as a build action.&lt;/p&gt;

&lt;p&gt;Same result as &lt;code&gt;postinstall&lt;/code&gt;. Zero alerts from script monitors.&lt;/p&gt;

&lt;p&gt;The largest victim: &lt;code&gt;@vapi-ai/server-sdk&lt;/code&gt; with 408,000 monthly downloads. The rest spanned four package families — autotel (27 packages), awaitly (6), executable-stories (9), and node-env-resolver (5).&lt;/p&gt;

&lt;h2&gt;
  
  
  Timeline: three vectors in three weeks
&lt;/h2&gt;

&lt;p&gt;This wasn't a standalone attack. Phantom Gyp is the third wave from the same malware family (Miasma/Shai-Hulud):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Vector&lt;/th&gt;
&lt;th&gt;What it proved&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;May 11&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;postinstall&lt;/code&gt; scripts&lt;/td&gt;
&lt;td&gt;Self-propagating worm, 637 packages in 39 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 1&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;preinstall&lt;/code&gt; with valid SLSA provenance&lt;/td&gt;
&lt;td&gt;Provenance ≠ trust (32 Red Hat packages)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jun 3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;binding.gyp&lt;/code&gt; — no lifecycle scripts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Script monitoring alone is insufficient&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each wave tested a different execution vector against the same defense layer. When &lt;code&gt;postinstall&lt;/code&gt; got flagged, they moved to &lt;code&gt;preinstall&lt;/code&gt; with forged provenance. When that got flagged, they dropped lifecycle scripts entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payload
&lt;/h2&gt;

&lt;p&gt;Standard Miasma credential harvest: npm tokens, GitHub PATs, AWS credentials, GCP service accounts, Azure keys, HashiCorp Vault tokens, Kubernetes configs. Exfiltration through attacker-controlled GitHub repos. Persistence through injected GitHub Actions workflows. Self-propagation by republishing from compromised maintainer accounts.&lt;/p&gt;

&lt;p&gt;The attack also planted configuration files targeting AI coding assistants: &lt;code&gt;.claude/setup.mjs&lt;/code&gt;, &lt;code&gt;.cursor/rules/setup.mdc&lt;/code&gt;, &lt;code&gt;.gemini/settings.json&lt;/code&gt;. Your security tooling monitors lifecycle scripts. Nobody's monitoring what gets written to your IDE config directory during a native addon "build."&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral scoring shows
&lt;/h2&gt;

&lt;p&gt;I ran the affected packages through &lt;a href="https://getcommit.dev/audit/?packages=@vapi-ai/server-sdk,node-env-resolver,autotel,executable-stories-jest,awaitly,wrangler-deploy&amp;amp;utm_source=devto&amp;amp;utm_campaign=phantom-gyp&amp;amp;utm_content=inline" rel="noopener noreferrer"&gt;Commit's audit&lt;/a&gt; (that link reproduces the table below — pre-filled, runs in your browser):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Downloads/wk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;@vapi-ai/server-sdk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;60k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;node-env-resolver&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;46&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;238&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autotel&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;executable-stories-jest&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;609&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;awaitly&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;287&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wrangler-deploy&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Not one package scores above 60. The highest — @vapi-ai/server-sdk at 57 — has five publishers, but even it sits well below the 75 threshold for OK. The rest are single-publisher packages with minimal adoption.&lt;/p&gt;

&lt;p&gt;A gate set to block HIGH-risk packages (score &amp;lt; 40) catches the majority on first install. Bump the threshold to WARNING (&amp;lt; 60) and you catch all 57 — without checking for lifecycle scripts, CVEs, or provenance signatures.&lt;/p&gt;

&lt;p&gt;The binding.gyp trick is new. Single-publisher-with-no-history is not. Behavioral scoring catches the structural pattern that makes every technique possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gate your AI assistant's package installs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Intercepts every &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;cargo add&lt;/code&gt;, and &lt;code&gt;go get&lt;/code&gt; from Cursor and Claude Code. Packages below the behavioral threshold get blocked before they reach your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit what's currently installed:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add to CI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx -y proof-of-commitment --fail-on=critical&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Phantom Gyp is the sixth major supply chain attack since March. LiteLLM, axios, Shai-Hulud, TrapDoor, Miasma/Red Hat, now this. Each one finds a new execution vector. The defenders keep adding technique-specific monitors. The attackers keep switching techniques.&lt;/p&gt;

&lt;p&gt;Behavioral scoring doesn't chase techniques. It measures the structural risk that makes all of them possible: is this package maintained by one person with total publish access, no community, and no history? That question catches the next vector too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://getcommit.dev/?utm_source=devto&amp;amp;utm_campaign=phantom-gyp&amp;amp;utm_content=outro" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts. &lt;a href="https://getcommit.dev/audit/?packages=@vapi-ai/server-sdk,node-env-resolver,autotel,executable-stories-jest,awaitly,wrangler-deploy&amp;amp;utm_source=devto&amp;amp;utm_campaign=phantom-gyp&amp;amp;utm_content=outro" rel="noopener noreferrer"&gt;Run the Phantom Gyp audit live&lt;/a&gt; or add the &lt;a href="https://github.com/piiiico/proof-of-commitment" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; to your AI assistant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>npm</category>
      <category>ai</category>
    </item>
    <item>
      <title>IronWorm Commits as 'claude.' It Steals Your Anthropic and OpenAI Keys.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sat, 06 Jun 2026 20:54:03 +0000</pubDate>
      <link>https://dev.to/piiiico/ironworm-commits-as-claude-it-steals-your-anthropic-and-openai-keys-1fkd</link>
      <guid>https://dev.to/piiiico/ironworm-commits-as-claude-it-steals-your-anthropic-and-openai-keys-1fkd</guid>
      <description>&lt;p&gt;On June 4, JFrog Security Research published their analysis of IronWorm — a supply chain attack that compromised 37 npm packages through the &lt;code&gt;asteroiddao&lt;/code&gt; account. A 976KB Rust ELF binary triggered by &lt;code&gt;preinstall&lt;/code&gt;. Caught early, before spreading to popular packages. But the techniques are a step change from everything that came before.&lt;/p&gt;

&lt;p&gt;Three things make IronWorm different.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. It commits as "claude"
&lt;/h2&gt;

&lt;p&gt;Every malicious commit pushed to victim repositories uses the author identity &lt;code&gt;claude@users.noreply.github.com&lt;/code&gt;. The commit messages are routine: "fix: resolve lint warnings," "test: add missing edge case," "ci: update workflow configuration."&lt;/p&gt;

&lt;p&gt;The timestamps are forged. Some are backdated 13 years. In a repo where AI-generated commits are common and legitimate, these blend in. A developer scanning git log wouldn't notice. A code reviewer seeing a commit from "claude" might assume it came from an AI coding assistant doing its job.&lt;/p&gt;

&lt;p&gt;Social engineering adapted to the AI era. The attacker isn't pretending to be a human — they're pretending to be an AI tool the team already trusts.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. It steals AI credentials specifically
&lt;/h2&gt;

&lt;p&gt;IronWorm targets 86 environment variables and 20+ credential files. Standard targets (AWS, SSH, Docker) plus a new category:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API keys&lt;/strong&gt; (&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic API keys&lt;/strong&gt; (&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude authentication files&lt;/strong&gt; (session tokens)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cursor authentication files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm publish tokens&lt;/strong&gt; (including Trusted Publishing OIDC tokens)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stolen AI keys have immediate value. An OpenAI key with no spend cap runs thousands of dollars before anyone notices. An Anthropic key runs agents that escalate the attack. An npm token turns one compromised dev into a vector for every package they maintain.&lt;/p&gt;

&lt;p&gt;The dedicated Exodus wallet module injects JavaScript to capture the password and seed mnemonic at login. This isn't a generic credential scraper — custom modules per high-value target.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. It propagates through Trusted Publishing
&lt;/h2&gt;

&lt;p&gt;npm's &lt;a href="https://docs.npmjs.com/generating-provenance-statements" rel="noopener noreferrer"&gt;Trusted Publishing&lt;/a&gt; lets packages publish via GitHub Actions OIDC tokens instead of stored credentials. Designed to be more secure: no long-lived tokens to steal.&lt;/p&gt;

&lt;p&gt;IronWorm doesn't need stored credentials. It modifies GitHub Actions workflows to request OIDC tokens at runtime, then publishes trojanized versions of the victim's packages with valid provenance attestations.&lt;/p&gt;

&lt;p&gt;The result: malicious packages that pass &lt;code&gt;npm audit signatures&lt;/code&gt;. Provenance says "published through a verified CI pipeline." It doesn't say "the CI pipeline was hijacked."&lt;/p&gt;

&lt;p&gt;Same fundamental gap Miasma exploited with Red Hat's SLSA provenance the week before. Two independent attacks, one week apart, both defeating provenance through different mechanisms. &lt;strong&gt;Provenance is a chain-of-custody stamp, not a trust signal.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral scoring shows
&lt;/h2&gt;

&lt;p&gt;I ran every IronWorm package through &lt;a href="https://getcommit.dev/audit" rel="noopener noreferrer"&gt;Commit's behavioral audit&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Publishers&lt;/th&gt;
&lt;th&gt;Downloads/wk&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;weavedb-sdk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~1.2k&lt;/td&gt;
&lt;td&gt;~4yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ai3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;atomic-notes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cwao&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;zkjson&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;low&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&amp;lt;100&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Single publisher. Low downloads. Limited history. Every IronWorm package fits the profile behavioral scoring catches before the first install completes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The escalation timeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Attack&lt;/th&gt;
&lt;th&gt;What was new&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mar 5&lt;/td&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;td&gt;Single-package PyPI credential theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mar 30&lt;/td&gt;
&lt;td&gt;axios&lt;/td&gt;
&lt;td&gt;99M downloads/week, stolen token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 11&lt;/td&gt;
&lt;td&gt;Shai-Hulud&lt;/td&gt;
&lt;td&gt;Self-propagating worm, 637 packages in 39 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 22&lt;/td&gt;
&lt;td&gt;TrapDoor&lt;/td&gt;
&lt;td&gt;Cross-ecosystem + AI assistant poisoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jun 1&lt;/td&gt;
&lt;td&gt;Miasma&lt;/td&gt;
&lt;td&gt;Forged SLSA provenance on Red Hat packages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jun 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;IronWorm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rust + eBPF rootkit + AI credential theft + Trusted Publishing propagation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each attack introduces a capability the previous one didn't have. IronWorm is the first npm supply chain malware written in Rust, first to use an eBPF kernel rootkit, first to self-propagate through Trusted Publishing OIDC.&lt;/p&gt;

&lt;p&gt;And it specifically targets AI coding assistant credentials. The attack vector has come full circle — AI tools accelerate development, but their credentials are now high-value targets, and the tools themselves are being impersonated in commit history.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Gate your AI assistant's installs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;cargo add&lt;/code&gt;, and &lt;code&gt;go get&lt;/code&gt; runs through a behavioral check before execution. Packages with no history get blocked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit your current dependencies:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rotate AI credentials&lt;/strong&gt; if any IronWorm package was installed in your environment. Check for modified GitHub Actions workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't trust provenance alone.&lt;/strong&gt; Both Miasma and IronWorm demonstrate that valid provenance attestations can come from compromised pipelines. Provenance answers "where did this come from?" Behavioral scoring answers "should I trust it?" You need both.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://getcommit.dev" rel="noopener noreferrer"&gt;Commit&lt;/a&gt; scores npm, PyPI, Cargo, and Go packages on behavioral commitment — signals harder to fake than stars, READMEs, or download counts. &lt;a href="https://getcommit.dev/audit" rel="noopener noreferrer"&gt;Try the audit&lt;/a&gt; or add the &lt;a href="https://github.com/piiiico/proof-of-commitment" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; to your AI assistant.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>ai</category>
      <category>npm</category>
    </item>
    <item>
      <title>I Scored Every TrapDoor Package. All 34 Had Zero Behavioral History.</title>
      <dc:creator>Pico</dc:creator>
      <pubDate>Sat, 06 Jun 2026 08:52:17 +0000</pubDate>
      <link>https://dev.to/piiiico/i-scored-every-trapdoor-package-all-34-had-zero-behavioral-history-3183</link>
      <guid>https://dev.to/piiiico/i-scored-every-trapdoor-package-all-34-had-zero-behavioral-history-3183</guid>
      <description>&lt;p&gt;On May 22, a cluster of accounts published 34 packages across npm, PyPI, and Crates.io. 384 versions total, all in waves within hours.&lt;/p&gt;

&lt;p&gt;The credential theft was standard. The part that wasn't: poisoned &lt;code&gt;.cursorrules&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt; files containing zero-width Unicode characters. Invisible to text editors. Readable by AI assistants. The hidden instructions told your coding assistant to run a "security scan" that harvested your SSH keys, cloud credentials, and wallet data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three registries at once
&lt;/h2&gt;

&lt;p&gt;Each ecosystem got its own execution vector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;npm&lt;/strong&gt; (21 packages): &lt;code&gt;postinstall&lt;/code&gt; hooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyPI&lt;/strong&gt; (7 packages): auto-execute on import&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crates.io&lt;/strong&gt; (6 packages): &lt;code&gt;build.rs&lt;/code&gt; scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The names were engineered for AI suggestion: &lt;code&gt;llm-context-compressor&lt;/code&gt;, &lt;code&gt;prompt-engineering-toolkit&lt;/code&gt;, &lt;code&gt;wallet-security-checker&lt;/code&gt;, &lt;code&gt;defi-risk-scanner&lt;/code&gt;. Ask an AI assistant for a prompt management library and it might suggest one of these.&lt;/p&gt;

&lt;h2&gt;
  
  
  What behavioral scoring says
&lt;/h2&gt;

&lt;p&gt;I ran every TrapDoor package through &lt;a href="https://getcommit.dev/audit" rel="noopener noreferrer"&gt;Commit's audit&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Ecosystem&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Downloads&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;llm-context-compressor&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prompt-engineering-toolkit&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;35/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;model-switch-router&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;workspace-config-loader&lt;/td&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;21/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cryptowallet-safety&lt;/td&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;defi-risk-scanner&lt;/td&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;null&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0/wk&lt;/td&gt;
&lt;td&gt;&amp;lt;1yr&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every package: score 15 or null. No longevity. No community. No release history. No GitHub repo.&lt;/p&gt;

&lt;p&gt;A behavioral gate set to block HIGH-risk packages would have stopped all 34 on first install. No CVE lookup. No signature matching.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI poisoning angle
&lt;/h2&gt;

&lt;p&gt;This is the threat model shift. Traditional supply chain malware runs in &lt;code&gt;postinstall&lt;/code&gt;. TrapDoor's secondary payload runs when your AI assistant &lt;em&gt;reads a file&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The zero-width Unicode instructions direct the assistant to scan for git credentials, VS Code settings, environment variables, and SSH keys. Exfiltration goes through &lt;code&gt;raw.githubusercontent.com&lt;/code&gt; and GitHub Pages. Your firewall allows those domains.&lt;/p&gt;

&lt;p&gt;Your AI assistant does what the hidden text says because it processes every character in its context window, including the ones you can't see.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do
&lt;/h2&gt;

&lt;p&gt;Gate your AI's package installs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This intercepts every &lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;pip install&lt;/code&gt;, &lt;code&gt;cargo add&lt;/code&gt;, and &lt;code&gt;go get&lt;/code&gt; from Cursor and Claude Code. Packages below the threshold get blocked before they hit your machine.&lt;/p&gt;

&lt;p&gt;For stricter blocking (recommended for crypto/AI teams):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;COMMIT_HOOK_SEVERITY_BLOCK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HIGH npx proof-of-commitment hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check for poisoned config files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-rP&lt;/span&gt; &lt;span class="s1"&gt;'[\x{200B}\x{200C}\x{200D}\x{FEFF}\x{2060}]'&lt;/span&gt; .cursorrules CLAUDE.md &lt;span class="k"&gt;**&lt;/span&gt;/&lt;span class="k"&gt;*&lt;/span&gt;.mdc 2&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Audit what's already installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx proof-of-commitment &lt;span class="nt"&gt;--file&lt;/span&gt; package-lock.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;TrapDoor is the fifth major supply chain attack in three months. LiteLLM, axios, Shai-Hulud, Miasma, now this. Each one escalates. The entry point keeps changing. The pattern doesn't: packages with zero behavioral history get installed because nothing checks.&lt;/p&gt;

</description>
      <category>security</category>
      <category>supplychain</category>
      <category>ai</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
