vintagedave 4 hours ago

Serious question: should someone develop new technologies using Node any more?

A short time ago, I started a frontend in Astro for a SaaS startup I'm building with a friend. Astro is beautiful. But it's build on Node. And every time I update the versions of my dependencies I feel terrified I am bringing something into my server I don't know about.

I just keep reading more and more stories about dangerous npm packages, and get this sense that npm has absolutely no safety at all.

  • sph 4 hours ago

    It's not "node" or "Javascript" the problem, it's this convenient packaging model.

    This is gonna ruffle some feathers, but it's only a matter of time until it'll happen on the Rust ecosystem which loves to depend on a billion subpackages, and it won't be fault of the language itself.

    The more I think about it, the more I believe that C, C++ or Odin's decision not to have a convenient package manager that fosters a cambrian explosion of dependencies to be a very good idea security-wise. Ambivalent about Go: they have a semblance of packaging system, but nothing so reckless like allowing third-party tarballs uploaded in the cloud to effectively run code on the dev's machine.

    • TheFlyingFish 3 hours ago

      I've worried about this for a while with Rust packages. The total size of a "big" Rust project's dependency graph is pretty similar to a lot of JS projects. E.g. Tauri, last I checked, introduces about 600 dependencies just on its own.

      Like another commenter said, I do think it's partially just because dependency management is so easy in Rust compared to e.g. C or C++, but I also suspect that it has to do with the size of the standard library. Rust and JS are both famous for having minimal standard libraries, and what do you know, they tend to have crazy-deep dependency graphs. On the other hand, Python is famous for being "batteries included", and if you look at Python project dependency graphs, they're much less crazy than JS or Rust. E.g. even a higher-level framework like FastAPI, that itself depends on lower-level frameworks, has only a dozen or so dependencies. A Python app that I maintain for work, which has over 20 top-level dependencies, only expands to ~100 once those 20 are fully resolved. I really think a lot of it comes down to the standard library backstopping the most common things that everybody needs.

      So maybe it would improve the situation to just expand the standard library a bit? Maybe this would be hiding the problem more than solving it, since all that code would still have to be maintained and would still be vulnerable to getting pwned, but other languages manage somehow.

      • wongarsu 3 hours ago

        I wouldn't call the Rust stdlib "small". "Limited" I could agree with.

        On the topics it does cover, Rust's stdlib offers a lot. At least on the same level as Python, at times surpassing it. But because the stdlib isn't versioned it stays away from everything that isn't considered "settled", especially in matters where the best interface isn't clear yet. So no http library, no date handling, no helpers for writing macros, etc.

        You can absolutely write pretty substantial zero-dependency rust if you stay away from the network and async

        Whether that's a good tradeoff is an open question. None of the options look really great

        • galangalalgol 2 hours ago

          Network without async works fine in std. However, rand, serde, and num_traits always seem to be present. Not sure why clap isn't std at this point.

          • wongarsu an hour ago

            Clap went through some major redesigns with the 4.0 release just three years ago. That wouldn't have been possible if clap 2.0 or 3.0 had been added to the stdlib. It's almost a poster child for things where libraries where being outside the stdlib allows interface improvements (date/time handling would be the other obvious example).

            Rand has the issue of platform support for securely seeding a secure rng, and having just an unsecure rng might cause people to use it when they really shouldn't. And serde is near-universal but has some very vocal opponents because it's such a heavy library. I have however often wished that num_traits would be in the stdlib, it really feels like something that belongs in there.

          • TheDong 21 minutes ago

            > Not sure why clap isn't std at this point.

            The std has stability promises, so it's prudent to not add things prematurely.

            Go has the official "flag" package as part of the stdlib, and it's so absolutely terrible that everyone uses pflag, cobra, or urfave/cli instead.

            Go's stdlib is a wonderful example of why you shouldn't add things willy-nilly to the stdlib since it's full of weird warts and things you simply shouldn't use.

          • Ygg2 an hour ago

            > why clap isn't std at this point.

            Too big for many cases, there is also a lot of discussion around whether to use clap, or something smaller.

      • moomin 6 minutes ago

        It might solve the problem, in as much as the problem is that not only can it be done, but it’s profitable to do so. This is why there’s no Rust problem (yet).

      • kibwen 3 hours ago

        > Rust and JS are both famous for having minimal standard libraries

        I'm all in favor of embiggening the Rust stdlib, but Rust and JS aren't remotely in the same ballpark when it comes to stdlib size. Rust's stdlib is decidedly not minimal; it's narrow, but very deep for what it provides.

      • skydhash 3 hours ago

        C standard library is also very small. The issue is not the standard library. The issue is adding libraries for snippets of code, and in the name of convenience, let those libraries run code on the dev machine.

        • api 2 hours ago

          The issue is that our machines run 1970s OSes with a very basic security model, and are themselves so complex that they’re likely loaded with local privilege escalation attack vectors.

          Doing dev in a VM can help, but isn’t totally foolproof.

          • skydhash 2 hours ago

            It’s a good security model because everyone has the decency to follow a pull model. Like “hey, I have this thing, you can get it if you’re interested”. You decide the amount of trust you give to someone.

            But NPM is more like “you’ve added me to your contact list, then it’s totally fine for me to enter your bedroom at night and wear your lingerie because we’re already BFF”. It’s “I’m doing whatever I want on your computer because I know best and you’re dumb” mentality that is very prevalent.

            It’s like how zed (the editor) wants to install node.js and whatever just because they want to enable LSP. The sensible approach would have been to have a default config that relies on $PATH to find the language server.

      • metaltyphoon 2 hours ago

        This is a reason why so many enterprises use C#. Most of the time you just use Microsoft made libraries and rarely brings in 3rd party.

        • latentsea an hour ago

          Having worked on four different enterprise grade C# codebases, they most certainly have plenty of 3rd party dependencies. It would absolutely be the exception to not have 3rd party dependencies.

        • pasc1878 an hour ago

          Or purchase third party libraries. This does two things - limits what you drag in and also if you drag it in you can sue someone for errors.

          • skeeter2020 an hour ago

            This definitely not why enterprise "chooses" C# and neither of these were design decisions like implied. MS would have loved to have the explosive, viral ecosystem of Node earlier in .NET's life. Regardless a lot of companies using C# still use node-based solutions on the web so a insular development environment for one tier doesn't protect them.

      • gorgoiler 2 hours ago

        And yet of course the world and their spouse import requests to fetch a URL and view the body of the response.

        It would be lovely if Python shipped with even more things built in. I’d like cryptography, tabulate/rich, and some more featureful datetime bells and whistles a la arrow. And of course the reason why requests is so popular is that it does actually have a few more things and ergonomic improvements over the builtin HTTP machinery.

        Something like a Debian Project model would have been cool: third party projects get adopted into the main software product by a sworn-in project member who who acts as quality control / a release manager. Each piece of software stays up to date but also doesn’t just get its main branch upstreamed directly onto everyone’s laps without a second pair of eyes going over what changed. The downside is it slows everything down, but that’s a side-effect of, or rather a synonym for stability, which is the problem we have with npm. (This looks sort of like what HelixGuard do, in the original article, though I’ve not heard of them before today.)

        • TheFlyingFish 11 minutes ago

          Requests is a great example of my point, actually. Creating a brand-new Python venv and running `uv add requests` tells me that a total of 5 packages were added. By contrast, creating a new Rust project and running `cargo add reqwest` (which is morally equivalent to Python's `requests`) results in adding 160 packages, literally 30x as many.

          I don't think languages should try to include _everything_ in their stdlib, and indeed trying to do so tends to result in a lot of legacy cruft clogging up the stdlib. But I think there's a sweet spot between having a _very narrow_ stdlib and having to depend on 160 different 3rd-party packages just to make a HTTP request, and having a stdlib with 10 different ways of doing everything because it took a bunch of tries to get it right. (cf. PHP and hacks like `mysql_real_escape_string`, for example.)

          Maybe Python also has a historical advantage here. Since the Internet was still pretty nascent when Python got its start, it wasn't the default solution any time you needed a bit of code to solve a well-known problem (I imagine, at least; I was barely alive at that point). So Python could afford to wait and see what would actually make good additions to the stdlib before implementing them.

          Compare to Rust which _immediately_ had to run gauntles like "what to do about async", with thousands of people clamoring for a solution _right now_ because they wanted to do async Rust. I can definitely sympathize with Rust's leadership wanted to do the absolute minimum required for async support while they waited for the paradigm to stabilize. And even so, they still get a lot of flak for the design being rushed, e.g. with `Pin`.

          So it's obviously a difficult balance to strike, and maybe the solution isn't as simple as "do more in the stdlib". But I'd be curious to see it tried, at least.

    • larusso 3 hours ago

      I agree partly. I love cargo and can’t understand why certain things like package namespaces and proof of ownership isn’t added at a minimum. I was mega annoyed when I had to move all our Java packages from jcenter, which was a mega easy setup and forget affair, to maven central. There I suddenly needed to register a group name (namespace mostly reverse domain) and proof that with a DNS entry. Then all packages have to be signed etc. In the end it was for this time way ahead. I know that these measures won’t help for all cases. But the fact that at least on npm it was possible that someone else grabs a package ID after an author pulled its packages is kind of alarming. Dependency confusion attacks are still possible on cargo because the whole - vs _ as delimiter wasn’t settled in the beginning. But I don’t want to go away from package managers or easy to use/sharable packages either.

    • PunchyHamster 27 minutes ago

      Rust (and really, any but JS) ecosystem have a bit more "due dilligence" applied everywhere; I don't doubt someone will try to namesquat but chance of success are far smaller

      > The more I think about it, the more I believe that C, C++ or Odin's decision not to have a convenient package manager that fosters a cambrian explosion of dependencies to be a very good idea security-wise.

      There was no decision in case of C/C++; it was just not a thing languages had at the time so the language itself (especially C) isn't written in a way to accommodate it nicely

      > Ambivalent about Go: they have a semblance of packaging system, but nothing so reckless like allowing third-party tarballs uploaded in the cloud to effectively run code on the dev's machine.

      Any code you download and compile is running code on dev machine; and Go does have tools to do that in compile process too.

      I do however like the by default namespacing by domain, there is no central repository to compromise, and forks of any defunct libs are easier to manage.

    • gnfargbl 3 hours ago

      I'm a huge Go proponent but I don't know if I can see much about Go's module system which would really prevent supply-chain attacks in practice. The Go maintainers point [1] at the strong dependency pinning approach, the sumdb system and the module proxy as mitigations, and yes, those are good. However, I can't see what those features do to defend against an attack vector that we have certainly seen elsewhere: project gets compromised, releases a malicious version, and then everyone picks it up when they next run `go get -u ./...` without doing any further checking. Which I would say is the workflow for a good chunk of actual users.

      The lack of package install hooks does feel somewhat effective, but what's really to stop an attacker putting their malicious code in `func init() {}`? Compromising a popular and important project in this way would likely be noticed pretty quickly. But compromising something widely-used but boring? I feel like attackers would get away with that for a period of time that could be weeks.

      This isn't really a criticism of Go so much as an observation that depending on random strangers for code (and code updates) is fundamentally risky. Anyone got any good strategies for enforcing dependency cooldown?

      [1] https://go.dev/blog/supply-chain

      • PunchyHamster 25 minutes ago

        > However, I can't see what those features do to defend against an attack vector that we have certainly seen elsewhere: project gets compromised, releases a malicious version, and then everyone picks it up when they next run `go get -u ./...` without doing any further checking. Which I would say is the workflow for a good chunk of actual users.

        You can't, really, aside from full on code audits. By definition, if you trust a maintainer and they get compromised, you get compromised too.

        Requiring GPG signing of releases (even by just git commit signing) would help but that's more work for people to distribute their stuff, and inevitably someone will make insecure but convenient way to automate that away from the developer

      • devttyeu 2 hours ago

        In Go you know exactly what code you’re building thanks to gosum, and it’s much easier to audit changed code after upgrading - just create vendor dirs before and after updating packages and diff them; send to AI for basic screening if the diff is >100k loc and/or review manually. My projects are massive codebases with 1000s of deps and >200MB stripped binaries of literally just code, and this is perfectly feasible. (And yes I do catch stuff occasionally, tho nothing actively adversarial so far)

        I don’t believe I can do the same with Rust.

      • asmor 2 hours ago

        The Go standard library is a lot more comprehensive and usable than Node, so you need less dependencies to begin with.

    • dotancohen 4 hours ago

      Historically, arguments of "it's popular so that's why it's attacked" have not held up. Notable among them was addressing Windows desktop security vulnerabilities. As Linux and Mac machines became more popular, not to mention Android, the security vulnerabilities in those burgeoning platforms never manifested to the extent that they were in Windows. Nor does cargo or pip seem to be infected with these problems to the extent that npm is.

      • whizzter 39 minutes ago

        Compared to the JS ecosystem and number of users both Python and Rust are puny, also the the NPM ecosystem also allowed by default for a lot of post-install actions since they wanted to enable a smooth experience with compiling and installing native modules (Not entirely sure how Cargo and PIP handles native library dependencies).

        As for Windows vs the other OS's, yes even the Windows NT family grew out of DOS and Win9x and tried to maintain compatiblity for users over security up until it became untenable. So yes, the base _was_ bad when Windows was dominant but it's far less bad today (why people target high value targets via NPM,etc since it's an easier entry-point).

        Android/iOS is young enough that they did have plenty of hindsight when it comes to security and could make better decisions (Remember that MS tried to move to UWP/Appx distribution but the ecosystem was too reliant on newer features for it to displace the regular ecosystem).

        Remember that we've had plenty of annoyed discourse about "Apple locking down computers" here and on other tech forums when they've pushed notarization.

        I guess my point is that, people love to bash on MS but at the same time complain about how security is affecting their "freedoms" when it comes to other systems (and partly MS), MS is better at the basics today than they were 20-25 years ago and we should be happy about that.

        • skydhash 27 minutes ago

          You can have security without having a walled garden. By trusting the user with the key of their own property.

      • mschuster91 3 hours ago

        > Nor does cargo or pip seem to be infected with these problems to the extent that npm is.

        Easy reason. The target for malware injections is almost always cryptocurrency wallets and cloud credentials (again, mostly to mine cryptocurrencies). And the utter utter majority of stuff interacting with crypto and cloud, combined with a lot of inexperienced juniors who likely won't have the skill to spot they got compromised, is written in NodeJS.

    • dwroberts 3 hours ago

      I think this is right about Rust and Cargo, but I would say that Rust has a major advantage in that it implements frozen + offline mode really well (which if you use, obviously significantly decreases the risks).

      Any time I ever did the equivalent with NPM/node world it was basically unusable or completely impractical

    • rafaelmn 3 hours ago

      There are ecosystems that have package managers but also well developed first party packages.

      In .NET you can cover a lot of use cases simply using Microsoft libraries and even a lot of OSS not directly a part of Microsoft org maintained by Microsoft employees.

      • CharlieDigital 3 hours ago

        2020 State of the Octoverse security report showed that .NET ecosystem has on average the lowest number of transitive dependencies. Big part of that is the breadth and depth of the BCL, standard libraries, and first party libraries.

        • CodesInChaos 2 hours ago

          The .NET ecosystem has been moving towards a higher number of dependencies since the introduction of .NET Core. Though many of them are still maintained by Microsoft.

    • alextingle an hour ago

      Every time I look at a new project, my face falls when it's written in Rust. I simply don't trust a system that pulls in gigabytes of god-knows-what off the cloud, and compiles it on my box. It's a real barrier to entry, for me.

      When I download a C project, I know that it only depends on my system libraries - which I trust because I trust my distro. Rust seems to expect me to take a leap in the dark, trusting hundreds of packagers and their developers. That might be fine if you're already familiar with the Rust ecosystem, but for someone who just wants to try out a new program - it's intimidating.

      • cyphar 18 minutes ago

        On Debian you can use the local registry for Rust which is backed by packages.

        Though I will say, even as someone who works at a company that sells Linux distributions (SUSE), while the fact we have an additional review step is nice, I think the actual auditing you get in practice is quite minimal.

        For instance, quite recently[1] the Debian package for a StarDict plugin was configured automatically upload all text selected in X11 to some Chinese servers if you installed it. This is the kind of thing you'd hope distro maintainers to catch.

        Though, having build scripts be executed in distribution infrastructure and shipped to everyone mitigates the risk of targeted and "dumb" attacks. C build scripts can attack your system just as easily as Rust or JavaScript ones can (in fact it's probably even easier -- look at how the xz backdoor took advantage of the inscrutability of autoconf).

        [1]: https://www.openwall.com/lists/oss-security/2025/08/04/1

    • rock_artist 2 hours ago

      Using C++ daily, whenever I do js/ts are some javascript variant, since I don't use it daily, and update becomes a very complex task. frameworks and deps change APIs very frequently.

      It's also very confusing (and I think those attack vectors benefit exactly from that), since you have a dependency but the dep itself dependent on another dep version.

      Building basic CapacitorJS / Svelte app as an example, results many deps.

      It might be a newbie question, but, Is there any solution or workflow where you don't end up with this dependency hell?

      • smt88 2 hours ago

        There's no solution. The JS world is just nonstop build and dependency hell.

        Being incredibly strict with TS compiler and linter helps a bit.

    • JD557 an hour ago

      I have a similar opinion but I think Java's model with maven and friends hits the sweet spot:

      - Packages are always namespaced, so typosquating is harder - Registries like Sonatype require you to validate your domain - Versions are usually locked by default

      My professional life has been tied to JVM languages, though, so I might be a bit biased.

      I get that there are some issues with the model, especially when it comes to eviction, but it has been "good enough" for me.

      Curious on what other people think about it.

      • oftenwrong 16 minutes ago

        Maven does not support "scripts" as NPM does, such as the pre-install script used for this exploit. With scripts enabled, the mere act of downloading a dependency requires a high degree of trust in it.

    • Davidbrcz 3 hours ago

      Don't worry about C or C++, we create the vulnerabilities ourselves !

      • GuB-42 14 minutes ago

        I get the joke, but that makes me think.

        What is worse between writing potentially vulnerable code yourself and having too many dependencies.

        Finding vulnerabilities and writing exploits is costly, and hackers will most likely target popular libraries over your particular software, much higher impact, and it pays better. Dependencies also tend to do more than you need, increasing the attack surface.

        So your C code may be worse in theory, but it is a smaller, thus harder to hit target. It is probably an advantage against undiscriminating attacks like bots and a downside against targeted attacks by motivated groups.

    • hyperpape 2 hours ago

      Supply chain attacks are scary because you do everything "right", but the ecosystem still compromises you.

      But realistically, I think the sum total of compromises via package managers attacks is much smaller than the sum total of compromises caused by people rolling their own libraries in C and C++.

      It's hard to separate from C/C++'s lack of memory safety, which causes a lot of attacks, but the fact that code reuse is harder is a real source of vulnerabilities.

      Maybe if you're Firefox/Chromium, and you have a huge team and invest massive efforts to be safe, you're better off with the low-dependency model. But for the median project? Rolling your own is much more dangerous than NPM/Cargo.

    • moritonal 3 hours ago

      Not knowing that much about apt, isn't _any_ package system vulnerable, and purely a question of what guards are in place and what rights are software given upon install?

      • viraptor 3 hours ago

        It's not the packaging tech. Apt will typically mean a Debian-based distro. That means the packages are chosen by the maintainers and updated only during specific time periods and tested before release. Even if the underlying software gets owned and replaced, the distro package is very unlikely to be affected. (Unless someone spent months building trust, like xz)

        But the basic takeover... no, it usually won't affect any Debian style distro package, due to the release process.

        • trollbridge 2 hours ago

          Given the years (or decades) it takes updates to happen in Debian stable, it’s immune to supply chain attacks. You do get to enjoy vulnerabilities that have been out for years, though.

          • alt227 27 minutes ago

            > it’s immune to supply chain attacks

            Thats a strong statement that I can see aging very badly.

          • FergusArgyll an hour ago

            Security updates are basically immediate, even on stable flavors

    • progbits 3 hours ago

      Agreed with the first half, but giving up on convenient packaging isn't the answer.

      Things like cargo-vet help as does enforcing non-token auth, scanning and required cooldown periods.

    • zenmac 3 hours ago

      Just a last month someone was trying to figure the cargo tree on which Rust package got imported implicitly via which package. This will totally happen in rust as well as long as you use some kind of package manager. Go for zero or less decencies.

      • galangalalgol 2 hours ago

        It already did happen. It propogated via build.rs as well. But as I said elsewhere, ut doesn't help you to forgo dependencies part of rust tooling itself.

      • actionfromafar 3 hours ago

        less?

        • officialchicken 2 hours ago

          Roll your own standard library - or go without one entirely

          `#![no_std]`

        • troupo 3 hours ago

          Make it so others depend on you? :)

        • beeb 3 hours ago

          decencies?

    • agumonkey 28 minutes ago

      do they follow the same process ? or is it harder to submit a package and vet it on rust/cargo ?

    • randomint64 2 hours ago

      Indeed, Rust's supply chains story is an absolute horror, and there are countless articles explaining what should be done instead (e.g. https://kerkour.com/rust-stdx)

      TL;DR: ditch crates.io and copy Go with decentralized packages based directly on and an extended standard library.

      Centralized package managers only add a layer of obfuscation that attackers can use to their advantage.

      On the other hand, C / C++ style dependency management is even worse than Rust's... Both in terms of development velocity and dependencies that never get updated.

      • Ygg2 an hour ago

        > countless articles explaining what should be done instead (e.g. https://kerkour.com/rust-stdx)

        Don't make me tap the sign: https://news.ycombinator.com/item?id=41727085#41727410

        > Centralized package managers only add a layer of obfuscation that attackers can use to their advantage.

        They add a layer of convenience. C/C++ are missing that convenience because they aren't as composable and have a long tail of pre-package manager projects.

        Java didn't start with packages, but today we have packages. Same with JS, etc.

    • woodruffw 2 hours ago

      It’ll probably happen eventually with Rust, but ecosystem volume and informal packaging processes / a low barrier to entry seem to be significant driver in the npm world.

      (These are arguably good things in other contexts.)

    • vintagedave 4 hours ago

      I believe you, in that package management with dependencies without security mitigation is both convenient and dangerous. And I certainly agree this could happen for other package managers as well.

      My real worry, for myself re the parent comment is, it's just a web frontend. There are a million other ways to develop it. Sober, cold risk assessment is: should we, or should we have, and should anyone else, choose something npm-based for new development?

      Ie not a question about potential risk for other technologies, but a question about risk and impact for this specific technology.

    • newpavlov 2 hours ago

      While I agree that dependency tree size can be sometimes a problem in Rust, I think it often gets overblown. Sure, having hundreds of dependencies in a "simple" project can be scary, but:

      1) No one forces you to use dependencies with large number of transitive dependencies. For example, feel free to use `ureq` instead of `reqwest` pulling the async kitchen sink with it. If you see an unnecessary dependency, you could also ask maintainers to potentially remove it.

      2) Are you sure that your project is as simple as you think?

      3) What matters is not number of dependencies, but number of groups who maintain them.

      On the last point, if your dependency tree has 20 dependencies maintained by the Rust lang team (such as `serde` or `libc`), your supply chain risks are not multiplied by 20, they stay at one and almost the same as using just `std`.

      • galangalalgol 2 hours ago

        On your last note, I wish they would get on that signed crate subset. Having the same dependency tree as cargo, clippy, and rustc isn't increasing my risk.

        Rust has already had a supply chain attack propagating via build.rs some years ago. It was noticed quickly, so staying pinned to the oldest thing that worked and had no cve pop in cargo audit is a decent strategy. The remaining risk is that some more niche dependency you use is and always has been compromised.

      • assbuttbuttass 34 minutes ago

        Is serde maintained by the Rust team? I thought it was basically a one-man show owned by dtolnay

    • fouronnes3 4 hours ago

      Surely in this case the problem is a technical one, and with more work towards a better security model and practices we can have the best of both worlds, no?

    • vachina 3 hours ago

      Node is the embodiment of move and break things. Probably will not build anything that should last more than a few months on node.

    • trollbridge 2 hours ago

      An open question is why PyPI doesn’t have the same problem.

      • pxc 2 hours ago

        PyPI is also subject to supply chain attacks. What do you mean?

    • eptcyka 3 hours ago

      Go is just as bad.

    • mschuster91 3 hours ago

      > The more I think about it, the more I believe that C, C++ or Odin's decision not to have a convenient package manager that fosters a cambrian explosion of dependencies to be a very good idea security-wise. Ambivalent about Go: they have a semblance of packaging system, but nothing so reckless like allowing third-party tarballs uploaded in the cloud to effectively run code on the dev's machine.

      The alternative that C/C++/Java end up with is that each and every project brings in their own Util, StringUtil, Helper or whatever class that acts as a "de-facto" standard library. I personally had the misfortune of having to deal with MySQL [1], Commons [2], Spring [3] and indirectly also ATG's [4] variants. One particularly unpleasant project I came across utilized all four of them, on top of the project's own "Utils" class that got copy-and-paste'd from the last project and extended for this project's needs.

      And of course each of these Utils classes has their own semantics, their own methods, their own edge cases and, for the "organically grown" domestic class that barely had tests, bugs.

      So it's either a billion "small gear" packages with dependency hell and supply chain issues, or it's an amalgamation of many many different "big gear" libraries that make updating them truly a hell on its own.

      [1] https://jar-download.com/artifacts/mysql/mysql-connector-jav...

      [2] https://commons.apache.org/proper/commons-lang/apidocs/org/a...

      [3] https://docs.spring.io/spring-framework/docs/current/javadoc...

      [4] https://docs.oracle.com/cd/E55783_02/Platform.11-2/apidoc/at...

      • sph 3 hours ago

        That is true, but the hand-rolled StringUtil won't steal your credentials and infect your machine, which is the problem here.

        And what is wrong with writing your own util library that fits your use case anyway? In C/C++ world, if it takes less than a couple hours to write, you might as well do it yourself rather than introduce a new dependency. No one sane will add a third-party git submodule, wire it to the main Makefile, just to left-pad a string.

        • mschuster91 3 hours ago

          > That is true, but the hand-rolled StringUtil won't steal your credentials and infect your machine, which is the problem here.

          Yeah, that's why I said that this is the other end of the pendulum.

          > In C/C++ world, if it takes less than a couple hours to write, you might as well do it yourself rather than introduce a new dependency.

          Oh I'm aware of that. My point still stands - that comes at a serious maintenance cost as well, and I'd also say a safety cost because you're probably not wrapping your homebrew StringUtils with a bunch of sanity checks and asserts, meaning there will be an opportunity for someone looking for a cheap source of exploits.

          • skydhash 2 hours ago

            Wait what? That’s just fearmongering, how hard is it to add a few methods that split a string or pad it? It’s not rocket science.

            • inejge an hour ago

              > how hard is it to add a few methods that split a string or pad it?

              In full generality, pretty hard. If you're just dealing with ASCII or Latin-1, no problem. Then add basic Unicode. Then combining characters. Then emojis. It won't be trivial anymore.

              • skydhash 40 minutes ago

                Full generality is not a practical target. You select your subset of the problem and you solve it. Supporting everything in a project is usually a fever dream.

    • tjpnz 3 hours ago

      In the early days the Node ecosystem adopted (from Unix) the notion that everything has to be its own micro package. Not only was there a failure to understand what it was actually talking about, but it was never a good fit for package management to begin with.

      I understand that there's been some course correction recently (zero dependency and minimal dependency libs), but there are still many devs who think that the only answer to their problem is another package, or that they have to split a perfectly fine package into five more. You don't find this pattern of behavior outside of Node.

      • sph 3 hours ago

        > In the early days the Node ecosystem adopted (from Unix) the notion that everything has to be its own micro package.

        The medium is the message. If a language creates a very convenient package manager that completely eliminates the friction of sharing code, practically any permutation of code will be shared as a library. As productivity is the most important metric for most companies, devs will prefer the conveniently-shared third-party library instead of implementing something from scratch. And this is the result.

        I don't believe you can have packaging convenience and avoiding dependency hell. You need some amount of friction.

        • skydhash 2 hours ago

          It’s not even the convenience. It’s about trust. Npm makes it so that as soon as you add something to the dependency list, you trust the third party so completely you’re willing to run their code on your system as soon as they push an update.

          It’s essentially remote execution a la carte.

    • aa-jv 32 minutes ago

      > C/C++ .. a convenient package manager

      Every time I fire up "cmake" I chant a little spell that protects me from the goblins that live on the other side of FetchContent to promise to the Gods of the Repo that I will, eventually, review everything to make sure I'm not shipping poop nuggets .. just as soon as I get the build done, tested .. and shipped, of course .. but I never, ever do.

    • testdelacc1 3 hours ago

      I hate to be the guy saying AI will solve it, but this is a case where AI can help. I think in the next couple of years we’ll see people writing small functions with Claude/codex/whatever instead of pulling in a dependency. We might or might not like the quality of software we see, but it will be more resistant to supply chain attacks.

      • jeromegv 21 minutes ago

        When there's a depedency, it's typically not for a small function. If you want to replace a full dependency package by your own generated code, you'll need to review hundreds of even thousands of line of code.

        Now will you trust that AI didn't include its own set of security issues and will you have the ability to review so much code?

      • delaminator 40 minutes ago

        For sure. I don't think the software ecosystem has come to terms with how things are going to change.

        Libraries will be providing raw tools like - Sockets, Regex Engine, Cryptography, Syscalls, specific file format libraries

        LLMs will be building the next layer.

        I have build successful running projects now in Erlang, Scheme, Rust - I know the basic syntax of two of those but I couldn't write my deployed software in any of them in the couple of hours of prompting.

        The scheme it had to do a lot of code from first principles and warned me how laborious it would be - "I don't care, you are doing it."

        I have tools now I could not have imagined I could build in a reasonable time.

      • viraptor 3 hours ago

        I wonder what the actual result will be. LLMs can generate functions quickly, but they're also keen to include packages without asking. I've had to add a "don't add new dependencies unless explicitly asked" to a few project configs.

      • short_sells_poo 2 hours ago

        How is this going to solve the supply chain attack problem at all though? It just obfuscates things even more, because once an LLM gets "infected" with malicious code, it'll become much more difficult to trace where it came from.

        If anything, blind reliance on LLMs will make this problem much worse.

      • brigandish 2 hours ago

        An approach I learnt from a talk posted to HN (I forget the talk, not the lesson) is to not depend on the outside project for its code, just lift that code directly in to your project, but to rely on it for the tests, requiring/importing it etc when running your own tests. That protects you from a lot of things (this kind of attack was not mentioned, afaic recall) but doesn’t allow bugs found by the other project to be missed either.

  • Gigachad 4 hours ago

    The problem isn't specific to node. NPM is just the most popular repo so the most value for attacks. The same thing could happen on RubyGems, Cargo, or any of the other package managers.

    • vintagedave 4 hours ago

      The concern is not 'could' happen, but _does_ happen. I know this could occur in many places. But where it seems highly prevalent is NPM.

      And I am genuinely thinking to myself, is this making using npm a risk?

      • cluckindan 3 hours ago

        Just use dependency cooldown. It will mitigate a lot of risk.

        • yoavm 3 hours ago

          If you started your Node project yesterday, wouldn't that mean you'd get the fix later?

          • flexd 3 hours ago

            no, because if you used dependency cooldown you wouldn't be using the latest version when you start your project, you would be using the one that is <cooldown period> days/versions old

            edit: but if that's also compromised earlier... \o/

          • cluckindan 3 hours ago

            Obviously you bypass the cooldown to fix critical issues.

      • Ygg2 3 hours ago

        NPM is the largest possible target for such an attack.

        Attack an important package, and you can get into the Node and Electron ecosystem. That's a huge prize.

    • PunchyHamster 23 minutes ago

      Value is one thing but the average user (by virtue of being popular) will be just less clued in on any security practices that could mitigate the problem.

    • gred 3 hours ago

      NPM has about 4 million packages, Maven Central has about 3 million packages.

      If this were true, wouldn't there have been at least one Maven attack by now, considering the number of NPM attacks that we've seen?

      • chha 3 hours ago

        Been a while since I looked into this, but afaik Maven Central is run by Sonatype, which happens to be one of the major players for systems related to Supply Chain Security.

        From what I remember (a few years old, things may have changed) they required devs to stage packages to a specific test env, packages were inspected not only for malware but also vulnerabilities before being released to the public.

        NPM on the other hand... Write a package -> publish. Npm might scan for malware, they might do a few additional checks, but at least back when I looked into it nothing happened proactively.

      • skwee357 3 hours ago

        One speculation would be is that most Java apps in the wild use way older Java versions (say 17/11, while the latest will LTS is 21).

  • littlecranky67 35 minutes ago

    Professionally I am a fulltime FE Dev using Typescript+React. My Backends for my side projects are all done in C#, even so I'd be fluent in node+typescript for that very reason. In a current side project, my backend only has 3 external package dependencies, 2 of which are SQLite+ORM related. The frontend for that sideproject has over 50 (React/Typescript/MaterialUI/NextJS/NX etc.)

    • noveltyaccount 16 minutes ago

      .NET being so batteries-included is one of its best features. And when vulnerabilities do creep in, it's nice to know that Microsoft will fix it rather than hoping a random open source project will.

  • reconnecting 3 hours ago

    We chose to write our platform for product security analytics (1) with PHP, primarily because it still allows us to create a platform without bringing in over 100 dependencies just to render one page.

    I know this is a controversial approach, but it still works well in our case.

    "require": { "php": ">=8.0",

            "ext-mbstring": "*",
    
            "bcosca/fatfree-core": "3.9.1",
    
            "phpmailer/phpmailer": "6.9.3",
    
            "ruler/ruler": "0.4.0",
    
            "matomo/device-detector": "6.4.7" }
    
    1. https://github.com/tirrenotechnologies/tirreno
    • embedding-shape 3 hours ago

      Not sure what the language has anything to do with it, we've built JavaScript applications within pulling in 100s of NPM packages before NPM was a thing, people and organizations can still do so today, without having to switch language, if they don't want to.

      Does it require disciple and a project not run by developers who just learned program? You betcha.

      • reconnecting 2 hours ago

        I might say that every interpreter has a different minimum dependency level just to create a simple application. If we're talking about Node.js, there's a long list of dependencies by default.

        So yes, in comparison, modern vanilla PHP with some level of developer discipline (as you mentioned) is actually quite suitable, but unfortunately not popular, for low-dependency development of web applications.

        • cosmic_cheese 38 minutes ago

          The language and capabilities of the platform indeed have a lot of influence on how many packages the average project depends on.

          With Swift on iOS/macOS for instance it’s not strange at all for an app to have a dependency tree consisting of only 5-10 third party packages total, and with a little discipline one can often get that number down to <5. Why? Because between the language itself, UIKit/AppKit, and SwiftUI, nearly all needs are pretty well covered.

          I think it’s time to beef up both JavaScript itself as well as the platforms where it’s run (such as the browser and Node), so people don’t feel nearly as much of a need to pull in tons of dependencies.

        • embedding-shape 2 hours ago

          > If we're talking about Node.js, there's a long list of dependencies by default.

          But that's not true? I initialize a project locally, there is zero dependencies by default, and like I did five years ago, I can still build backend/frontend projects with minimal set of dependencies.

          What changed is what people are willing/OK with doing. Yes, it'll require more effort, obviously, but if you want things to be built properly, it usually takes more effort.

          • reconnecting 2 hours ago

            Perhaps, the right wording here might be that Node.js encourages the use of npm packages even for simple tasks.

            I agree that in any case, it's the courage/discipline that comes before the language choice when creating low-dependency applications.

    • Zagitta 3 hours ago

      Ah yes PHP, the language known for its strong security...

      • reconnecting 2 hours ago

        Oh yes, let's remember PHP 4.3 and all the nostalgic baggage from that era.

      • zwnow 2 hours ago

        Modern PHP is leagues above Javascript

  • Cthulhu_ 2 hours ago

    Node is fine, the issue lies in its package model and culture:

    * Many dependencies, so much you don't know (and stop caring) what is being used.

    * Automatic and regular updates, new patch versions for minor changes, and a generally accepted best practice of staying up to date on the latest versions of things, due to trauma from old security breaches or big migrations after not updating for a while.

    * No review, trust based self-publishing of packages and instant availability

    * untransparent pre/postinstall scripts

    The fix is both cultural and technological:

    * Stop releasing for every fart; once a week is enough, only exception being critical security reasons.

    * Stop updating immediately whenever there's an update; once a week is enough.

    * Review your updates

    * Pay for a package repository that actually reviews changes before making them widely available. Actually I think the organization between NPM should set that up, there's trillion dollar companies using the Node ecosystem who would be willing and able to pay for some security guarantees.

    • dboreham 32 minutes ago

      Microsoft owns npmjs.com. They could pay for AI analysis of published version deltas, looking for backdoors and malware.

  • skwee357 3 hours ago

    I’m not a node/js apologist, but every time there is a vulnerability in NPM package, this opinion is voiced.

    But in reality it has nothing to do with node/js. It’s just because it’s the most used ecosystem. So I really don’t understand the argument of not using node. Just be mindful of your dependencies and avoid updating every day.

    • shortrounddev2 2 hours ago

      it's interesting that staying up to date with your dependencies is considered a vulnerability in Node

      • skwee357 2 hours ago

        People who live on the edge of updates always risk vulnerabilities and incompatibility issues. It’s not about node, but anything software related.

      • bichiliad 2 hours ago

        Having a cooldown is different from never updating. I don’t think waiting a few days is a bad security practice in any environment, node or otherwise.

  • jollyllama 2 hours ago

    Hell no.

    You need standalone dependencies, like Tailwind offers with its standalone CLI. Predators go where there prey is. NPM is a monoculture. It's like running Windows in the 90's; you're just asking for viruses. But 90% of frontend teams will still use NPM because they can't figure anything else out.

  • paradite 4 hours ago

    There's only two kind of technologies.

    The ones that most people use and some people complain about, and the ones that nobody uses and people keep advocating for.

    • monooso 3 hours ago

      This a common refrain on HN, frequently used to dismiss what may be perfectly legitimate concerns.

      It also ignores the central question of whether NPM is more vulnerable to these attacks than other package managers, and should therefore be considered an unreasonable security risk.

  • sandruso 4 hours ago

    You can go very far with just node alone (accepts typescript without tsc, has testing framework,...). Include pg library that has no dependencies. Build a thin layer above node and you can have pretty stable setup. I got burnt so many times that I think it is simply impossible to build something that won't break within 3 months if you start including batteries.

    When it comes to frontend, well I don't have answers yet.

    • viraptor 3 hours ago

      You can write simple front-end without reactive components. Most pages are not full blown apps and they were fine for a very long time with jQuery, whose features have been largely absorbed into plain js/dom/CSS.

  • shevy-java 38 minutes ago

    You have this issue with ALL external code though. npm/node and javascript overall may exacerbate this problem, but you have it with any other remote repository too - often without even noticing it unless you pay close attention; see the xz-utils backdoor, it took a while before someone noticed the sneaky payload. So I don't think this works as a selective filter against using node, if you have a use case for it.

    Take ruby - even before when a certain corporation effectively took over RubyCentral and rubygems.org, almost two years ago they also added a 100.000 download limit. That is, after that threshold was passed, the original author was deprived of the ability to remove the project again - unless the author resigns from rubygems.org. Which I promptly did. I could not accept any corporation trying to force me into maintaining old projects (I tend to remove old projects quickly; the licence allows people to fork it, so they can maintain it if they want to, but my name can not be associated with outdated projects I already abandoned, since newer releases were available. The new corporate overlords running rubygems.org, who keep on lying about "they serve the community", refused to accept this explanation, so my time came to a natural end at rubygems.org. Of course this year it would be even easier since they changed the rules to satisfy their new corporate overlords anyway: https://blog.rubygems.org/2025/07/08/policies-live.html)

    • Yokohiii 25 minutes ago

      You forget to account for the fact that the xz-utils backdoor was extremely high effort. Literally a high skilled person building trust over time. While it's obviously possible and problematic, it's still a scaling/time issue.

  • matheusmoreira 3 hours ago

    It's not just npm, you should also not trust pypi, rubygems, cargo and all the other programming language package managers.

    They are built for programmers, not users. They are designed to allow any random untrusted person to push packages with no oversight whatsoever. You just make an account and push stuff. I have no doubt you can even buy accounts if you're malicious enough.

    Users are much better served by the Linux distribution model which has proper maintainers. They take responsibility for the packages they maintain. They go so far as to meet each other in person so they can establish decentralized root of trust via PGP.

    Working with the distributions is hard though. Forming relationships with people. Participating in a community. Establishing trust. Working together. Following packaging rules. Integrating with a greater dynamic ecosystem instead of shipping everything as a bloated container whose only purpose is to statically link dynamic libraries. Developers don't want to do any of that.

    Too bad. They should have to. Because the npm clusterfuck is what you get when you start using software shipped by totally untrusted randoms nobody cares to know about much less verify.

    Using npm is equivalent to installing stuff from the Arch User Repository while deliberately ignoring all the warnings. Malware's been found there as well, to the surprise of absolutely no one.

    • doug713705 2 hours ago

      There are far too many languages and many packages for each of them for this (good) idea to be practicable.

  • dkdbejwi383 4 hours ago

    Node itself is still fine and you can do a lot these days without needing tons of library. No need for axios when we have fetch, there's a built-in test runner and assertion library.

    There are some things that kind of suck (working with time - will be fixed by the Temporal API eventually), but you can get a lot done without needing lots of dependencies.

  • anonymous908213 4 hours ago

    Node doesn't have any particular relation to NPM? You don't have to download 1000 other people's code. Writing your own code is a thing that you are legally allowed to do, even if you're writing in Javascript.

    • jacquesm 3 hours ago

      Yes, and you can code in assembly as well if you want it. But: that's not how 99% of the people using node is using it so that it is theoretically possible to code up every last bit yourself is true but it does not contribute to the discussion at all.

      An eco-system, if it insists on slapping on a package manager (see also: Rust, Go) should always properly evaluate the resulting risks and put proper safeguards in place or you're going to end up with a massive supply chain headache.

      • anonymous908213 3 hours ago

        Writing code yourself so as not to cultivate 1000 dependencies you can't possibly ensure the security of is not the same as writing assembly. That you even reach for that comparison is indicative of the deep rot in Javascript culture. Writing your own code is perceived as a completely unreasonable thing to be doing to 99% of JS-devs and that's why the web performs like trash and has breaches every other day, but it's actually a very reasonable thing to be doing and people who write most any other language typically engage in the writing of own code on a daily basis. At any rate, JS the language itself is fine, Node is fine, and it is possible to adopt better practices without forsaking the language/ecosystem completely.

        • jacquesm 3 hours ago

          > That you even reach for that comparison is indicative of the deep rot in Javascript culture.

          Sorry?

          No, I'm the guy that does write all of his code from scratch so you're entirely barking up the wrong tree here. I am just realistic in seeing that people are not going to write more code than they strictly speaking have to because that is the whole point of using Node in the first place.

          The Assembly language example is just to point out the fact that you could plug in at a lower level of abstraction but you are not going to because of convenience, and the people using Node.js see it no different.

          JS is a perfectly horrible little language that is now being pushed into domains where it has absolutely no business being used (I guess you would object to running energy infrastructure on Node.js and please don't say nobody would be stupid enough to do that).

          Node isn't fine it needs a serious reconsideration of the responsibilities of the eco-system maintainers. See also: Linux, the BSDs and other large projects for examples of how this can be done properly.

          • notpachet 3 hours ago

            I feel like there are merits to your argument but that you have a larger anti-JS bias that's leaking through. Not that there aren't problems with Node itself, but as many people have pointed out, there are plenty of organizations writing in Node that aren't pwn'd by these sorts of attacks because we don't blindly update deps.

            Perfect is the enemy of good; dependency cooldown etc is enough to mitigate the majority of these risks.

            • jacquesm 3 hours ago

              > I feel like there are merits to your argument but that you have a larger anti-JS bias that's leaking through.

              Familiarity breeds contempt.

              • notpachet 2 hours ago

                The truth is typically somewhere in the middle. I feel you though. I'm that way with Ruby/Bundler.

            • acheron 39 minutes ago

              Reality has an anti-JS bias.

    • AIorNot 4 hours ago

      So your supposed to write your own posthog? be serious

      • anonymous908213 3 hours ago

        Yes. If your shop is serious about security, it is in no way unreasonable to be building out tools like that in-house, or else paying a real vendor with real security practices for their product. If you're an independent developer, the entirety of Posthog is overkill, and you can instead write the specific features you need yourself.

      • exasperaited 3 hours ago

        I tell people this over and over and over: every time you use a third party dependency, especially an ongoing one, you should consider that you are adding the developers to your team and importing their prior decisions and their biases. You add them to your circle of trust.

        You can't just scale out a team without assessing who you are adding to it: what is their reputation? where did they learn?

        It's not quite the same questions when picking a library but it is the same process. Who wrote it? What else did they write? Does the code look like we could manage it if the developer quits, etc.

        Nobody's saying you shouldn't use third party dependency. But nobody benefits if we pretend that adding a dependency isn't a lot like adding a person.

        So yeah, if you need all of posthog without adding posthog's team to yours, you're going to have to write it yourself.

        • reconnecting 3 hours ago

          > I tell people this over and over and over: every time you use a third party dependency, especially an ongoing one, you should consider that you are adding the developers to your team and importing their prior decisions and their biases. You add them to your circle of trust.

          Thanks! Now, I will also tell this to developers.

      • dkdbejwi383 4 hours ago

        If they have a HTTP API using standard authentication methods it's not that difficult to create a simple wrapper. Granted a bit more work if you want to do things like input/output validation too, but there's a trade-off between ownership there and avoiding these kinds of supply-chain attacks.

        • jacquesm 3 hours ago

          > Granted a bit more work if you want to do things like input/output validation too,

          A bit? A proper input validator is a lot of work.

          • dkdbejwi383 3 hours ago

            If you aim for 100% coverage of the API you're integrating with, sure. But for most applications you're going to only be touching a small surface area, so you can validate paths you know you'll hit. Most of the time you probably don't need 100% parity, you need Just Enough for your use-case.

            • jacquesm 3 hours ago

              That's an excellent way to get bitten.

              • dkdbejwi383 3 hours ago

                I'm not sure how you mean.

                To my understanding, there's less surface area for problems if I have a wrapper over the one or two endpoints some API provides, which I've written and maintain myself, over importing some library that wraps all 100 endpoints the API provides, but which is too large for me to fully audit.

    • paradite 3 hours ago

      npm has been the official package manager for node since forever (0.8 or earlier iirc). I think even before the io.js fork and merge.

  • throwawayffffas 3 hours ago

    Just lock your packages to patch versions, make sure to use versions that are at least a week old.

    And maybe don't update your dependencies very often.

  • jimbohn 3 hours ago

    If I had to bet, the most likely and pragmatic solution will be to have dependencies cooldown and that's it

    • creata 2 hours ago

      If everyone does it, then it becomes less effective, because there'd be fewer early testers to experience and report issues, no?

      • jimbohn an hour ago

        Yes, it's gonna be heuristics all way down. This problem isn't solved formally but the ecosystem(s) having these issues are too big to be discarded "just" because of that.

  • weregiraffe 3 hours ago

    Building websites =/= Developing new technologies.

    • fragmede 3 hours ago

      Yup! No new technologies have been invented or discovered thru building websites since CSS 1.0 in 1996.

      • reconnecting an hour ago

        Even worse! We lost <FRAME> along the way.

  • zwnow 4 hours ago

    Just keep the number of packages you use to a minimum. If some package itself has like 200 deps uninstall that and look for an alternative with less deps or think if you really need said package.

    I also switched to Phoenix using Js only when absolutely necessary. Would do the same on Laravel at work if switching to SSR would be feasible...

    I do not trust the whole js ecosystem anymore.

    • jacquesm 3 hours ago

      Did Phoenix not require npm at some point or is that not true?

      • allanmacgregor 3 hours ago

        At the beginning, but not anymore. You still have the option to pull libraries and packages but is not really required by default.

        • jacquesm 3 hours ago

          Oh that's great news I will have to look at it again then. That was a huge turn-off for me, to take one of the most well respected and reliable eco systems and then to pull in one of the worst as a dependency. Thank you for clearing that up.

  • jacquesm 3 hours ago

    > Serious question: should someone develop new technologies using Node any more?

    Please, no.

    It is an absolutely terrible eco system. The layercake of dependencies is just insane.

    • cluckindan 3 hours ago

      Node the technology can be used without blindly relying on the update features of npm. Vet your dependency trees, lock your dependency versions at patch level and use dependency cooldown.

      This is something you also need to do with package managers in other languages, mind you.

      • jacquesm 3 hours ago

        If everybody in your country drives on the right side of the road you could theoretically drive on the left. But you won't get very far like that.

        People use Node because of the availability of the packages, not the other way around.

        • prmph 2 hours ago

          > People use Node because of the availability of the packages, not the other way around.

          That is not why I use Node. Incidentally, I also use Bun.js, and pnpm for most package management operations. I also use Typescript instead of raw JS.

          I use Node and these related tools fundamentally because:

          - I like the isomorphism of the code I write (same language for server and client)

          - JS may have many warts, but IMO it has many advantages many other languages lack, it is rapidly improving, and TS makes it even more powerful and the bad part parts manageable. One ting that has stuck with me over the many years of using JS/TS is just how direct and free-of-ceremony everything is. Want a functional style? It supports it to some extent without much fuss. Want something akin to OOP? You can object literal with method-style function, "constructors" that are regular functions, even no-fuss prototypical inheritance, if you want to go that far. Also, no need for any complicated dependency injection (DI), you can just implement pure DI with regular functions, etc. I don't get why you hate JS/TS so much.

          - I use Bun.js as an alternative to Node that has more batteries included, so that I can limit my exposure to too many external packages. I add packages only if I absolutely need them, and I audit them thoroughly. So, no, although I may use some packages, I am not on the Node ecosystem just because I want to go on a package consumption spree.

          - I use pnpm for installing and managing package, and it by default prevents packages from taking any actions during installation; I just get their code.

          • jacquesm 2 hours ago

            Would you consider your use cases typical for the average Node.js ecosystem denizen?

        • cluckindan 3 hours ago

          That’s not a very good analogy. Doing what I suggested is not illegal and doesn’t prevent you from using packages from npm. It’s more akin to due diligence: before driving, you check that your car is safe to drive. At the gas and service station, you choose the proper fuel, proper lubricants and spare parts from a reputable vendor which are appropriate for your car.

          • jacquesm 3 hours ago

            Nobody - and I mean absolutely nobody - using Node.js has fully audited all of the dependencies they use and if we find somewhere in a cave a person that did that they are definitely not going to do it all over again when something updates.

            • cluckindan 3 hours ago

              I can guarantee that any financial institution which has standard auditing requirements and is using Node.js has fully audited all of the dependencies they use.

              Outside that, the issue is not unique to Node.js.

              • jacquesm 3 hours ago

                Sorry, but that had me laughing out loud.

                No, they haven't.

                I should know, I check those companies for a living. This is one of the most often flagged issues: unaudited Node.js dependencies. "Oh but we don't have the manpower to do that, think about how much code that is".

                • DamonHD 2 hours ago

                  When I last looked (as a consulting dev in a bank or three, horrified) absolutely they had not!

                  • cluckindan 2 hours ago

                    If this was in the US, all financial institutions need to audit their code to comply with NIST SP 800-53.

                    If they haven’t, it would be ethically dubious for you to not report it.

  • rvz 4 hours ago

    > Serious question: should someone develop new technologies using Node any more?

    I think we have given the Typescript / Javascript communities enough time. These sort of problems will continue to happen regardless of the runtime.

    Adding one more library increases the risk of a supply-chain attack like this.

    As long as you're using npm or any npm-compatible runtime, then it remains to be an unsolved recurring issue in the npm ecosystem.

  • sublinear 4 hours ago

    The list of affected packages are all under namespaces pretty much nobody uses or are subdependencies of junk libraries nobody should be using if they're serious about writing production code.

    I'm getting tired of the anti-Node.js narrative that keeps going around as if other package repos aren't the same or worse.

    • rlpb 2 minutes ago

      You need to explain how one is supposed to distinguish and exclude "namespaces pretty much nobody uses" when writing code in this ecosystem. My understanding is that a typical Node developer pretty much has no control over what gets pulled in if they want to get anything done at all. If that's the case, then you don't have an argument. If a developer genuinely has no control, then the point is moot.

    • pxc 4 hours ago

      The only way a worm like this spreads is usage of the affected packages. The proliferation itself is clear evidence of use.

    • DJBunnies 4 hours ago

      Ok, I'll bite; which package repos are "the same or worse" than those of nodejs?

      • cluckindan 3 hours ago

        All of them. The issue at hand is not limited to a specific language or tool or ecosystem, rather it is fundamental to using a package manager to install and update 3rd party libraries.

    • macNchz 3 hours ago

      I see a bunch under major SaaS vendor namespaces that have millions of weekly downloads…?

      • sublinear 3 hours ago

        Popular junk is still junk

darkamaul 4 hours ago

The "use cooldown" [0] blog post looks particularly relevant today.

I'd argue automated dependency updates pose a greater risk than one-day exploits, though I don't have data to back that up. That's harder to undo a compromised package already in thousands of lock files, than to manually patch a already exploited vulnerability in your dependencies.

[0] https://blog.yossarian.net/2025/11/21/We-should-all-be-using...

  • jacquesm 3 hours ago

    But even then you are still depending on others to catch the bugs for you and it doesn't scale: if everybody did the cooldown thing you'd be right back where you started.

    • woodruffw 2 hours ago

      The assumption in the post is that scanners are effective at detecting attacks within the cooldown period, not that end-device exploitation is necessary for detection.

      (This may end up not being true, in which case a lot of people are paying security vendors a lot of money to essentially regurgitate vulnerability feeds at them.)

  • Sammi 2 hours ago

    Pretty easy to do using npm-check-update:

    https://www.npmjs.com/package/npm-check-updates#cooldown

    In one command:

      npx npm-check-updates -c 7
    • tragiclos 8 minutes ago

      The docs list this caveat:

      > Note that previous stable versions will not be suggested. The package will be completely ignored if its latest published version is within the cooldown period.

      Seems like a big drawback to this approach.

  • Ygg2 3 hours ago

    I don't buy this line of reasoning. There are zero/one day vulnerabilities that will get extra time to spread. Also, if everyone switches to the same cooldown, wouldn't this just postpone the discovery of future Shai-Huluds?

    I guess the latter point depends on how are Shai-Huluds detected. If they are discovered by downstreams of libraries, or worse users, then it will do nothing.

    • __s 2 hours ago

      There are companies like Helix Guard scanning registries. They advertise static analysis / LLM analysis, but honeypot instances can also install packages & detect certain files like cloud configs being accessed

rglover 14 minutes ago

This is a good sign that it's time to get packages off of NPM and come up with an alternative. For those who haven't heard of or tried Verdaccio [1], it may be an option. Relatively easy to point at your own server via NPM once you set it up.

[1] https://verdaccio.org/

timgl 4 hours ago

co-founder of PostHog here. We were a victim of this attack. We had a bunch of packages published a couple of hours ago. The main packages/versions affected were:

- posthog-node 4.18.1, 5.13.3 and 5.11.3

- posthog-js 1.297.3

- posthog-react-native 4.11.1

- posthog-docusaurus 2.0.6

We've rotated keys and passwords, unpublished all affected packages and have pushed new versions, so make sure you're on the latest version of our SDKs.

We're still figuring out how this key got compromised, and we'll follow up with a post-mortem. We'll update status.posthog.com with more updates as well.

  • bilalq 44 minutes ago

    You're probably already planning this, but please setup an alarm to fire off if a new package release is published that is not correlated with a CI/CD run.

  • brabel 4 hours ago

    If anything people should use an older version of the packages. Your newest versions had just been compromised, why should anyone believe this time and next time it will be different?!

    • timgl 3 hours ago

      The packages were published using a compromised key directly, not through our ci/cd. We rolled the key, and published a new clean version from our repo through our CI/CD: https://github.com/PostHog/posthog-js/actions/runs/196303581...

      • progbits 3 hours ago

        Why do you keep using token auth? This is unacceptable negligence these days.

        NPM supports GitHub workflow OIDC and you can make that required, disabling all token access.

        • timgl 3 hours ago

          Yep, we are moving to workflow OIDC as the next step in recovery.

        • junon 2 hours ago

          OIDC is not a silver bullet either and has its own set of vectors to consider too. If it works for your org model then great, but it doesn't solve every common scenario.

          • woodruffw an hour ago

            Trusted Publishing addresses the vector here, which is arbitrary persistence and delayed use of credentials by attackers. You're right that it's not a silver bullet (anything claiming to be one is almost certainly a financially induced lie), but it eliminates/foreshortens the attack staging window significantly.

  • Y_Y 3 hours ago

    > so make sure you're on the latest version of our SDKs.

    Probably even safer to not have been on the latest version in the first place.

    Or safer again not to use software this vulnerable.

    • tclancy 2 hours ago

      Popularity and vulnerability go hand in hand though. You could be pretty safe by only using packages with zero stars on GitHub, but would you be happy or productive?

  • spiderfarmer 4 hours ago

    If we don't know how it got compromised, chances are this attack is still spreading?

  • _alternator_ 4 hours ago

    Glad you updated on this front-page post. Your Twitter post is buried on p3 for me right now. Good luck on the recovery and hopefully this helps someone.

das_keyboard an hour ago

Slightly OT, but who is HelixGuard?

The website is a mess (broken links, broken UI elements, no about section)

There is no history on webarchive. There is no information outside of this website and their "customers" are crypto exchanges and some japanese payment provider.

This seems a bit fishy to me - or am I too paranoid?

bodash 2 hours ago

I compiled a list of NPM best practices one can adopt to reduce supply chain attack risks (even if there's no perfect security preventions, _always_): https://github.com/bodadotsh/npm-security-best-practices

Discussion on HN last time: https://news.ycombinator.com/item?id=45326754

  • herpdyderp 18 minutes ago

    For anyone publishing packages for others to use: please don't pin exact dependency versions. Doing so requires all your users to set "overrides" in their own package.json when your dependencies have vulnerabilities.

  • giantg2 2 hours ago

    Do you know of anything similar for pip?

    • bodash an hour ago

      Most of the best practices can be translated to python ecosystem. It’s not exact 1:1 mapping but change few key terms and tools, the underlying practices should be the same.

      Or copy that repo’s markdown into an llm and ask it to map to the pip ecosystem

vintagedave 4 hours ago

The list of packages looks like these are not just tiny solo-person dependencies-of-dependencies. I see AsyncAPI and Zapier there. Am I right that this seems quite a significant event?

AsyncAPI is used as the example in the post. It says the Github repo was not affected, but NPM was.

What I don't understand from the article is how this happened. Were the credentials for each project leaked? Given the wide range of packages, was it a hack on npm? Or...?

  • merelysounds 4 hours ago

    There is an explanation in the article:

    > it modifies package.json based on the current environment's npm configuration, injects [malicious] setup_bun.js and bun_environment.js, repacks the component, and executes npm publish using stolen tokens, thereby achieving worm-like propagation.

    This is the second time an attack like this happens, others may be familiar with this context already and share fewer details and explanations than usual.

    Previous discussions: https://news.ycombinator.com/item?id=45260741

    • vintagedave 3 hours ago

      Thanks. I saw that sentence but somehow didn't parse it. Need a coffee :/

  • throw-the-towel 4 hours ago

    My understanding is, it's a worm that injects itself into the current package and publishes infected code to npm.

k__ 15 minutes ago

Maybe, we have to rethink depencies from the ground up.

Implementing everything yourself probably won't cut it.

Copying a dependency into your code base and maintaining it yourself probably won't yield much better results.

However, if a dependency would be part of the version control, depends could at least do a code review before installing an update.

That wouldn't help with new dependencies, that come in with issues right from.the start, but it could help preventing new malware from slipping in later.

A setup like that could benefit from a crowd-sourced review process, similar to Wikipedia.

I think, Nimble, the package manager of Nim, uses a decentralised registry approach based on Git repos. Something like that could be a good start.

codedokode 2 hours ago

Does NPM use any automatic scanners? Just scanning for eval/new Function/base64 and other tokens often used by malware, and requiring a manual review, could already help.

Also package manager should not run scripts.

  • amiga386 2 hours ago

    Static scanning won't help. You can write this["eval"]() instead of eval(), therefore you can write this["e" + "v" + "a" + "l"](), and you can substitute (!![]+[])[!+[]+!+[]+!+[]] for "e", (![]+[])[+!+[]] for "a" (and so on: https://jsfuck.com/)

    In this Turing-equivalent world, you can only know what actually executes (e.g. eval, fetch) by actually executing all code in the package and then see what functions got executed. Then the problem is the same as virus analysis; the virus can be written to only act under certain conditions, it will probe (e.g. look at what intepreter fingerprints, get the time of day, try to look at innocuous places in filesystem or network, measure network connection times, etc), so that it can determine it is in a VM being scanned, and go dormant for that time.

    So the only thing that actually works is if node and other JS evaluators have a perfect sandbox, where nothing in a module is allowed (no network, no filesystem) except to explicit locations declared in the module's manifest, and this is perfectly tracked by the language, so if the module hands back a function for some other code to run, that function doesn't inherit the other code's network/fs access permissions. This means that, if a location is not declared, the code can't get to it at scanning time nor install time nor any time in the future.

    This still leaves open the door for things like a module defining GetGoogleAnalyticsURL(params) that occasionally returns "https://badsite.com/copyandredirect?ga=...", to get some other module to eventually make a credential-exfiltrating network call, even if it's banned from making it directly or indirectly...

    • codedokode a minute ago

      Well, writing obfuscated code like ["e" + "v" + "a" + "l"]() is already a huge red flag for sending the package to manual review. While it might be impossible to detect all methods of obfuscation, we could start with known methods.

    • phendrenad2 an hour ago

      There's always some mathematician who tries to prove that locks on your doors "won't help" because the universe is infinite. Narrator: it is not

      • amiga386 an hour ago

        Deciding to put your resources into something that only a really stupid criminal would be caught by gives you a false sense of security.

        Literally scanning for just "eval(" is entirely insufficient. You have to execute the code. Therefore you have to demand module authors describe how to execute code, e.g. provide a test suite, which is invoked by the scanner, and require the tests to exercise all lines of code. Provide facilities to control the behaviour of functions outside the module so that this is feasible.

        This is a lot of work, so nobody wants to do it, so they palm you off with the laziest possible solution - such as literally checking for "eval(" text in the code - which then catches zero malware authors and wastes resources providing help to developers caught as a false positive, meanwhile the malware attacks continue unabated because no effective mechanism to stop them has been put in place.

        Reminds me of the fraudster who sold fake bomb detectors to people who had a real need to stop bomb attacks. His detectors stopped zero bomb attacks. https://www.bbc.co.uk/news/uk-29459896

        • seethishat 35 minutes ago

          Which brings up a good point... is any company doing dynamic evaluation of the package updates to see what they are actually doing?

mittermayr 3 hours ago

I always (very naively, I fully get it) wonder if someone at GitHub could take a minute and check the logs (if there are any at this level) from a week ago or so and scan them for patterns? The code seems to grab a few files off of GitHub, use Github actions, etc. -- perhaps there's a pattern in there that shows the attacker experimenting and preparing for this? I assume most people at this level have VPNs and so forth, but I'd never underestimate the amount of bad luck even those folks can have. Would be interesting, I know I'd have a look, if those logs existed.

  • not_doctorq an hour ago

    I have first hand knowledge that they do, or at least that the data exists and can be queried in that way, but it’s a game of cat and mouse.

  • hofrogs 2 hours ago

    That's usually what those security companies do, they monitor all those repositories and look for patterns, then investigate anything suspicious.

tomaytotomato 3 hours ago

Could npm adopt a reverse domain naming system similar to Java's for Maven libraries?

com.foo.bar

That would require domain verification, but it would add significant developer friction.

Also mandatory Dune reference:

"Bless the maker and his water"

  • KomoD 3 hours ago

    I don't see how this solves the problem?

  • ramon156 3 hours ago

    I was thinking something similar to cargo-audit, because domain names don't really fix anything here

amiga386 3 hours ago

"No Way To Prevent This" Says Only Package Manager Where This Regularly Happens

  • thih9 3 hours ago

    Parent comment is an indirect reference to US mass shootings:.

    > "'No Way to Prevent This,' Says Only Nation Where This Regularly Happens" is the recurring headline of articles published by the American news satire organization The Onion after mass shootings in the United States.

    Source: https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...

  • globalise83 3 hours ago

    No Preventative Measures (NPM)

    • zenmac 3 hours ago

      You can host your own NPM reg, and examine every package, but your manager probably is NOT going to go for that.

  • creata 3 hours ago

    There's nothing technically different between NPM and, say, Cargo, here that would save Cargo, is there?

    • nagisa 2 hours ago

      I would say that npm likely has easier solutions here compared to Cargo.

      Well before the npm attacks were a thing, we within the Rust project, have discussed a lot of using wasm sandboxing for build-time code execution (and also precompiled wasm for procedural macros, but that's its own thing.) However the way build scripts are used in the Rust ecosystem makes it quite difficult enforce sandbox while also enabling packages to build foreign code (C, C++ invoke make, cmake, etc.) The sandbox could still expose methods to e.g. "run the C compiler" to the build scripts, but once that's done they have an arbitrary access to a very non-trivial piece of code running in a privileged environment.

      Whereas for Javascript rarely does a package invoke anything but other javascript code during the build time. Introduce a stringent sandbox for that code (kinda deno style perhaps?) and a large majority of the packages are suddenly safe by default.

    • tjpnz 2 hours ago

      This is a cultural problem created through a fundamental misunderstanding (and mis-application) of Unix philosophy. As far as I'm aware the Rust ecosystem doesn't have a problem appropriately sizing packages which in turn reduces the overall attack surface of dependencies.

      • creata 2 hours ago

        I agree, but imo the Rust ecosystem has the same problem. Not to the extent of NPM, but worse than C/C++.

      • junon 2 hours ago

        This has nothing to do with package sizes. Cargo was just hit with a phishing campaign not too long ago, and does still use tokens for auth. NPM just has a wider surface area.

  • AndroTux 3 hours ago

    Okay then, tell me a way to prevent this.

    • amiga386 2 hours ago

      An example: Java Maven artifacts typically name the exact version of their dependencies. They rarely write "1.2.3 or any newer version in the 1.2.x series", as is the de-facto standard in NPM dependencies. Therefore, it's up to each dependency-user to validate newer versions of dependencies before publishing a new version of their own package. Lots of manual attention needed, so a slower pace of releases. This is a good thing!

      Another example: all Debian packages are published to unstable, but cannot enter testing for at least 2-10 days, and also have to meet a slew of conditions, including that they can be and are built for all supported architectures, and that they don't cause themselves or anything else to become uninstallable. This allows for the most egregious bugs to be spotted before anyone not directly developing Debian starts using it.

      • jml78 an hour ago

        You forgot to mention it is also tied to provable namespaces. People keep saying that NPM is just the biggest target...

        Hate to break it to you but from targeting enterprises, java maven artifacts would be a MASSIVE target. It is just harder to compromise because NPM is such shit.

    • seethishat 30 minutes ago

      I think some system would need to dynamically analyze the code (as it runs) and record what it does. Even then, that may not catch all malicious activity. It's sort of hard to define what malicious activity is. Any file read or network conn could, in theory, be malicious.

      As a SW developer, you may be able to limit the damage from these attacks by using a MAC (like SELinux or Tomoyo) to ensure that your node app cannot read secrets that it is not intended to read, conns that it should not make, etc. and log attempts to do those things.

      You could also reduce your use of external packages. Until slowly, over time you have very little external dependencies.

    • Balinares 2 hours ago

      Other languages seem to publish dependencies as self-contained packages whose installation does not require running arbitrary shell scripts.

      This does not prevent said package from shipping with malware built in, but it does prevent arbitrary shell execution on install and therefore automated worm-like propagation.

    • blueflow 3 hours ago

      The same way it always has been done - vendor your deps.

      • joshstrange 2 hours ago

        That literally makes no difference at all. You’ll just vendor the malicious versions. No, a lock file with only exact versions is the safe path here. We haven’t seen a compromise to existing versions that I know of, only patch/minor updates with new malicious code.

        I maintain that the flexibility in npm package versions is the main issue here.

        • blueflow 2 hours ago

          You are using the word "vendoring" differently than i do, i mean some kind of private fork of the repository.

          • joshstrange 2 hours ago

            You are using the word differently than everyone else I think. I’ve never heard someone using that word to mean maintain private forks. Then again, even private forks don’t protect you much more than package lock files and they are way more overhead IMHO.

            You still need some out-of-band process to pull upstream updates and aside from a built-in “cool down” (until you merge changes) I see that method as having a huge amount of downside.

            Yes, you sidestep malicious versions pushed to npm but now you own the build process for all your dependencies and you have to find time to update (and fix builds if they break) all your dependencies.

            Locking to a specific version and waiting some period of time (cool down) before updating is way easier and jus as safe IMHO.

            • Yokohiii 2 minutes ago

              Vendoring literally just means grabbing the source code from origin and commit it to your repo after a review. The expectation that every repo has important regular updates for you is pure FOMO. And if I don't do random updates for fun, nothing will every break.

              Version locking wont help you all the time, i.e. if you build fresh envs from scratch.

      • sph 3 hours ago

        To be fair this does only work in ecosystems where libraries are stable and don't break every 3 months as it often happens on the JS world.

        You can vendor your left-pad, but good luck doing that with a third-party SDK.

        • CGamesPlay 3 hours ago

          ... you vendor the third-party SDK? Nobody worth working with is breaking their SaaS APIs with that cadence.

      • hu3 3 hours ago

        that's what I do whenever feasible. Which is often

    • codedokode 2 hours ago

      Hire an antivirus company to provide a safe and verified feed of packages. Use ML and automatic scanners to send packages to manual review. While Halting problem prevents us from 100% reliably detecting malware, at least we can block everything suspicious.

westoque 4 hours ago

a concern i have is that it's only a matter of time before a similar attack is done to electron based apps (which also have packages installed using npm). probably worse because it's installed in your computer and can potentially get any information especially given admin privileges.

throwawayffffas 3 hours ago

> Upon execution, the malware downloads and runs TruffleHog to scan the local machine, stealing sensitive information such as NPM Tokens, AWS/GCP/Azure credentials, and environment variables.

That's a wake up call to harden your operations. NPM Tokens, AWS/GCP/Azure credentials have no reason to be available in environments where packages may be installed. The same goes for sensitive environment variables.

  • junon 2 hours ago

    That's the goal, but it's not feasible in e.g. professional settings. Much easier said than done, unfortunately.

    • codedokode 2 hours ago

      My code editor works in a sandbox. It's difficult because Linux doesn't provide it and one has to write it manually using shell scripts, random utilities. For example, I had also to write a limited FUSE emulation of /proc to allow code editor work without access to real /proc which contains lot of unnecessary information.

      And if it's a "professional" setting, the company could hire a part-time developer for writing the sandbox.

      • bartmr an hour ago

        could you share with us those utilities? I've tried doing the same with AppArmor, but I ended up having endless warnings and weird bugs.

      • junon 2 hours ago

        Good luck selling that to thousands of managers. That's my point. It's easy to list things that should be done. It's harder to get them greenlit.

darnthenuggets an hour ago

Both of these attacks have used trufflehog. Is there an out of the box way to block that executable by name or signature?

prmph 2 hours ago

There is no easy solution to these problems.

The solutions that are effective also involve actually doing work, as developers, library authors, and package managers. But no, we want as much "convenience" as possible, so the issues continue.

Developers and package authors should use a lockfile, pin their dependencies, be frugal about adding dependencies, and put any dependencies they do add through a basic inspection at least, checking what dependencies they also use, their code and tests quality, etc.

Package managers should enforce namespacing for ALL packages, should improve their publishing security, and should probably have an opt-in verified program for the most important packages.

Doing these will go a long way to ameliorate these supply chain attacks.

scottcorgan 16 minutes ago

Thought this was about the band ...

rishabhaiover 2 hours ago

Why can't package managers enforce attestations backed by a transparent log for each commit made to a public repository?

  • dboreham 15 minutes ago

    They can but that wasn't done in this case and isn't commonly done for various reasons.

  • hashstring an hour ago

    They can, but what does it solve? If a malicious package gets pushed, who or what is the equivalent of the CA that you are you going to nuke?

    • rishabhaiover 38 minutes ago

      I was working with the assumption in this model the attestation is signed by ephemeral keys (OIDC) which would reveal the bad actor or give breadcrumbs. Enough to reduce incentives to hijack packages.

qbane 2 hours ago

`--ignore-scripts` should be the default behavior.

inesranzo 3 hours ago

If the JS ecosystem continues like this, we're Duned.

deanc 2 hours ago

I see a bunch of postman packages vulnerable. Does that mean the desktop application is compromised (oof)?

I_am_tiberius 4 hours ago

I guess you should never use the latest versions of libraries.

  • kaelwd 4 hours ago

    Everyone needs to switch to pnpm and enable https://pnpm.io/settings#minimumreleaseage

    Pnpm also blocks preinstall scripts by default.

    • loloquwowndueo 2 hours ago

      Nah - dependency cooldown is all the rage but it’s only effective if you have some noncompliant canary users. Once everyone is using it it will cease to be effective because nobody will be taking the first step/risk until everybody does.

      • moebrowne 2 hours ago

        The point of the cooldown is to allow time for vendor scans to complete and for compromised packages to be pulled. It's not about waiting for an end user to notice they've been compromised.

        > Meanwhile, the aforementioned vendors are scanning public indices as well as customer repositories for signs of compromise, and provide alerts upstream (e.g. to PyPI).

        https://blog.yossarian.net/2025/11/21/We-should-all-be-using...

        • loloquwowndueo an hour ago

          Depending on “security vendors” to do scans of every single update seems naive and over optimistic to me, but hey - everyone’s jumping on the bandwagon regardless of what I think so I guess we’ll see soon.

          • limaho 12 minutes ago

            Don't "security venders" detect and report most of these types of attacks already today?

  • Ygg2 4 hours ago

    But you also need the latest versions to avoid zero-day attacks.

    • lpribis 2 hours ago

      99% of releases do NOT fix zero-days. But 100% of releases have a small risk of introducing a backdoored build-script.

      There's nothing wrong with pinning dependencies and only updating when you know for sure they're fixing a zero-day (as it will be public at that point).

    • zelphirkalt an hour ago

      Zero-day on frontend has not really a y effect, except on one user at a time. Zero-day on a server though ... perhaps we arrive at the conclusion to not use the JS ecosystem on the server side.

    • nalekberov 3 hours ago

      do zero-days even care about versions?

  • sublinear 4 hours ago

    Not sure if you're serious, but if so I agree that people should take the time to set up their own package mirrors. Not just for npm but all other package managers as well.

    This is why it's so important to get to know what you're actually building instead of just "vibing" all the time. Before all the AI slop of this decade we just called it being responsible.

    • prmph 2 hours ago

      Exactly, there is no easy solution to these problems.

      The solutions that are effective also involve actually doing work, as developers, library authors, and package managers. But no, we want as much "convenience" as possible, so the issues will continue.

      Developers and package authors should use a lockfile, pin their dependencies, be frugal about adding dependencies, and put any dependencies they do add through a basic inspection at least, checking what dependencies they also use, their code and tests quality, etc.

      Package managers should enforce namespacing for ALL packages, should improve their publishing security, and should probably have an opt-in verified program for the most important packages.

      Doing these will go a long way to ameliorate these supply chain attacks

    • moebrowne 2 hours ago

      How does having a mirror help?

jhancock 2 hours ago

Is there a terminal AI assistant that doesn't have heaps of depenedancies and preferably no node? Claude and codex both require node. I'm a fan of the lightweight octofriend. But also node. I do not like installing node on systems that otherwise would not require it.

  • ashirviskas an hour ago

    You can install codex without npm if you build it yourself, they have migrated to rust in June and npm is just a convenient install wrapper it seems.

    Just `git clone git@github.com:openai/codex.git`, `cd codex-rs`, `cargo build --release` (If you have many cores and not much RAM, use `-j n`, where n is 1 to 4 to decrease RAM requirements)

  • gspr 2 hours ago

    llama.cpp?

    • ashirviskas an hour ago

      Does it have a terminal assistant that I have not heard of? Otherwise, the parent asks about an assistant that is able to run various tools and stuff, not just talk.

jhancock 3 hours ago

containerize all the things...Nix, Podman, Docker. It's not a big hassle once you get through the initial steps.

Would be good to see projects (like those recently effected) nudging devs to do this via install instructions.

  • christophilus 2 hours ago

    Yep. This is what I do. I edit and run my code in a container. That container cannot access my ssh keys or publish to GitHub. I review all changes, and manually commit / publish on my host. It’s not perfect, but that plus vendoring my dependencies goes a long way towards mitigating these kinds of things.

wiz21c 2 hours ago

Once again, you cannot ask the open source world to provide you with free dependencies and security.

At some point, someone has to pay for an organisation whose job will be to review the contents of all of these modules.

Maybe one could split the ecosystem into "validated" and "non validated" stacks ? much like we have stable and dev branches ?

The people validating would of course give their own identity to build trust. And so, companies (moral person) should do that.

benob an hour ago

How was the attack detected in the first place?

dboreham 36 minutes ago

Here's the underlying problem: let's imagine someone very smart. They figure out a way to solve this problem. They are not going to make any money by doing so. That's why we have this problem.

jz10 3 hours ago

Funny coincidence reading this while in the middle of rewatching Dune 2 on Netflix

  • throwawayffffas 2 hours ago

    My guy what are you doing on HN. Put down the phone and watch the movie.

exceptione 2 hours ago

My motto wrt language choices: "It's the standard lib, stupid!"

My ultra hot take: there are only¹ two² programming ecosystems suitable for serious³ work:

  - .net (either run on CLR or compile as an AOT standalone binary)
  - jvm
The reason why is because they have a vast and vetted std lib. A good standard lib is a bigger boost then any other syntactic niceties.

  __
  1. I don't want other programming languages to die, so I am happy if you disagree with me. Other valid objection: some problems are better served by niche languages. Still, both .net and java support a plethora of niche languages.
  2. Shades of gr[e|a]y, some languages are more complete out of the box than others. 
  3. cf «pick boring tools»
  • querez 2 hours ago

    Arguably both Go and Python also have great stdlibs. The only advantage that JVM and .NET have is a default GUI package. Which is fair, but keeps getting less and less relevant as people rely more on web UIs.

    • exceptione an hour ago

      Respectfully disagree. Python and Go std lib do not even play in the same league. I had to help someone with datetime¹ handling in Python a while back. The stdlib is so poor, you have to reach out for a thirdparty lib for even the most basic of tasks².

      Don't take my word for it, take a dive. You wouldn't be the first to have adjust their view.

      For example, this section is just about the built-in web framework asp.net: https://learn.microsoft.com/en-us/aspnet/core

      ______

      1. This might be a poor example as .net has NodaTime and the jvm has YodaTime as 3rd-party libs, for if one has really strict needs. Still, the builtin DateTime constructs offer way more than what Python had to offer.

      2. Don't get me started on the ORM side of things. I know, you don't have to use one, but if you do, it better does a great job. And I wouldn't bat an eye if the ORM is not in the standard, but boy was I disappointed in Python's ecosystem. EF Core come batteries included and is so much better, it isn't fun anymore.

    • BrouteMinou an hour ago

      .Net has Blazor for WebUI.

      I don't ask you to judge if you like it, I'm just saying that you can totally make a professional WebUI within the dotnet stdlib.

nautilus12 an hour ago

If you always run npm inside of docker does that pretty much prevent attacks like this?

rvz 4 hours ago

Very concerning, so that was what the "impending disaster" was as I first noted. [0] Quite worrying that this happened again to the NPM ecosystem.

Really looking forward to a deeper post-mortem on this.

[0] https://news.ycombinator.com/item?id=46031864

  • jacquesm 3 hours ago

    It will keep happening until someone takes responsibility and starts maintaining the whole of the node eco system. This is probably a viable start-up idea: Node but audited.

    • notpachet 3 hours ago

      Maybe we can convince Shopify to hijack NPM too while they're at it.

spiderfarmer 4 hours ago

Will the list of affected packages expand? How were these specific packages compromised in the first place?

wolfi1 3 hours ago

the left-pad fiasco seems to have been the only time npm changed a policy and reacted to a security problem, since then it seems that supply chain attacks just belong to the npm-eco-system

yourapostasy 2 hours ago

GitHub back in September already published their roadmap of mitigations to NPM supply chain attacks:

https://github.blog/security/supply-chain-security/our-plan-...

I'm guessing no one yet wants to spend the money it takes for centralized, trusted testing where the test harnesses employ sandboxing and default-deny installs, Deterministic Simulated Testing (DST), or other techniques. And the sheer scale of NPM package modifications per week makes human in the loop-based defense daunting, to the point that only a small "gold standard" subset of packages that has a more reasonable volume of changes might be the only palatable alternative.

What are the thoughts of those deep inside the intersection of NPM and cybersecurity?

  • dboreham 5 minutes ago

    You would need to hear the thoughts of those deep inside the intersection of money and money.

julius-fx 4 hours ago

The list of affected packages is concerning - indeed.

kome 3 hours ago

why don't web devs just learn html and css properly, and maybe xslt for the really complex transformations then use vanilla js only when it's truly necessary?

instead we've got this absolute mess of bloated, over-engineered junk code and ridiculously complicated module systems.

  • vorticalbox 2 hours ago

    the issue is not that devs don't know what they are its that they don't pin packages

    if you run `npm i ramda` it will set this to "ramda": "^0.32.0" (as of comment)

    that ^ means install any version that is a feature or patch.

    so when a package is released with malware they bump version 0.32.1 and everyone just installs it on next npm i.

    pinning your deps "ramda": "0.32.0" completely removes the risk assuming the version you listed is not infected.

    the trade off is you don't get new features/patches without manually changing the version bump.

    • dboreham a minute ago

      For context: ramada 0.32.0 isn't a concrete thing, in the sense that glibc 2.35 is. It really means "the latest ramada code because if you were to pin on this version it'll at some point stop working". glibc 2.35 never stops working.

    • christophilus 2 hours ago

      > the trade off

      I see that as a desirable feature. I don’t want new functionality suddenly popping into my codebase without one of my team intending it.

  • lexicality 29 minutes ago

    Good luck with the XSLT going forward what with Google trying to remove it from the internet.