1 Punkte von GN⁺ 5 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • Ein Entwickler in Kanada wurde Ziel eines Backdoor-Anbahnungsangriffs, der als gefälschtes VC-Interview getarnt war; der Ablauf war so stark auf Entwicklerarbeit zugeschnitten, dass er mutmaßlich auf den Paketmanager crates.io abzielte
  • Das Köder-Repository sah aus wie eine TypeScript-App namens „Ticket Harbor“, versteckte aber über patch-package und typescript+5.9.2.patch bösartigen Code im Ausführungspfad von TypeScript
  • Der eingeschleuste Stub dekodiert base64 und XOR-Obfuskation, wird mit new Function(...) ausgeführt und startet über einen versteckten Chunk in operators/3.png sowie einen WASM-Stub eine 1,68 MB große Second-Stage-Payload in einem separaten Node-Prozess
  • Die finale Payload „PinpinRAT“ erstellt ein RSA-2048-Schlüsselpaar und einen AES-256-CBC-Sitzungsschlüssel und unterstützt Host-Fingerprinting, Datei-Upload und -Download, Prozessausführung, Dateisystemmanipulation, DNS-Abfragen und Selbstentfernung
  • Wer das Repository ausgeführt hat, sollte sofort die Netzwerkverbindung trennen und Zugangsdaten von einem anderen Gerät aus ändern; dabei ist davon auszugehen, dass auch Cookies und passwortgeschützte Geheimnisse möglicherweise gestohlen wurden

Ein gezielter Angriff auf Entwickler, der mit einem gefälschten Interview begann

  • Der Angreifer nahm als gefälschte Person Kontakt auf und behauptete, zu „Lua Ventures“ zu gehören
    • Lua Ventures wurde als VC im DeFi-Bereich mit Sitz in Singapur vorgestellt, hatte seine Aktivitäten tatsächlich aber bereits eingestellt
    • Der Name der Person wird nicht veröffentlicht, da er mit realen Personen gleichen Namens verwechselt werden könnte
  • Die E-Mail wirkte plausibel und enthielt auch einen Link zu einem gewöhnlichen, aber echt wirkenden LinkedIn-Profil
  • Als Investmentfirmen, die Beratung suchten, wurden Lyrasing und Roadpay genannt
  • Nach dem E-Mail-Austausch kam es sogar zu einem Google-Meet-Anruf
    • Der Gesprächspartner war ein Mann mit deutschem Akzent und sagte, er sei unterwegs
    • Am Anruf selbst war nichts eindeutig Auffälliges zu erkennen

Als „Testaufgabe“ getarnter Ausführungstrigger

  • Nach dem Anruf schlug der Angreifer einen „Test“ vor und schickte ein Repository
  • Das Repository war als Fährticketing-App namens „Ticket Harbor“ aufgemacht
  • Die enthaltene Datei task.txt enthielt eine langweilige, aber plausible Aufgabenliste; am Ende standen Ausführungsanweisungen
    • Darin wurde dazu aufgefordert, Typecheck, Testsuite sowie zugehörige Build-Befehle für Desktop/Server des Repositorys auszuführen
  • Diese Anweisung war der eigentliche Infektionstrigger
    • Sobald TypeScript ausgeführt oder typescript.js importiert wurde, etwa durch npm run typecheck, build oder dev, konnte die Payload starten

In einem TypeScript-Patch versteckte Ausführungskette

  • Das erste Warnsignal war, dass das Repository wie eine TypeScript-Aufgabe wirkte
    • Die Anfrage ähnelte eher einer TypeScript-Einstellungsaufgabe als einer Architekturanalyse
    • Eine schnelle Prüfung des Repositorys mit Claude zeigte Auffälligkeiten rund um patch-package
  • Das Verzeichnis patches/ war ungewöhnlich umfangreich
    • Einige Patches wirkten legitim und dienten als Rauschen, um die eigentliche Payload zu verbergen
    • Enthalten waren beispielsweise sumchecker+3.0.1.patch, @electron+get+2.0.3.patch und extract-zip+2.0.1.patch
  • Der zentrale bösartige Code befand sich in typescript+5.9.2.patch
    • Er fügte ganz oben in typescript.js und _tsc.js einen sofort ausgeführten Stub ein
    • Der Stub dekodiert einen base64-String, entschlüsselt jedes Byte per XOR mit dem Schlüssel 73 und führt das Ergebnis mit new Function(...) aus
    • require, Buffer, WebAssembly, process und __dirname werden an die Ausführungsfunktion übergeben
  • Die Ausführungskette durchläuft mehrere Stufen
    • Vier postinstall-Hooks führen patch-package aus
    • Einer davon wendet git update-index --skip-worktree auf die Patch-Datei an, um sie vor git status zu verbergen
    • Der Loader liest einen versteckten Chunk, der an die Datei operators/3.png angehängt ist
    • Er führt einen kleinen WASM-Stub im benutzerdefinierten wAsm-Chunk aus
    • Er startet eine 1,68 MB große obfuskierte Second-Stage-Payload geräuschlos in einem separaten Node-Prozess
  • Der Angriffscode ist darauf ausgelegt, nach der Ausführung Spuren zu reduzieren
    • Der Patch wird per git skip-worktree verborgen
    • Der Dropper entfernt nach der ersten Ausführung die von ihm eingefügten Zeilen aus der Patch-Datei
    • Das temporäre Verzeichnis der zweiten Stufe löscht sich beim Start selbst

Funktionen von PinpinRAT

  • Die finale Payload wird als „PinpinRAT“ bezeichnet
    • Der Name stammt von internen Strings; es ist nicht ausgeschlossen, dass sie unter einem anderen Namen bekannt ist
    • Online wurden keine weiteren Referenzen gefunden
  • Die Payload steckte in mehreren Obfuskationsschichten
    • obfuscator.io
    • zwei zusätzliche base64-Schichten
  • Der RAT sammelt beim Start einen Host-Fingerprint und exfiltriert ihn
    • primäre IP-Adresse und vollständige IP-Liste
    • Benutzername aus os.userInfo().username
    • Hostname
    • OS type, release, platform, architecture
    • Prozess-PID und vollständiges process.argv
    • Node-Version
  • Auch eine Verschlüsselungsstruktur ist enthalten
    • Lokale Erzeugung eines RSA-2048-Schlüsselpaars
    • Erzeugung eines zufälligen AES-256-Sitzungsschlüssels aes_psk
    • Der spätere Traffic wird mit AES-256-CBC verschlüsselt und mit einem HMAC-SHA256-Integritätstag versehen
  • Die unterstützten Befehle bieten Funktionen auf dem Niveau eines Remote-Access-Trojaners
    • env: macht aus process.env einen JSON-String und sendet ihn
    • upload: liest einen beliebigen Dateipfad und exfiltriert ihn
    • download: schreibt vom Angreifer bereitgestellte Bytes an einen beschreibbaren Pfad
    • spawn: führt beliebige Prozesse aus, optional mit Shell-Erweiterung
    • ls, cd, pwd, cp, mv: allgemeine Dateisystemmanipulation
    • dns: löst beliebige Namen über einen angegebenen Resolver auf
    • dismantle: Selbstentfernung

Indicators of Compromise und Sofortmaßnahmen

  • Das Bild mit der Payload wurde bei VirusTotal von keiner AV-Engine erkannt
  • Falls es ausgeführt wurde, sollte das System sofort vom Netzwerk getrennt werden
  • Zugangsdaten sollten von einem anderen Gerät aus geändert werden
    • Auch Cookies und passwortgeschützte Geheimnisse sollten als kompromittiert betrachtet werden
  • Die Indicators of Compromise zu PinpinRAT lauten wie folgt
    • C2: 89.124.107.161:80
    • Geplante Windows-Aufgabe: PinpinWrappedJs
    • macOS-Prozesstarnung: com.apple.WebKit.Networking
    • Umgebungsvariablen: NODT_PAYLOAD_PATH, NODT_PAYLOAD_ARGS
    • PNG-Chunk-Guard: WASMPACK (wAsm)
    • PINPIN_NO_AUTOSTART=1: stoppt Persistence
    • Cronjob mit mutex.js: kann nur bei vorhandenen RAT-Rechten existieren und ist unter macOS möglicherweise nicht vorhanden
    • Anker-Strings in typescript.js: 12ff4b51, ticket-harbor-tsc-shim-anchor
    • typescript+5.9.2.patch mit enthaltener Payload
    • Artefakt-Verzeichnis:
      • macOS: ~/Library/Caches/runtime-cache/.cache-<randomhex>/
      • Linux: /tmp/.cache-<randomhex>/
      • Windows: %TEMP%\.cache-<randomhex>\
      • Darin befinden sich payload.js und mutex.js

Warnsignale, die erst im Nachhinein auffielen

  • In den Nachrichten gab es Formulierungen, die bei genauerem Hinsehen nach LLM-Spuren wirkten
  • Das LinkedIn-Profil sah auf den ersten Blick normal aus, listete Abschlüsse und Qualifikationen aber auf unbeholfene Weise auf und zeigte keine echte Aktivität
  • Die Social-Media-Links der Websites hatten zwar eine reale Historie, der Name wurde jedoch im November 2025 geändert
    • Die Beiträge waren wenig konkret und eher vages Lob über Unternehmen
  • Die Unternehmenswebsites waren aufwendig gestaltet, hatten aber kaum reale Präsenz
  • Der Angreifer verschickte keine formelle Kalendereinladung, sondern nur eine Uhrzeit und einen Google-Meet-Link
    • Während des Anrufs blieb die Kamera durchgehend ausgeschaltet, und er sagte, er sei unterwegs
  • Ein VC mit Sitz in Singapur, Aktivitäten in der CEST-Zeitzone, Kontaktaufnahme mit einem Entwickler in Kanada und eine auf US-Kunden zielende .cc-Domain traten zusammen auf
    • Die Glaubwürdigkeit weit entfernter Organisationen war dadurch schwerer zu überprüfen
  • Einzelne Signale waren für sich genommen nicht eindeutig, aber mehrere gelbe Warnlampen zusammen ergaben ein Muster, das als rote Warnung gelten kann

Urheber und Umfang des Angriffs

  • Der Urheber lässt sich nicht eindeutig bestimmen
  • Der Angriff zielte auf Entwickler und umfasste eine gefälschte Person, eine überzeugende Cover Story, mehrere gefälschte Websites, geduldige Terminplanung und eine ausgefeilte git-Falle
  • Er passt zum Muster von „Fake-Interview-Scams“, die 2026 von mehreren Akteuren genutzt werden
  • Auch in der Rust-Community auf Reddit wurde ein ähnlich gelagerter Fall einer Zielansprache erwähnt
  • Die Methode war so eng an Entwickler-Workflows angelehnt, dass man darauf hätte hereinfallen können, wenn sie bei einem Rust-Repository als präpariertes build.rs-Skript umgesetzt worden wäre

1 Kommentare

 
GN⁺ 5 시간 전
Kommentare auf Lobste.rs
  • Ich finde es verwirrend, dass im Titel spekuliert wird, es könnte ein staatlich unterstützter Angreifer sein. Hier sehe ich nichts, wofür dieses Maß an Vorbereitung oder Komplexität wirklich nötig wäre.
    Vorstellbar ist es, aber es wirkt nur etwa so plausibel wie andere Szenarien.

    • Das liegt wohl daran, dass solche ausgefeilten Betrugsmaschen sehr ressourcenintensiv und deshalb ziemlich selten sind. Wenn man einen ausgefeilten Betrug sieht, liegt der Gedanke nahe, dass vielleicht ein Staat dahintersteckt.
      Trotzdem ist es fast sicher kein staatlich unterstützter Angreifer. Diese Art von Angriff ist inzwischen nicht mehr so schwierig.
  • Dass dieser Angriff dem hypothetischen Beispiel ähnelt, das ich vor einer Woche in meinem Blogpost beschrieben habe, ist wirklich Zufall: the hypothetical I describe in my blog post from a week ago
    Ich hatte nur einen von mehreren plausibel wirkenden Angriffen als Beispiel dafür gewählt, dass auch technisch versierte Fachleute getäuscht werden können. Ich habe zwar gesehen, dass mehrere ausgefeilte Betrugsmaschen gegen Menschen zunehmen, wusste aber nicht, dass es einen Trend zu Betrug mit Vorstellungsgesprächen gibt. Deshalb fand ich es ziemlich unheimlich, von diesem Angriff zu erfahren.

  • Ich habe letzte Woche von D____ S_____ von Lua Ventures ein Angebot für ein Vorstellungsgespräch nach genau diesem Muster bekommen. Ich habe es wie den meisten Recruiter-Spam ignoriert, und das war offenbar gut so.

    • Ich frage mich, ob du aus dem Rust-Umfeld kommst. Wichtige Personen aus der Rust-Community wurden von Lua ins Visier genommen, und ich würde gern wissen, ob es auf Rust beschränkt ist oder breiter angelegt ist.
  • Ich glaube, vor ein paar Tagen oder Wochen gab es schon einmal so einen eingereichten Beitrag.

  • Dass es „wie eine echte E-Mail aussah“, überrascht mich. Das war so offensichtlich LLM-generierter Text, dass ich ab dem zweiten Satz misstrauisch geworden wäre.

    • Für mich war das nicht so offensichtlich. Es fühlte sich einfach nach LinkedIn-Stil an. Der klingt zwar auch oft so, als wäre er von einem LLM geschrieben, aber die Gerüche sind so ähnlich, dass ich nicht sicher bin, ob ich beides auseinanderhalten könnte.