72 comments

  • postalcoder an hour ago

    PSA: npm/bun/pnpm/uv now all support setting a minimum release age for packages.

    I also have `ignore-scripts=true` in my ~/.npmrc. Based on the analysis, that alone would have mitigated the vulnerability. bun and pnpm do not execute lifecycle scripts by default.

    Here's how to set global configs to set min release age to 7 days:

      ~/.config/uv/uv.toml
      exclude-newer = "7 days"
    
      ~/.npmrc
      min-release-age=7 # days
      ignore-scripts=true
      
      ~/Library/Preferences/pnpm/rc
      minimum-release-age=10080 # minutes
      
      ~/.bunfig.toml
      [install]
      minimumReleaseAge = 604800 # seconds
    
    (Side note, it's wild that npm, bun, and pnpm have all decided to use different time units for this configuration.)

    If you're developing with LLM agents, you should also update your AGENTS.md/CLAUDE.md file with some guidance on how to handle failures stemming from this config as they will cause the agent to unproductively spin its wheels.

    • mhio 32 minutes ago

      and for yarn berry

          ~/.yarnrc.yml
          npmMinimalAgeGate: "3d"
    • XYen0n 26 minutes ago

      If everyone avoids using packages released within the last 7 days, malicious code is more likely to remain dormant for 7 days.

      • otterley 23 minutes ago

        What do you base that on? Threat researchers (and their automated agents) will still keep analyzing new releases as soon as they’re published.

      • DimmieMan 24 minutes ago

        They’re usually picked up by scanners by then.

      • cozzyd 23 minutes ago

        that's why people are telling others to use 7 days but using 8 days themselves :)

      • Aurornis 9 minutes ago

        Most people won’t.

        7 days gives ample time for security scanning, too.

      • jmward01 21 minutes ago

        I suspect most packages will keep a mix of people at 7 days and those with no limit. That being said, adding jitter by default would be good to these features.

      • bakugo 18 minutes ago

        > If everyone avoids using packages released within the last 7 days

        Which will never even come close to happening, unless npm decides to make it the default, which they won't.

  • h4ch1 an hour ago

    I can't even imagine the scale of the impact with Axios being compromised, nearly every other project uses it for some reason instead of fetch (I never understood why).

    Also from the report:

    > Neither malicious version contains a single line of malicious code inside axios itself. Instead, both inject a fake dependency, plain-crypto-js@4.2.1, a package that is never imported anywhere in the axios source, whose only purpose is to run a postinstall script that deploys a cross-platform remote access trojan (RAT)

    Good news for pnpm/bun users who have to manually approve postinstall scripts.

    • beart an hour ago

      > nearly every other project uses it for some reason instead of fetch (I never understood why).

      Fetch wasn't added to Node.js as a core package until version 18, and wasn't considered stable until version 21. Axios has been around much longer and was made part of popular frameworks and tutorials, which helps continue to propagate it's usage.

      • seer an hour ago

        Also it has interceptors, which allow you to build easily reusable pieces of code - loggers, oauth, retriers, execution time trackers etc.

        These are so much better than the interface fetch offers you, unfortunately.

        • reactordev an hour ago

          You can do all of that in fetch really easily with the init object.

             fetch('https://api.example.com/data', {
            headers: {
              'Authorization': 'Bearer ' + accessToken
            }
          })
          • mhio 31 minutes ago

            What does an interceptor in the RequestInit look like?

        • meekins an hour ago

          It also supports proxies which is important to some corporate back-end scenarios

    • eviks an hour ago

      > Good news for pnpm/bun users who have to manually approve postinstall scripts.

      Would they not have approved it for earlier versions? But also wouldn't the chance of addition automatic approval be high (for such a widely used project)?

      • h4ch1 2 minutes ago

        Can't speak for other devs but I like to read postinstall scripts or at least put them through an LLM if they're too hard to grok.

        It's also a little context dependent, for example if I was using Axios and I see a prompt to run the plain-crypto-js postinstall script, alarm bells would instantly ring, which would at least make me look up the changelog to see why this is happening.

        In most cases I don't even let them run unless something breaks/doesn't work as expected.

      • arcfour 4 minutes ago

        The prompt would be to approve the new malicious package (plain-crypto-js)'s scripts, too, which could tip users off that something was fishy. If they were used to approving one for axios and the attackers had just overwrote axios's own instead of making a new package, it would probably catch people out.

    • martmulx an hour ago

      Does pnpm block postinstall on transitive deps too or just top-level? We have it configured at work but I've never actually tested whether it catches scripts from packages that get pulled in as sub-dependencies.

      • arcfour a minute ago

        It prompts for transitive dependencies, too. I have never had workerd as a direct dependency of any project of mine but I get prompted to approve its postinstall script whenever I install cloudflare's wrangler package (since workerd it has to download the appropriate workers runtime for your platform).

      • dawnerd 41 minutes ago

        From what I can tell, it blocks it everywhere.

  • Surac a minute ago

    All this supply chain attacks make me nervous about the apps i use. It would be a valuable info if a app uses such dependencys, but on the other hand programmers would cut there sale if they give you this info.

  • vsgherzi 24 minutes ago

    Not to beat a dead horse but I see this again and again with dependencies. Each time I get more worried that the same will happen with rust. I understand the fat std library approach won’t work but I really still want a good solution where I can trust packages to be safe and high quality.

    • rectang 16 minutes ago

      Hosting curated dependencies is a commercially valuable service. Eventually an economy arises where people pay vendors to vet packages.

  • tkel 4 minutes ago

    JS package managers (pnpm, bun) now will ignore postinstall scripts by default. Except for npm, it still runs them for legacy reasons.

    You should probably set your default to not run those scripts. They are mostly unnecessary.

      ~/.npmrc :
      ignore-scripts=true
  • jadar an hour ago

    How much do you want to bet me that the credential was stolen during the previous LiteLLM incident? At what point are we going to have to stop using these package managers because it's not secure? I've got to admit, it's got me nervous to use Python or Node.js these days, but it's really a universal problem.

    • rybosome an hour ago

      > it’s got me nervous to use Python or Node.js these days

      My feelings precisely. Min package age (supported in uv and all JS package managers) is nice but I still feel extremely hesitant to upgrade my deps or start a new project at the moment.

      I don’t think this is going to stabilize any time soon, so figuring out how to handle potentially compromised deps is something we will all need to think about.

      • Tazerenix an hour ago

        NPM only gained minimum package age in February of this year, and still doesn't support package exclusions for internal packages.

        https://github.com/npm/cli/pull/8965

        https://github.com/npm/cli/issues/8994

        Its good that that they finally got there but....

        I would be avoiding npm itself on principle in the JS ecosystem. Use a package manager that has a history of actually caring about these issues in a timely manner.

      • arcfour 7 minutes ago

        PNPM makes you approve postinstall scripts instead of running them by default, which helps a lot. Whenever I see a prompt to run a postinstall script, unless I know the package normally has one & what it does, I go look it up before approving it.

        (Of course I could still get bitten if one of the packages I trust has its postinstall script replaced.)

  • acheong08 25 minutes ago

    There are so many scanners these days these things get caught pretty quick. I think we need either npm or someone else to have a registry that only lets through packages that pass these scanners. Can even do the virustotal thing of aggregating reports by multiple scanners. NPM publishes attestation for trusted build environments. Google has oss-rebuild.

    All it takes is an `npm config set` to switch registries anyways. The hard part is having a central party that is able to convince all the various security companies to collaborate rather than having dozens of different registries each from each company.

    Rather than just a hard-coded delay, I think having policies on what checks must pass first makes sense with overrides for when CVEs show up.

    (WIP)

  • wps 34 minutes ago

    Genuinely how are you supposed to make sure that none of the software you have on your system pulls this in?

    It’s things like this that make me want to swap to Qubes permanently, simply as to not have my password manager in the same context as compiling software ever.

  • jmward01 an hour ago

    This may not be popular, but is there a place for required human actions or just timed actions to slow down things like this? For instance, maybe a GH action to deploy requires a final human click and to change that to cli has a 3 day cooling period with mandatory security emails sent out. Similarly, you switch to read only for 6 hrs after an email change. There are holes in these ideas but the basic concept is to treat security more like physical security, your goal isn't always to 100% block but instead to slow an attacker for xxx minutes to give the rest of the team time to figure out what is going on.

    • ArcHound 43 minutes ago

      Hi, security here. We've tried, but the amount of people you need for this vs the amount of people you have trying to review and click the big button always means that this step will be a bottleneck. Thus this step will be eliminated.

      A much better approach would be to pin the versions used and do intentional updates some time after release, say a sprint after.

      • jmward01 34 minutes ago

        Yeah, I am looking at that on the use end. It sounds like on the python side this type of thing will be more standard (uv now and soon pip supported with version date requirements). I think time is a big missing element in many security in depth decisions. It can be time until you adopt like use no package newer than xx days or time it takes to deploy etc etc. Unfortunately the ecosystem is getting really diverse and that means ever more sophisticated attacks so we may need to do things that are annoying just to survive.

      • themafia 15 minutes ago

        Why not just release escrow? If I try to push a new release version another developer or developers have to agree to that release. In larger projects you would expect the release to be coordinated or scheduled anyways. Effectively we're just moving "version pinning" or "version delay" one layer up the release chain.

  • bluepeter an hour ago

    Min release age sucks, but we’ve been here before. Email attachments used to just run wild too, then everyone added quarantine delays and file blocking and other frictions... and it eventually kinda/sorta worked. This does feel worse, though, with fewer chokepoints and execution as a natural part of the expectation.

    Edit: bottom line is installs are gonna get SOOO much more complicated. You can already see the solution surface... Cooling periods, maintainer profiling, sandbox detonation, lockfile diffing, weird publish path checks. All adds up to one giant PITA for fast easy dev.

    • mayama 17 minutes ago

      Min release age might just postpone vulnerability to be applied few days later in non trivial cases like this. More I think about it, Odin lang approach of no package manager makes senses. But, for that approach won't work for Javascript as it needs npm package even for trivial things. Even vendoring approach like golang won't work with Javascript with the amount of churn and dependencies.

  • woeirua 33 minutes ago

    Supply chain attacks are so scary that I think most companies are going to use agents to hard fork their own versions of a lot of these core libraries instead. It wasn’t practical before. It’s definitely much more doable today.

  • marjipan200 2 hours ago
  • mtud 2 hours ago

    Supply chain woes continue

    • kdavis01 2 hours ago

      One more reason to use Fetch

      • p1mrx an hour ago

        Stop trying to make Fetch happen.

        • nathanmills 19 minutes ago

          No, I will not stop trying to create a more secure software ecosystem.

      • marjipan200 an hour ago

        until Node is compromised

        • avaer an hour ago

          Harder to do. Also node is not updated at the rate of npm deps.

  • koolba 2 hours ago

    > Both versions were published using the compromised npm credentials of a lead axios maintainer, bypassing the project's normal GitHub Actions CI/CD pipeline.

    Doesn’t npm mandate 2FA as of some time last year? How was that bypassed?

  • 0x500x79 an hour ago

    Pin your dependencies folks! Audit and don't upgrade to every brand new version.

    • onion2k 34 minutes ago

      But also have a regular review of your dependencies to update them when necessary, because as bad as compromised packages may be things do have vulnerabilities occasionally, and upgrading things that are a long way out-of-date can be quite hard.

  • dhruv3006 an hour ago

    174025 dependents.

  • rtpg 36 minutes ago

    Please can we just have a 2FA step on publishing? Do we really need a release to be entirely and fully automated?

    It won't stop all attacks but definitely would stop some of these

  • imrozim an hour ago

    the self-deletion after execution is the scary part it replaces its own package.json with a clean version to evade detection. if you ran npm install before this was caught you'd have no obvious trace left. the lesson here is that pinning exact versions isn't enough you need integrity checks on the actual published content not just the version number. npm install --ignore-scripts in CI should honestly be the default.

    • joshuat an hour ago

      Why would pinning the exact version in this case not have solved the problem? I agree `--ignore-scripts` would be a sensible default at this point, but my understanding is that this vulnerability exclusively impacts two newly released versions.

      • bakugo an hour ago

        You're replying to an AI bot.

        • joshuat 27 minutes ago

          -_- I love the internet

  • 8cvor6j844qw_d6 an hour ago

    Should increase the delay to dependency updates.

    • tonymet an hour ago

      Slow Russian roulette is still a losing strategy

      • btown an hour ago

        It’s only a losing strategy if you assume everyone universally adopts the slow strategy, and no research teams spot it in the interim. For things with large splash radius, that’s unrealistic, so defenders have an information advantage.

        Makes actual security patches tougher to roll out though - you need to be vigilant to bypass the slowdown when you’re actually fixing a critical flaw. But nobody said this would be easy!

        • esseph an hour ago

          > Makes actual security patches tougher to roll out though

          Yeah. 7 days in 2026 is a LONG TIME for security patches, especially for anything public facing.

          Stuck between a rock (dependency compromise) and a hard place (legitimate security vulnerabilities).

          Doesn't seem like a viable long-term solution.

      • neko_ranger an hour ago

        but wouldn't it work in this case? sure if a package was compromised for months/years it wouldn't save you

        but tell dependabot to delay a week, you'd sleep easy from this nonesense

  • tonymet an hour ago

    Has anyone tested general purpose malware detection on supply chains ? Like clamscan . I tried to test the LiteLLM hack but the affected packages had been pulled. Windows Defender AV has an inference based detector that may work when signatures have not yet been published

    • jesse_dot_id 34 minutes ago

      I second this question. I usually scan our containers with snyk and guarddog, and have wondered about guarddog in particular because it adds so much build time.

    • esseph an hour ago

      > Has anyone tested general purpose malware detection on supply chains ? Like clamscan

      You could use Trivy! /s

  • 0x1ceb00da an hour ago

    Coded has zero nom dependencies. Neat!

  • slopinthebag 2 hours ago

    It's reasons like this why I refuse to download Node or use anything NPM. Thankfully other languages are better anyways.

  • himata4113 an hour ago

    I recommend everyone to use bwrap if you're on linux and alias all package managers / anything that has post build logic with it.

    I have bwrap configured to override: npm, pip, cargo, mvn, gradle, everything you can think of and I only give it the access it needs, strip anything that is useless to it anyway, deny dbus, sockets, everything. SSH is forwarded via socket (ssh-add).

    This limits the blast radius to your CWD and package manager caches and often won't even work since the malware usually expects some things to be available which are not in a permissionless sandbox.

    You can think of it as running a docker container, but without the requirement of having to have an image. It is the same thing flatpak is based on.

    As for server deployments, container hardening is your friend. Most supply chain attacks target build scripts so as long as you treat your CI/CD as an untrusted environment you should be good - there's quite a few resources on this so won't go into detail.

    Bonus points: use the same sandbox for AI.

    Stay safe out there.