25 comments

  • postalcoder 51 minutes 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 24 minutes ago
      and for yarn berry

          ~/.yarnrc.yml
          npmMinimalAgeGate: "3d"
    • XYen0n 18 minutes ago
      If everyone avoids using packages released within the last 7 days, malicious code is more likely to remain dormant for 7 days.
      • Aurornis 1 minute ago
        Most people won’t.

        7 days gives ample time for security scanning, too.

      • otterley 15 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 16 minutes ago
        They’re usually picked up by scanners by then.
      • jmward01 13 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.
      • cozzyd 15 minutes ago
        that's why people are telling others to use 7 days but using 8 days themselves :)
      • bakugo 10 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 1 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 1 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 1 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 58 minutes 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 23 minutes ago
            What does an interceptor in the RequestInit look like?
        • meekins 53 minutes ago
          It also supports proxies which is important to some corporate back-end scenarios
    • eviks 48 minutes 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)?

    • martmulx 52 minutes 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.
      • dawnerd 33 minutes ago
        From what I can tell, it blocks it everywhere.
  • acheong08 17 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)

  • jadar 1 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 1 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 44 minutes 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.

  • wps 26 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.

  • vsgherzi 16 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 9 minutes ago
      Hosting curated dependencies is a commercially valuable service. Eventually an economy arises where people pay vendors to vet packages.
  • jmward01 45 minutes 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 35 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 27 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 7 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 43 minutes 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 9 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 25 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.
  • himata4113 47 minutes 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.

  • marjipan200 1 hour ago
  • mtud 2 hours ago
    Supply chain woes continue
    • kdavis01 1 hour ago
      One more reason to use Fetch
      • p1mrx 52 minutes ago
        Stop trying to make Fetch happen.
        • nathanmills 12 minutes ago
          No, I will not stop trying to create a more secure software ecosystem.
      • marjipan200 1 hour ago
        until Node is compromised
        • avaer 1 hour ago
          Harder to do. Also node is not updated at the rate of npm deps.
  • koolba 1 hour 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 47 minutes ago
    Pin your dependencies folks! Audit and don't upgrade to every version.
    • onion2k 26 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 40 minutes ago
    174025 dependents.
  • rtpg 29 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 46 minutes 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 38 minutes 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 37 minutes ago
        You're replying to an AI bot.
        • joshuat 19 minutes ago
          -_- I love the internet
  • 8cvor6j844qw_d6 1 hour ago
    Should increase the delay to dependency updates.
    • tonymet 1 hour ago
      Slow Russian roulette is still a losing strategy
      • btown 1 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 41 minutes 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 1 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

  • 0x1ceb00da 42 minutes ago
    Coded has zero nom dependencies. Neat!
  • tonymet 1 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 26 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 39 minutes ago
      > Has anyone tested general purpose malware detection on supply chains ? Like clamscan

      You could use Trivy! /s

  • stevenmh 3 minutes ago
    [dead]
  • franciscop 25 minutes ago
    [flagged]
    • nkozyra 18 minutes ago
      No offense intended here, but this probably isn't the place to promote your package, given it's a story about a massive and incredibly popular dependency that managed to get got.
  • slopinthebag 1 hour ago
    It's reasons like this why I refuse to download Node or use anything NPM. Thankfully other languages are better anyways.