Ein npm-Paket namens mathmain kopiert die beliebte Mathebibliothek mathjs fast Zeile für Zeile und schmuggelt nur eine Zutat hinein: einen verschlüsselten Fernzugriff, der erst bei einer ganz bestimmten Rechenaufgabe zündet. Über drei getarnte Pakete kamen so mehr als drei Millionen Downloads in einer einzigen Woche zusammen, bevor der Schadcode auffiel. Für jedes Team, das fremde Abhängigkeiten installiert, verschiebt der Fall die Grenze des Vertrauens.

drweb.de als bevorzugte Quelle auf Google hinzufügenQualitätsgeprüfte Inhalte direkt in Google News & DiscoverJetzt hinzufügen

Der npm-Schadcode in mathmain zeigt, wie gezielt Angriffe auf die Software-Lieferkette inzwischen vorgehen. Die Sicherheitsfirma SafeDep stieß auf das Paket, weil eine einzige, nie benutzte Funktion im Code hing.[1] Der eigentliche Trick steckt eine Ebene tiefer.

Das Wichtigste in Kürze

  • Drei nahezu identische mathjs-Klone (mathmain, mathsbase, math-universe) sammelten über drei Millionen Downloads in einer Woche.
  • Der Schadcode entschlüsselt sich nur, sobald ein Opfer ein bestimmtes lineares Gleichungssystem löst, und bleibt sonst stumm.
  • Als Steuerzentrale dienen ein Smart Contract in einem Ethereum-Testnetz und ein Slack-Kanal.
  • SafeDep meldete den Fund, JFrog knackte das Passwort, npm entfernte die Pakete.

Wie versteckt sich der Schadcode im Rechenweg?

Ein hölzerner Abakus mit einem Tresor und einem Anhänger davor, die beide mit einem Vorhängeschloss gesichert sind, auf weißem Hintergrund
Loader in mathjs-Paket aktiviert Schadcode bei Aufruf von lusolve mit spezifischer 3×3-Matrix und entschlüsselt versteckte Datei per AES-256-GCM

Der Loader in mathmain bleibt harmlos, solange das Paket wie das Original mathjs genutzt wird. Scharf wird der Schadcode erst, sobald jemand die Funktion lusolve mit einer ganz bestimmten 3×3-Matrix aufruft. Aus dem Zwischenergebnis dieser Zerlegung baut der Code selbst das Passwort, entschlüsselt damit eine versteckte Datei per AES-256-GCM und startet sie über require.[2] Die Kopplung an eine seltene Rechenoperation macht den Angriff gezielt, denn ein gewöhnlicher Test, ein Malware-Scanner oder eine Sandbox löst genau dieses Gleichungssystem nie. Dass npm-Pakete Code dynamisch über require nachladen, erschwert die Erkennung zusätzlich.

Warum sitzt die Steuerzentrale in der Blockchain?

Nach dem Start holt sich der Schädling seine Befehle aus zwei Quellen. Eine liegt als Smart Contract in einem öffentlichen Ethereum-Testnetz, die zweite ist ein Slack-Kanal, den der Code alle zehn Sekunden abfragt. Beide Wege sind schwer zu sperren, denn ein Testnetz-Vertrag lässt sich nicht wie eine klassische Angreifer-Domain abschalten, und Slack-Verkehr fällt in vielen Firmennetzen nicht weiter auf. Über diesen Kanal lädt der Schädling weiteren Code in Stücken nach und legt ihn zwischen den echten Bibliotheksdateien ab.

mathmain: Angriff, der auf eine Rechenaufgabe wartet

Wie ein getarntes npm-Paket seinen Schadcode versteckt

3 Mio.+
Downloads in einer Woche über drei Pakete
3
getarnte mathjs-Klone (mathmain, mathsbase, math-universe) in fünf Versionen
1
geheime 3×3-Matrix als Auslöser über die Funktion lusolve
2
Befehlskanäle: Smart Contract im Ethereum-Testnetz und Slack

So lief der Angriff

  • 26.08.2026: die erste Version von mathmain erscheint im npm-Register.
  • 17.09.2026: SafeDep stutzt über eine nie benutzte Funktion im Code.
  • 21.09.2026: JFrog knackt das Passwort, npm entfernt die Pakete.

Ein Paket, das nur bei einer einzigen Rechenaufgabe zuschlägt, entlarvt den blinden Fleck vieler Scanner, die nur die Aktion eines Pakets prüfen, nicht die Bedingung, auf die der Schadcode wartet. Drei Millionen Downloads in einer Woche zeigen, wie schnell ein überzeugender Klon durch die Kontrolle rutscht.

— Markus Seyfferth, Chefredakteur Dr. Web

Was bedeutet der Fall für Ihre Lieferkette?

Der Angriff reiht sich in eine Serie ein, die npm seit Monaten trifft, vom Keyv-Wurm über manipulierte Red-Hat-Pakete bis zu vergifteten TanStack-Versionen. Auch ein schädliches Rust-Paket zündete zuletzt zu einem ungewöhnlichen Moment, nämlich schon beim Kompilieren. Für Entscheider verschiebt das den Fokus weg von der Frage, ob eine Abhängigkeit bekannt ist, hin zu der Frage, was sie im Ernstfall auslösen kann.

  • Versionen über eine Lockfile festpinnen und neue Abhängigkeiten vor dem ersten Einsatz prüfen.
  • Automatische Updates bewusst verzögern, wie GitHubs neue Wartezeit von drei Tagen zeigt.
  • Ausgehenden Datenverkehr aus dem Build als Verdachtsfall behandeln, nicht als Rauschen.

Die Grundlagen sauberer Lieferketten stehen in unseren Cybersecurity-Grundlagen für KMU. Unter dem EU Cyber Resilience Act rückt die Verantwortung für solche Abhängigkeiten näher an die Hersteller. Ein sauberes Abhängigkeitsverzeichnis ist damit keine Kür mehr, sondern Pflicht.

Quellen

[1] SafeDep: „Why Does an npm Math Library Need an Encrypted Loader?“

[2] JFrog Security Research: „Equation of Compromise: Anatomy of a Live npm Supply-Chain Campaign“

Mehr Newshunger?

4,3 23 Bewertungen

Wie hat Ihnen dieser Artikel gefallen?