+− THE DAILY DIFFdev & AI news
SHIP IT

Een Dependabot-bump publiceerde een worm. 22 pakketten.

Een bot opent een pull-aanvraag.

Een bot opent een pull-aanvraag. Een mens voegt deze 24 minuten later samen. 95 minuten daarna heeft een worm 110 kwaadaardige versies van zijn 22 npm-pakketten gepubliceerd, onder zijn naam, met een token dat het vond in zijn CI.

Lees de geschreven editie (Engels) ↗

Wat deze video behandelt

  • Een bot, een mens, een worm
  • Hoe het gebeurde, waarom npm het toestond, wie de schuld krijgt
  • Tijdlijn: de vergiftigde cache
  • 21:48 — de Dependabot-bump
  • Waarom het werkt

Vertaald transcript

Vertaald vanuit de originele Engelse gesproken tekst. Beschikbare audio en ondertiteling worden beheerd door YouTube.

Een bot, een mens, een worm

0:00 Een bot opent een pull-aanvraag; een mens voegt deze vierentwintig minuten later samen. Vijfennegentig minuten later heeft een worm gepubliceerd honderd en tien versies van zijn pakketten, als hem. TanStacks postmortem heeft de upstream-tijdstempels, de downstream-onderhouder heeft de rest, en Hacker News geeft het elfhonderd punten en een naam: Mini Shai-Hulud. Hoe het gebeurt, waarom npm het toestaat, wie de schuld krijgt.

Hoe het gebeurde, waarom npm het toestond, wie de schuld krijgt

0:21 Dit is The Daily Diff, postmortem. 11 mei, ochtend. Een hernoemde fork opent een pull-aanvraag tegen TanStack Router. Het sluit binnen het uur, maar een benchmark-workflow heeft de code al uitgevoerd en

Tijdlijn: de vergiftigde cache

0:33 een vergiftigde cache opgeslagen onder de sleutel die de release-workflow zal gebruiken. Negentien-twintig. Een legitieme merge voert de release uit. De cache keert terug, een binair bestand leest het geheugen van de runner, tilt het publicatie-token op en verzendt vierentachtig versies over tweeënveertig pakketten, met geldige herkomst. Tests mislukken. Het publiceert toch. Negentien-zesenveertig, een StepSecurity-onderzoeker dient het probleem in; tegen negen uur UTC alles is verouderd en de waarschuwing is uit.

0:55 Verouderd is niet verdwenen: npm weigert iets met afhankelijke pakketten te verwijderen, dus het blijft urenlang installeerbaar. Eenentwintig-achtenveertig. In een negensterren-luchtvaartdataprojec opent Dependabot zijn routinematige pull-aanvraag: bump de dev-dependencies-groep, dertien updates. Twee zijn vergiftigde TanStack-versies. Tweeëntwintig-twaalf: samengevoegd. De publicatie-workflow voert npm C-I uit met het token in

21:48 — de Dependabot-bump

1:15 scope; een voorbereidingsscript leest het, en om tweeëntwintig-zeventien publiceert de worm als hem. Vijf versies van elk pakket dat het token bereikt, zelfs een oud zijproject: één klassiek token voor alles. Honderd en tien versies in vijfennegentig minuten. Hij komt erachter via e-mail, na middernacht. Waarom het werkt. Eén: npm install voert standaard de levenscyclusscripts van onbekenden uit, en het voorbereidingsscript van een git-afhankelijkheid telt mee.

1:39 Twee: de worm wil één ding: een token dat publiceert zonder tweede factor. Dan vraagt het het register wat die beheerder nog meer bezit, en publiceert alles opnieuw met zichzelf erin. Drie: niets in de keten is een persoon.

Waarom het werkt

1:51 Een bot stelt voor, een pipeline installeert, en de worm beantwoordt de gunst: zijn dead-drop-takken heten dependabot slash github-actions slash fremen. git blame. npm's installatiemodel, vijfenenvijftig procent: scripts worden uitgevoerd bij installatie, verouderde pakketten blijven installeerbaar, tokens voor tweefactor-bypass bestaan. TanStacks CI, vijfentwintig: een ongecontroleerde pull-request-target-workflow die fork-code uitvoert met schrijftoegang tot de cache. De bump-gewoonte, vijftien: dertien updates samengevoegd in vierentwintig minuten, token in de kamer.

2:17 Dependabot, vijf: zo vertrouwd dat de worm zijn uniform draagt.

git blame

2:20 Impactgebied: tweeënveertig TanStack-pakketten. Tweeëntwintig downstream, van een project met negen sterren. Meer dan honderdzestig ecosysteembreed zodra de worm Mistral bereikt. Elke upstream-versie droeg een geldige handtekening: gebouwd door de officiële pipeline. Waar. Oordeel, postmortem: SHIP IT. Beide beheerders plaatsen binnen een dag postmortems met tijdstempel; binnen drie dagen installeert de downstream-pipeline met ignore-scripts, splitst build van publish en laat het langlopende token vallen.

Impactgebied

2:47 De standaardinstellingen van npm zijn niet gewijzigd. Maandag: ignore-scripts bij installatie, en het publicatie-token uit de taak die het uitvoert. Stuur me het incident waar je het nog steeds niet over mag hebben, in de reacties, of op thedailydiff.dev. En dat is de diff voor vandaag.

Oordeel

3:00 Ik ben Niko van Axrisi. Merge verantwoordelijk.

Bronnen

  1. TanStack postmortem (Tanner Linsley, May 11, refined May 15)tanstack.com
  2. TanStack "Hardening TanStack After the npm Compromise" (May 12)tanstack.com
  3. TanStack/router#7383 — the StepSecurity detection issuegithub.com
  4. Downstream incident post, @squawk/* (May 12)github.com
  5. Downstream hardening post (May 14)github.com
  6. The Dependabot PR #246 (opened 21:48 UTC, merged 22:12)github.com
  7. @tan_stack advisory post, 21:19 UTCx.com
  8. StepSecurity — worm internals, bypass_2fa search, Dependabot-style branch nameswww.stepsecurity.io
  9. Socketsocket.dev
  10. Aikido — "over 160 packages, including Mistral"www.aikido.dev
  11. Hacker News (1,097 points)news.ycombinator.com

Gerelateerde video's