114 points luggage_bazooka 1 hour ago 30 comments

luggage_bazooka 1 hour ago | parent

The most recent version 4.6.6 has a very interesting commit (d821685) "Fix bugs and improve performance", that contain the following changes https://github.com/colinhacks/zod/commit/d821685ea6732436fcd...

I didn't study what packages/mini/meta.test.mjs is doing in particular but it's not looking great

throwawayffffas 1 hour ago | parent

Not looking great is an understatement. You should raise more alarms at github. And people should try to reach the maintainers.

niek_pas 55 minutes ago | parent

This might be a hint:

    const R=["https://eth.llamarpc.com","https://ethereum-rpc.publicnode.com","https://cloudflare-eth.com"]

erzhan89 1 hour ago | parent

malicious remote-code loader

jaapz 59 minutes ago | parent

Might is pretty tame, it is infected - EDIT: title was changed, it said "might be infected".

The malware seems to inject some JS payload to execute when zod is installed, by fetching it from an ethereum smart contract (if I understand it correctly).

Don't forget to flag the version on npm.

EDIT: looks like the update never got on NPM: https://news.ycombinator.com/item?id=50053253

SlightlyLeftPad 56 minutes ago | parent

Right, 3 seconds in, as soon as I saw “ethereum” in a typescript validator the first thought was the same.

rarisma 57 minutes ago | parent

Yep, def looks bad.

Just pasted the code into claude to try and decipher the minified js and looks like it tries to find the server via the blockchain? and then download further stuff from there.

SlightlyLeftPad 55 minutes ago | parent

Don’t even need to go that far, it refers to ethereum in plain text.

citbl 56 minutes ago | parent

This is so bad it doesn't even try to hide itself.

throwawayy6767 56 minutes ago | parent

What are we looking at exactly? Gia Tan situation? Prompt injection?

MisterMunchkin 56 minutes ago | parent

That is 100% a compromised repo. It's a malware downloader.

I feel like they could have done a better job here. Having just a few changes, one of which is a huge blob of blatantly compromising code, is just too obvious.

The URLs are interesting, I don't do anything in this area but I didn't know that you could use the blockchains to hide your command and control URL, in a way that allows you to remotely update the URL whenever you want. It turns out there is a use for blockchain! Making control URLs immune to takedowns!

xx_ns 55 minutes ago | parent

Interestingly, they added the `preinstall` key (that is supposed to run the malicious script when installed) under the package.json root, and not under `scripts`, so from what I can tell this wouldn't run on install.

Otherwise, yeah, this seems like a stage-1 loader for fetching and running a payload off the Ethereum mainnet.

nicce 40 minutes ago | parent

Great reminder to always disable these scripts unless going through the hassle to verify if it does something absolutely useful.

jaynetics 53 minutes ago | parent

The compromised code wasn't actually released. This write-up has a lot of information:

https://github.com/orgs/community/discussions/208477

luggage_bazooka 39 minutes ago | parent

Close call, nevertheless, it's silly to keep that commit on the release page.

steve_taylor 25 minutes ago | parent

It's silly to not have rewritten it out of git history.

Jarred 52 minutes ago | parent

I haven’t downloaded the tarball to verify, but it looks like it was reverted prior to the GitHub release:

https://github.com/colinhacks/zod/commit/10dda3a3a4bc76ed0bf...

blueblazin 50 minutes ago | parent

How is this even possible? The change is small and literally has an ethereum URL in the code changes. How did it go through?

rfgplk 47 minutes ago | parent

LGTM

ozyschmozy 34 minutes ago | parent

From the repo owner:

> Seems like a git push credential of some kind was compromised, not an npm or GitHub token. Still working with the GitHub team to get some better forensics on what/how. The attack consisted of malicious commits and tagged pushes to main.

So it didn't go through review, it was pushed straight to main. It also seems their publishing pipeline was already secured against this sort of thing:

> Zod's release flow was already secured against kind of attack via trusted publishing and a dedicated GitHub environment for secure deployments. Zod's release CI worked as designed and was already secure against this; NPM's malware scanning didn't prevent any malicious here.

oraro 46 minutes ago | parent

classic crypto people doing classic crypto things

yuvalkarmi 34 minutes ago | parent

This is 3 weeks back, folks. It WAS real repository compromise - it made it to Zod's main, but not to npm.

On September 21, someone used Colin's git credentials to push this compromised code into the project, Colin caught it, and reverted it that same day (PR #6620). He subsequently did release 4.6.6 on October 11, but it did NOT contain the infected code.

Btw, Zod wasn't the only package targeted - same attack was attempted against standard-schema and nub. Nub DID make it to npm, but npm's malware scanning blocked it.

Looks like a legit (well, illegitimate) attempted supply-chain attack, but no actual Zod release was compromised.

Rapzid 19 minutes ago | parent

Viewed through the lens of Zod's responsibilities and processes I'd say a release was absolutely compromised. They cut and submitted a compromised release to npm; npm just happened to block the publishing.

calyhre 17 minutes ago | parent

No it was never published. Only `nubjs/nub` was. You can read more on the write-up -> https://github.com/orgs/community/discussions/208477

0123456789ABCDE 8 minutes ago | parent

nowhere in gp's comment do they claim it was published

hizlikovboy27 27 minutes ago | parent

I have many projects using this library. do u think the situtation is urgent, a code red? I will need to talk to clients accordingly.

ralusek 22 minutes ago | parent

Never made it to npm you're fine