Analyse eines mutmaßlichen gescheiterten Angriffs durch einen staatlich unterstützten Akteur
(grack.com)- 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-packageundtypescript+5.9.2.patchbö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 inoperators/3.pngsowie 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
- Beide Unternehmen hatten eine grundlegende Webpräsenz und wirkten eher wie Unternehmen in einer frühen Phase als wie Fälschungen
- Auch ein Snapshot der Roadpay-Website auf archive.org ist vorhanden
- 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.txtenthielt 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.jsimportiert wurde, etwa durchnpm run typecheck,buildoderdev, konnte die Payload starten
- Sobald TypeScript ausgeführt oder
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.patchundextract-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.jsund_tsc.jseinen sofort ausgeführten Stub ein - Der Stub dekodiert einen base64-String, entschlüsselt jedes Byte per XOR mit dem Schlüssel
73und führt das Ergebnis mitnew Function(...)aus require,Buffer,WebAssembly,processund__dirnamewerden an die Ausführungsfunktion übergeben
- Er fügte ganz oben in
- Die Ausführungskette durchläuft mehrere Stufen
- Vier
postinstall-Hooks führenpatch-packageaus - Einer davon wendet
git update-index --skip-worktreeauf die Patch-Datei an, um sie vorgit statuszu verbergen - Der Loader liest einen versteckten Chunk, der an die Datei
operators/3.pngangehä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
- Vier
- Der Angriffscode ist darauf ausgelegt, nach der Ausführung Spuren zu reduzieren
- Der Patch wird per
git skip-worktreeverborgen - 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
- Der Patch wird per
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 ausprocess.enveinen JSON-String und sendet ihnupload: liest einen beliebigen Dateipfad und exfiltriert ihndownload: schreibt vom Angreifer bereitgestellte Bytes an einen beschreibbaren Pfadspawn: führt beliebige Prozesse aus, optional mit Shell-Erweiterungls,cd,pwd,cp,mv: allgemeine Dateisystemmanipulationdns: löst beliebige Namen über einen angegebenen Resolver aufdismantle: 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.patchmit enthaltener Payload- Artefakt-Verzeichnis:
- macOS:
~/Library/Caches/runtime-cache/.cache-<randomhex>/ - Linux:
/tmp/.cache-<randomhex>/ - Windows:
%TEMP%\.cache-<randomhex>\ - Darin befinden sich
payload.jsundmutex.js
- macOS:
- C2:
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
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.
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 glaube, vor ein paar Tagen oder Wochen gab es schon einmal so einen eingereichten Beitrag.
Ich habe das Gefühl, es gab mehrere ähnliche Beiträge.
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.