Bösartige npm-Pakete in den Red Hat Cloud Services entdeckt
(github.com/RedHatInsights)- Das Issue ist offen; zum Zeitpunkt des Textes gibt es weder zuständige Bearbeiter noch einen Meilenstein oder verknüpfte Branches bzw. PRs
- Es wurde als Sicherheitsproblem erfasst, bei dem in mehreren npm-Releases im Scope
@redhat-cloud-services/bösartige Versionen entdeckt wurden - Als Referenz werden der Analysebeitrag von StepSecurity und die Suchergebnisse im OSS Security Feed genannt
- Die aktualisierte Liste der betroffenen Pakete umfasst 32 Pakete, darunter
@redhat-cloud-services/chrome,frontend-components,rbac-client,typesundvulnerabilities-client - Die in der Tabelle aufgeführten kompromittierten Versionen sind meist drei pro Paket; bei
@redhat-cloud-services/vulnerabilities-clientsind nur die beiden Versionen2.1.9und2.1.11enthalten - Auf Basis der gesamten Tabelle lassen sich 95 kompromittierte Versionen zählen; auch der separat erwähnte Titel eines externen PR verweist auf
95 versions - Enthalten sind unter anderem Pakete der Reihe
@redhat-cloud-services/frontend-components-*sowie mehrere*-client-Pakete, sodass es sich nicht um ein einzelnes Paket, sondern um ein Release-Problem im gesamten Scope handelt - In den Kommentaren wurde auf die Frage „What are these?“ mit „all that module is pwned“ geantwortet, was das gemeinsame Verständnis widerspiegelt, dass die gesamte Liste kompromittiert wurde
- DanielRuf schrieb, dass er diesen Vorfall zu supply-chain-incidents hinzugefügt hat
- In der GitHub-Aktivität sind zusammenfassende Inhalte mit Verweis auf dieses Issue sowie ein PR zur Erkennung zu sehen, doch im Text selbst werden von Red Hat bislang weder Diagnose noch Gegenmaßnahmen, Entfernung oder korrigierte Versionen genannt
1 Kommentare
Hacker-News-Kommentare
Hoffentlich ist es in Ordnung, den Thread noch einmal für das Thema Cooldown zu nutzen. Bei axios, tanstack, @redhat-cloud-services und mehreren jüngsten npm-Supply-Chain-Angriffen hätte ein Cooldown das verhindern können
Wer Artifactory/Nexus nutzt, hat das wahrscheinlich schon, und falls nicht, ist es leicht einzurichten. Die meisten Kompromittierungen von npm oder PyPI wurden innerhalb weniger Stunden wieder entfernt, daher reicht es aus, Pakete zu ignorieren, die seit weniger als N Tagen veröffentlicht sind. Schon 1 Tag hilft, 3 Tage sind gut, und 7 Tage sind etwas übertrieben, funktionieren aber
Das aktuelle pnpm hat standardmäßig einen Cooldown von 1 Tag: https://pnpm.io/supply-chain-security
Wenn man es mit einem Klick erledigen will, kann man https://depsguard.com verwenden. Das ist eine CLI, die Cooldowns und empfohlene Einstellungen für npm, pnpm, yarn, bun, uv und dependabot hinzufügt; ich bin der Maintainer
Es gibt auch https://cooldowns.dev, das stärker auf Cooldowns fokussiert ist, sowie Skripte, die bei lokalen Einstellungen helfen. Alles ist Open Source/kostenlos
Wenn man
~/.npmrcusw. direkt bearbeiten kann, braucht man das nicht unbedingt, aber falls es in deinem Umfeld Leute gibt, die nur einen One-Click-Fix brauchen, könnte das helfen, dem nächsten Angriff zu entgehenWenn allerdings ein neuer kritischer CVE gepatcht werden muss, muss man den Cooldown umgehen; dafür gibt es je nach Tool entsprechende Wege. Ich habe für die letzten Monate keine exakten Zahlen, aber selbst im Zeitalter der Mythos-artigen Schwachstellenfunde scheint das Risiko durch Software-Supply-Chain-Angriffe wie die Verteilung bösartiger Versionen größer zu sein als durch neue Zero-Day-CVEs
~/.npmrcöffnen und eine Zeile hinzufügen können, scheint die Gruppe, die einen One-Click-Fix braucht, sehr klein zu seinZu sagen „Security-Fixes sollten nur Security-Fixes enthalten und keine anderen Features mitbringen“ ist absolut machbar. Damit würde es sowohl für Security-Researcher als auch für Tools leichter, Audits durchzuführen
Auf normale Releases kann man Cooldowns anwenden, und bei Security-Fixes kann man den Cooldown aufheben oder deutlich verkürzen
Systeme wie bei Debian, wo man sehr stabile Server betreibt und unattended upgrades so konfigurieren kann, dass sie nur für Security-Fixes gelten, sind ein gutes Vorbild. Solche neuen Paket-Releases sind auch für Security-Researcher leichter zu auditieren.
In jedem solchen Thread gibt es viele Kommentare, die so tun, als gäbe es diese Art von Angriff nur bei npm, oder sarkastisch behaupten, es habe keinerlei Gegenmaßnahmen gegeben, aber das halte ich für unfair.
Es gibt auch viele Kommentare, die gute Funktionen erwähnen, die zum Schutz von Paketnutzern eingeführt wurden, etwa
delay lineund pnpm.Weniger besprochen werden die Tools für Paket-Maintainer. MFA für Veröffentlichungen: https://docs.npmjs.com/requiring-2fa-for-package-publishing-..., sowie trusted publishers, die seit etwa einem Jahr verfügbar sind: https://docs.npmjs.com/trusted-publishers
Kürzlich kam auch staged publishing hinzu, das die Vorteile beider Funktionen kombiniert: https://docs.npmjs.com/staged-publishing
Damit kann man nun aus CI ohne statische Zugangsdaten veröffentlichen und verlangen, dass ein Maintainer dies per MFA genehmigt, bevor es tatsächlich im Registry öffentlich wird. Wenn man möchte, kann man mit GitHub Actions Environments protections auf der CI-Seite auch mehrere Genehmigungen oder eine Zeitverzögerung verlangen.
Die Community sollte dazu ermutigt werden, solche Schutzmechanismen für Veröffentlichungen zu übernehmen, sonst wird dieses Problem weiter bestehen.
Dann hätte auch ein bösartiges Paket den grünen Stern erhalten und den Nutzern versichert, es sei „mit Herkunftsnachweis gebaut und signiert“ worden.
[1] https://lwn.net/Articles/1075742/
Es ist großartig, dass an Gegenmaßnahmen gearbeitet wird, aber es passiert trotzdem weiter. Komisch im Sinne von „Schon wieder geht es los“.
Von außen betrachtet hat Webentwicklung etwas von der hektischen Energie eines Wilden Westens: Mutabilität, dynamische Typisierung, sich ständig ändernde Standards und Frameworks, Continuous Deployment, CDN, Echtzeit-A/B-Kampagnen, viele Abhängigkeiten und sensible Nutzerdaten, die über mehrere Infrastrukturen verteilt sind.
Ich sage nicht, dass diese Sichtweise korrekt ist oder dass eine Haltung nach dem Motto „Siehst du“ gerechtfertigt wäre, aber ich verstehe, woher sie kommt.
Vor allem hätte keines von beiden den xz-utils-Backdoor daran gehindert, in eine Paketveröffentlichung zu gelangen. xz-utils bleibt der Maßstab für einen ausgefeilten Upstream-Kompromiss.
Der Fehler hier ist nicht, dass wir Upstream, dem wir bereits vertrauen, besser authentifizieren müssten, sondern dass man Upstream nicht als einzige Quelle von Sicherheit vertrauen kann. Upstream ist eine Gruppe von Hackern, die sich wenig für solide Release-Engineering-Praktiken interessieren und darin auch nicht besonders gut sind.
Aber es gibt Leute, die darin gut sind. Die Lösung in der Linux-Welt und die Art, wie wir vor xz-utils gerettet wurden, besteht darin, dass es eine zweite menschliche Ebene gibt, die von Hackern geschaffenen Upstream-Code für Nutzer prüft, auditiert, paketiert und anpasst.
Diese Menschen haben andere Augen, andere Anforderungen von Verbrauchern und andere Qualitätsmaßstäbe und entdecken Bugs und Böswilligkeit, die Upstream noch nicht zu fassen bereit ist.
NPM, cargo, PyPI usw. glauben weiterhin, dass sie diesen Bedarf an menschlicher Arbeit umgehen können, aber das können sie nicht. Im NPM-Ökosystem sieht man so etwas besonders häufig, weil es dort viele Webentwickler gibt, die an sehr schnelle Releases, lockere Kompatibilitätsanforderungen und extreme Wiederverwendung gewöhnt sind, wodurch solche Vorfälle bei Node-Paketen häufiger auftreten als bei Python oder Rust.
Wir nutzen in unserem Unternehmen yarn 4; dort gibt es eine Option, die die Installation von npm-Paketen in den ersten Tagen nach dem Release blockiert. Die meisten dieser Angriffe scheinen in diesem Zeitraum (1–3 Tage) entdeckt zu werden.
https://gist.github.com/mcollina/b294a6c39ee700d24073c0e5a4e...
event-stream-Paket wurde kompromittiert und 60 Tage lang nicht entdeckt: https://medium.com/intrinsic-blog/compromised-npm-package-ev...Das
axios-Paket wurde kompromittiert, und auch die Zugangsdaten des Autors wurden gestohlen, sodass jeder Versuch einer Korrektur erneut zunichtegemacht wurde: https://www.trendmicro.com/en_us/research/26/c/axios-npm-pac...Das
xz-Utility enthielt zwei Monate lang eine Backdoor: https://gigazine.net/gsc_news/en/20240403-timeline-of-xz-ope...Ein studentischer Forscher übernahm die Maintainer-Rechte für die Python- und PHP-Module
ctxundPHPass, verteilte bösartige Änderungen, und bis zur Erkennung und Behebung dauerte es mehr als 7 Tage: https://infosecwriteups.com/how-i-hacked-ctx-and-phpass-modu...Kaspersky entdeckte mehrere PyPI-Pakete, die über mehr als ein Jahr hinweg missbraucht wurden: https://www.kaspersky.com/about/press-releases/kaspersky-unc...
Das Paket „LoftyLife“ wurde über mehrere Monate hinweg missbraucht: https://securelist.com/lofylife-malicious-npm-packages/10701...
Wenn das Angriffsfenster auf 7 Tage verschoben wird, werden all diese neuen Angriffe einfach eine Zeitbombe einbauen, die erst am 8. Tag ausgelöst wird.
pnpmhat dieselbe Funktion, und abv11ist sie standardmäßig aktiviert: https://pnpm.io/settings#minimumreleaseageIch habe ein paar Vorschläge. Ein Dependency-Cooldown von 1–2 Tagen scheint sehr wirksam zu sein, ohne die Fähigkeit zur CVE-Behebung zu beeinträchtigen.
Überall dort, wo Code ausgeführt wird, etwa bei
npm installodernpm test, sollte in einer nicht privilegierten Umgebung gearbeitet werden. In GitHub Actions ist es relativ einfach, Jobs zum Bauen und Testen von Artefakten von Jobs für Deployment, Signierung usw. zu trennen. Wenn man AI nutzt, kann man einfach ein Skill-/Guide-Dokument hinzufügen, das dieses Muster erzwingt.Wenn man GitHub Actions verwendet, verbessert die Installation des neuesten zizmor die Sicherheitslage erheblich.
Die zweite Maßnahme sorgt dafür, dass sich so etwas nicht mehr „wie ein Wurm verbreiten“ kann, und reduziert einen großen Teil des aktuellen Problems. Die erste verschafft Unternehmen Zeit, auf Angriffe zu reagieren. Einige Anbieter in diesem Bereich sind ebenfalls einen Blick wert.
Direkt nachdem gesagt wurde, neue Pakete sollten verzögert werden, war das als Witz ziemlich lustig.
Ich betreibe lokal einen Maven-Proxy, und alle Builds laufen in Containern. Python, npm und Go verwenden nur öffentliche Repositories, daher laufen auch diese Builds in Containern, aber ohne Repository-Proxy.
Das ist am selben Tag wie die Ankündigung von Project Lightwell durch Red Hat und IBM, das bei der Erkennung und Behebung von Schwachstellen in der Supply Chain helfen soll.
https://www.redhat.com/en/lightwell
Vor ein paar Tagen habe ich diesen interessanten Rant gesehen: https://github.com/uNetworking/uWebSockets.js/blob/master/mi...
Das Argument, der richtige Weg sei, alle verwendeten Abhängigkeiten zu forken und dann bei Bedarf Upstream-Änderungen zu prüfen und zu mergen, während man aus dem eigenen Repository installiert, hat schon etwas für sich. Allerdings klingt das extrem lästig.
Das ist gut geeignet, um die Abhängigkeit von Hosting-Anbietern für Drittanbieter-Dependencies zu verringern oder ganz zu vermeiden, Abhängigkeiten in die eigenen Code-Review-Tools zu holen und langfristig reproduzierbare Builds sicherzustellen.
Packj(https://github.com/ossillate-inc/packj) erkennt bösartige Abhängigkeiten in PyPI/NPM/Ruby/PHP usw. per Verhaltensanalyse. Mit statischer und dynamischer Codeanalyse scannt es nach Kompromittierungsindikatoren wie Shell-Ausführung, Nutzung von SSH-Schlüsseln, Netzwerkkommunikation oder dem Einsatz von decode+eval. Außerdem prüft es verschiedene Metadaten-Eigenschaften, um bösartige Akteure wie etwa Typosquatting zu finden.
Ich habe vor ungefähr einer Woche Node von meinem Laptop gelöscht, und das hat sich gut angefühlt.
Selbst wenn ich Pech habe und ein Exploit trifft, versuche ich alles in Entwicklungscontainern oder anderen Sandboxes zu erledigen, um den Schadensradius zu begrenzen. Ein Angreifer könnte zwar mein Claude-Token stehlen, aber nicht so leicht aus dem Container ausbrechen und mein Home-Verzeichnis durchwühlen.
Cooldowns und Allowlists für Installationsskripte sind besonders in CI eine gute zusätzliche Schicht der Absicherung. Aber grundsätzlich muss sich aus meiner Sicht das Berechtigungsmodell des Betriebssystems ändern. Der Standard, Drittsoftware pauschal mit allen Benutzerrechten zu vertrauen, funktioniert nicht mehr.
Ich glaube, man sollte den Link zur ursprünglichen Veröffentlichung angeben.
https://www.stepsecurity.io/blog/multiple-redhat-cloud-servi...
Ich habe mir inzwischen angewöhnt, beim Installieren von Paketen das Flag
--before=2026-05-30zu verwenden. Damit wird eine Version gewählt, die vor dem angegebenen Datum veröffentlicht wurde, und normalerweise nehme ich ungefähr fünf Tage Abstand.https://docs.npmjs.com/cli/v11/using-npm/config#min-release-...
pnpmund setze ein großzügigesminimumReleaseAge.https://pnpm.io/settings#minimumreleaseage
Zum Glück ist das seit v11 standardmäßig aktiviert.
min-release-age=5zur.npmrchinzuzufügen.NPM ist schon vom Design her kaputt, und wegen des in der Community verbreiteten NIH-Syndroms lassen sich nicht einmal einfache Maßnahmen durchsetzen.
Weil so viele externe Pakete übernommen werden statt selbst etwas zu entwickeln, haben npm-Projekte oft große und komplexe Dependency-Trees. Über Pakete wie https://www.npmjs.com/package/is-windows wird schon lange geklagt, weil man denselben Code viel zu leicht selbst schreiben könnte, sie aber potenzielle Schwachstellen und Wartungsprobleme mit sich bringen.
Aber natürlich muss man nicht die komplette Funktionalität neu implementieren, sondern nur das, was man tatsächlich braucht.
Außerdem muss man, wenn man nur eine einzelne Funktion schreibt, keine Abstraktionen oder zusätzliche Funktionsschnittstellen bauen. Dadurch ist es billiger und wahrscheinlich auch besser integriert.
Ein weiterer Irrtum ist die Annahme, dass man dadurch Bugs und Schwachstellen erzeugt. Bei schlechten Programmierern mag das stimmen, aber dafür vermeidet man die ganze Klasse von Schwachstellen an den Integrationsgrenzen zweier Bibliotheken, die nie dafür entworfen wurden, exakt zusammenzupassen. Das kommt oft vor.