Menu
Sign In Search Podcasts Charts People & Topics Add Podcast API Blog Pricing
Podcast Image

The Changelog: Software Development, Open Source

Securing npm is table stakes (Interview)

29 Jan 2026

Transcription

Chapter 1: What is the main topic discussed in this episode?

9.127 - 26.747 Jared

Welcome, friends. I'm Jared, and you are listening to The Changelog, where each week we interview the hackers, the leaders, and the innovators of the software world. As the creator and longtime maintainer of ESLint, Nicholas Zakis is well-positioned to criticize GitHub's recent response to NPM's insecurity.

0

26.727 - 43.217 Jared

He found their response insufficient and has other ideas on how GitHub could secure NPM better. On this episode, Nicholas details his ideas, paints a bleak picture of NPM alternatives like JSR, and shares our frustration that such a critical piece of internet infrastructure feels neglected.

0

43.197 - 57.949 Jared

But first, a big thank you to our partners at Fly.io, the platform for devs who just want to ship, build fast, run any code fearlessly at Fly.io. Okay, Nicholas Zakis, talking NPM on the changelog. Let's do it.

0

65.337 - 91.986 Unknown

This is the year we almost break the database. Let me explain. Where do agents actually store their stuff? They've got vectors, relational data, conversational history, embeddings, and they're hammering the database at speeds that humans just never have done before. And most teams are duct taping together a Postgres instance, a vector database, maybe Elasticsearch for search. It's a mess.

0

91.966 - 114.835 Unknown

Well, our friends at Tagger Data looked at this and said, what if the database just understood agents? That's Agentic Postgres. It's Postgres built specifically for AI agents, and it combines three things that usually require three separate systems, native model context protocol servers, MCP, hybrid search, and zero copy forks.

Chapter 2: How does Nicholas Zakas critique GitHub's response to npm's insecurity?

114.815 - 138.747 Unknown

The MCP integration is the clever bit. Your agents can actually talk directly to the database. They can query data, introspect schemas, execute SQL without you writing fragile glue code. The database essentially becomes a tool your agent can wield safely. Then there's hybrid search. TigerData merges vector similarity search with good old keyword search into a SQL query.

0

139.047 - 149.157 Unknown

No separate vector database, no elastic search cluster, semantic and keyword search in one transaction. One engine. Okay, my favorite feature, the forks.

0

Chapter 3: What alternative ideas does Nicholas propose for securing npm?

149.558 - 175.267 Unknown

Agents can spawn sub-second zero copy database clones for isolated testing. This is not a database they can destroy. It's a fork. It's a copy off of your main production database if you so choose. We're talking a one terabyte database fort in under one second. Your agent can run destructive experiments in a sandbox without touching production, and you only pay for the data that actually changes.

0

175.728 - 197.337 Unknown

That's how Copy on Write works. All your agent data, vectors, relational tables, time series metrics, conversational history lives in one queryable engine. It's the elegant simplification that makes you wonder why we've been doing it the hard way for so long. So if you're building with AI agents and you're tired of managing a zoo of data systems,

0

197.317 - 244.16 Unknown

Check out our friends at TigerData at TigerData.com. They've got a free trial and a CLI with an MCP server you can download to start experimenting right now. Again, TigerData.com. Well, friends, we're here with our new friend and good friend, Nicholas Zekas. Known by many things, created ESLint, author of many books, and a person on the internet with angst.

0

244.5 - 247.284 Unknown

You know, who doesn't have a little angst out there?

0

247.304 - 247.604 Jared

Like all of us.

Chapter 4: What alarming trends have been observed in npm package security?

247.824 - 262.423 Unknown

Yeah, we all get some angst. But this one recently against GitHub's stewardship and securing of NPM, which I know a lot of people have an issue with. So when I saw this post and I read this post, I got to get you on the podcast. So here you are. Welcome to the show.

0

262.943 - 266.889 Nicholas Zakas

Yeah, thanks for having me. I think thanks for having me back. I think I've been here before.

0

267.691 - 284.798 Jared

JS Party, maybe, right, JS Party? You know, we were talking about it yesterday, and I know him online. I feel like I've met him before, but I didn't actually go back in our catalog and look you up. So I would only assume it was either an old, old episode of The Changelog or a not quite as old episode of JS Party, but for sure you've been on the network.

0

284.818 - 285.88 Unknown

Yes, definitely.

0

286.02 - 287.142 Jared

I wasn't on the podcast.

287.222 - 288.124 Unknown

That's why I said that.

288.384 - 294.616 Jared

Oh, okay. Then welcome to the podcast. Yeah, welcome to the both of us and the three of us.

Chapter 5: How does GitHub's recent response impact npm maintainers?

295.217 - 307.024 Unknown

What is the best way to open this can of worms, honestly? I mean, should we go to the end and work our way back? How should we begin this discussion on securing NPM and what GitHub can do about it?

0

307.257 - 333.388 Nicholas Zakas

Yeah, that's a good question. I think it might help to talk a little bit about 2025 and what was going on with NPM then, and then we can jump off from there. So in September alone, there were 500 packages that were compromised on NPM. Never mind the rest of the year, just 500 packages in that one month.

0

334.409 - 359.949 Nicholas Zakas

And those attacks didn't really look any different than any of the attacks that we've seen before, which was basically like somebody steals some credentials one way or another. They start publishing compromised packages and they usually add like a pre-install or a post-install script that executes the malicious code.

0

360.75 - 385.055 Nicholas Zakas

And then they publish that to the registry and they just wait for people to download it. And then as it downloads and that pre-install or post-install script runs, like that's when the trouble starts happening. And we've seen a bunch of different iterations of this. Sometimes it just is like looking to steal crypto. Other times it's looking for secrets.

0

385.196 - 409.126 Nicholas Zakas

I mean, that was one of the big things last year was running Truffle Hog to discover secrets on the user's machine and then using those secrets to propagate itself. And I think that we're pretty lucky so far that the damage caused by these packages has been pretty minimal. I think one person lost like $500 in crypto or something like that.

409.747 - 432.287 Nicholas Zakas

But it was getting to the point where, to me, it's looking a lot like somebody or a bunch of somebodies are trying to figure out how to get packages into NPM that will get distributed as quickly as possible to do something that is a lot more damaging than what we've seen so far.

432.267 - 458.055 Nicholas Zakas

and that was basically what led me to stop and think about what's actually going on with npm what could change and i think more like what could the next attack look like if things don't change and from a maintainer's perspective as well right because you're looking at it from the lens of somebody who's maintaining highly used open source projects over the course of forever right

458.322 - 487.392 Nicholas Zakas

Yeah, so like ESLint, which I help maintain, over 200 million downloads a month. And we have had from time to time these very mysterious pull requests that show up. where all it is is somebody changing a dependency with no description or anything. And when we ask them, hey, what are you trying to do on this? What's the point of this pull request? We get nothing.

487.813 - 517.573 Nicholas Zakas

It doesn't happen a lot, but it's happened frequently enough that it's always felt to me like a penetration test to see how easy it would be to land a pull request on ESLint because it's downloaded so much. And knowing that it's going to go out basically immediately to all kinds of CI systems and personal laptops and what have you, we're always very, very careful about changing dependencies and

Chapter 6: What are the challenges with npm's current security measures?

590.262 - 606.188 Nicholas Zakas

But we're still in the situation where we use so many dependencies, and not to mention dependencies of dependencies, that it's almost impossible to protect our users if some malicious package gets in the dependency tree somehow.

0

607.23 - 625.219 Jared

So GitHub did respond to this, or they have done some changes. I don't know if it was in response or the timing was correct that it seemed like it was in response. We had Firas Aboukadidj on the show last year talking about just the onslaught and some of the details of those hacks, and it was fun to hear about how the hackers are doing their hacking.

0

626.06 - 645.826 Jared

And at the time, I think GitHub had announced some changes, but hadn't actually done them yet or rolled them out. You addressed some of those from a maintainer perspective. It seems like your read on the GitHub changes to the way it works is more maintainer burden and perhaps too tightly scoped. Is that fair to say?

0

645.866 - 658.428 Jared

Or you want to give your impressions of some of the things they're doing to react to this? Because they're in the position as a platform to be the most... influential reactor? Are they the ones that have to basically make some changes, right?

0

659.129 - 689.496 Nicholas Zakas

Yeah. So my read on the changes that they made was that it was pushing more responsibility onto maintainers. So eliminating the kind of older style tokens, I can understand fine-grained tokens are way more secure. That makes sense. But then limiting the lifetime of those tokens, they went through a bunch of iterations. I think they finally landed on like 90 days later.

689.746 - 713.526 Nicholas Zakas

That alone, if you're doing token-based publishing, now you need to remember to update your tokens every 90 days, or you have to implement some sort of automation to do it for you on top of whatever else you're already doing. And the response to that was, well, if you use trusted publishing,

713.506 - 730.992 Nicholas Zakas

the OpenID Connect feature that they have in GitHub Actions, then you don't need to actually store a token anymore. It's generated on the fly and you can just publish using that. And that sounds

730.972 - 754.358 Nicholas Zakas

great like it's a good solution to not just have a token laying around yeah somebody can use kind of a lock-in thing though right it's kind of a lock-in thing well it is i mean number one that's great if you're on github or gitlab also supports it but what if you're not on either of those platforms right Like not every company in the world that's publishing NPM packages is using GitHub.

754.378 - 781.634 Nicholas Zakas

You know, they might have private repositories that might be publishing directly from their internal repositories and not having stuff out on GitHub or GitLab. And then the other problem is that there's no two-factor authentication for trusted publishing. And as a result, the OpenJS Foundation even came out and just said, for critical packages, we recommend that you don't use trusted publishing.

Chapter 7: What insights does Nicholas provide about npm alternatives like JSR?

1320.542 - 1343.25 Nicholas Zakas

And my read on the response last year was, And I have no inside knowledge of this at all. This is just my interpretation of what I was seeing, was that the things that they were rolling out were things that were probably already on their roadmap and just needed a little push.

0

1343.23 - 1359.871 Nicholas Zakas

And this was the push of like, you know, running it up the chain and just saying, hey, these like three things we've been trying to get through for the past nine months, like this would actually really help with these attacks. So can we prioritize and resource these? And that's why we got those.

0

1360.111 - 1372.967 Nicholas Zakas

Again, just my theory, but it just, it seems like, and I gave this feedback directly to them too, that I just feel like all of this is attacking the problem from the wrong end at this point.

0

1373.707 - 1396.677 Unknown

Well, friends, I don't know about you, but something bothers me about GitHub Actions. I love the fact that it's there. I love the fact that it's so ubiquitous. I love the fact that agents that do my coding for me believe that my CI, CD workflow begins with drafting TOML files for GitHub Actions. That's great. It's all great until, yes, until your builds start moving like molasses.

0

1396.657 - 1412.708 Unknown

GitHub Actions is slow. It's just the way it is. That's how it works. I'm sorry, but I'm not sorry because our friends at namespace, they fix that. Yes, we use namespace.so to do all of our builds so much faster.

1412.688 - 1437.801 Unknown

namespace is like github actions but faster i mean like way faster it caches everything smartly it casts your dependencies your docker layers your build artifacts so your ci can run super fast you get shorter feedback loops happy developers because we love our time and you get fewer i'll be back after this coffee and my build finishes so That's not cool. The best part is it's drop-in.

1438.182 - 1462.327 Unknown

It works right alongside your existing GitHub Actions with almost zero config. It's a one line change. So you can speed up your builds, you can delight your team, and you can finally stop pretending that build time is focus time. It's not. Learn more, go to namespace.so. That's namespace.so, just like it sounds, like it said. Go there, check them out.

1462.347 - 1466.421 Unknown

We use them, we love them, and you should too. Namespace.so.

1470.957 - 1495.716 Jared

Well, there's one big difference between the credit card companies and GitHub slash Microsoft. Otherwise, I agree with you entirely with the methodology of like, you know, inference and fraud detection, like analysis, be more proactive than reactive, etc. Is that the credit card companies get paid per transaction, you know, so like there's money directly tied to that process, right?

Chapter 8: What future solutions could improve npm security?

1794.586 - 1830.542 Nicholas Zakas

I mean, I could imagine another type of situation where we had the crypto stealing package. What if that wasn't targeting a crypto website? What if that was targeting a major banking website? or a major stock exchange website. What would happen in that situation? And would those people who lost money through an NPM package that was compromised would they even understand what was going on?

0

1831.904 - 1846.429 Nicholas Zakas

Or would it just be like, oh, by virtue of being on the laptop, I just got screwed. So I feel like that bigger attack is coming if something major doesn't change.

0

1846.915 - 1875.572 Unknown

It's likely, right? I mean, it's likely that a large player in some game with deep implications is using dependencies from NPM. It's like a 99% likelihood that someone's using it somewhere on the front end and it's a tag vector. You may already be exploited, right? Yeah, you may. These little pokes may actually be just a precursor.

0

1875.552 - 1883.643 Unknown

Nicholas, do you have any insight into how staffed NPM is given your presence in the community?

0

1884.484 - 1905.765 Nicholas Zakas

I don't. I've only had direct contact with one person. And I don't feel at liberty to discuss what we've talked about. But I don't have an idea of how big the team is. My only sense is that it's fairly small.

1906.326 - 1926.754 Unknown

I would say demystify the black box of staffing just so the community knows. Is it being staffed? Is it understaffed? I don't know. If we're relying on this registry and ecosystem, at least be clear on what's not clear with that part of it. Tell us.

1926.886 - 1958.307 Nicholas Zakas

Yeah, I mean, I think last year I opened up an issue on NPM and maybe by the end of the year it got a response, like not even a like, oh, this is a good idea, this is a bad idea, just a like... Oh, hey, that's interesting. And that was a good indicator to me that it was probably not resourced appropriately. Especially when PMPM came out after one of the attacks.

1958.347 - 1982.813 Nicholas Zakas

I was like, okay, we're not going to let people install any package that's newer than seven days old or something in the hopes that that would prevent people from rapidly downloading compromised packages before they could be caught and removed. And that PNPM moved faster than NPM, I think was a bit of a wake up call for me. Now they're doing it on the client side. So

1983.839 - 2011.433 Nicholas Zakas

Now, how big of an effect does that have? I would guess like not huge, but they were trying to do something that they seemed like might help and was within their power to do so, which I applaud them for. And like with NPM, it just felt a little like, okay, these were some stuff that we were planning on doing anyway, and we're just going to roll those out. And yeah, we'll see what happens.

Comments

There are no comments yet.

Please log in to write the first comment.