Zurück zum Blog

12. November 2026

Die Schrift, die keine ist: Fake-Angebot von C.H. Robinson startet Malware über LuaJIT

Tobias Wilke

Tobias Wilke

@wilketob

Die Schrift, die keine ist: Fake-Angebot von C.H. Robinson startet Malware über LuaJIT
#malware#spam#kmu-security#malspam#luajit#javascript#dmarc

Im September habe ich hier eine gefälschte Bestellung zerlegt, die über vier Stufen den Passwortdieb Agent Tesla nachgeladen hat. Jetzt liegt die nächste Mail aus derselben Ecke auf dem Tisch. Gleicher Versandserver-Block, gleiche Handschrift im Header. Die Malware-Kette ist aber eine ganz andere. Sie bringt ihren eigenen Programmiersprachen-Interpreter mit und versteckt den Schadcode in einer Datei, die sich als Schriftart ausgibt.

Was steht in der Mail?

Die Mail im Mailclient: Absender mit Adresse bei chrobinson.com, Betreff „QUOTE: ORDER #59990321“, Datum 14.08.2026, Anhang „ORDER #59990321.zip“ mit 1,4 MB. Im Text eine höfliche Nachfrage zu einem angeblich früher geschickten Angebot, darunter eine Signatur von C.H. Robinson Global Forwarding aus Wuhan mit Logo und zweisprachigem Datenschutzhinweis. Empfängeradresse, Name der Absenderin und Telefonnummern sind unkenntlich gemacht.

Betreff QUOTE: ORDER #59990321. Absender ist angeblich eine Mitarbeiterin von C.H. Robinson, einem der großen US-Logistikkonzerne, Büro Wuhan. Der Text ist kurz und klingt nach Alltag im Einkauf:

I just wanted to follow up regarding the quotation shared previously
for the requested materials. [...]
Please find the attached quotation.

Ein Angebot, das man angeblich schon bekommen hat. Das ist der Trick. Wer ein Sammelpostfach betreut, denkt kurz: Habe ich da was übersehen? Dass der Betreff „Quote“ sagt, der Anhang „Order“ heißt und es nie eine Anfrage gab, fällt in dem Moment nicht auf.

Die Signatur ist echt, nur nicht für diese Mail. Logo, Büroadresse in Wuhan, Festnetz, Handy und ein langer Datenschutzhinweis auf Englisch und Chinesisch. Das HTML verrät die Herkunft. Jeder Absatz trägt denselben aufgeblähten Inline-Style aus einem Chrome-Fenster, dazu ein Gmail-Element mit der ID m_6326465775918041183gmail-:4i. Copy & Paste aus einer echten Mail, wie schon bei Welle 1.

Warum ist das dieselbe Bande?

Die Mail kam von 141[.]98[.]10[.]164, einem gemieteten Server beim litauischen Hoster Host Baltic (AS209605), ohne Reverse-DNS. (Täter-IPs sind defangt, damit nichts versehentlich klickbar ist.) Welle 1 kam von 141[.]98[.]10[.]108, gleiches Netz. Auch die Message-ID folgt exakt demselben Muster: 20260814061256.ECDB2D3A3A97DDA2@chrobinson.com. Datum, Uhrzeit, Punkt, 16 Hex-Zeichen, Absenderdomain. Ein echtes Proofpoint- oder Exchange-System baut so keine IDs.

chrobinson.com selbst ist nicht kompromittiert, nur als Absender eingetragen. Die Domain ist sauber konfiguriert: SPF erlaubt nur Proofpoint und endet auf -all, DMARC steht auf p=reject. Die Mail hat keine DKIM-Signatur und fällt bei SPF hart durch:

Received-SPF: fail (mx2e84: domain of chrobinson.com does not designate 141.98.10.164 as permitted sender)

Ein normal konfiguriertes Postfach hätte die Mail abgewiesen. Meins nimmt absichtlich alles an, sonst könnte ich sie nicht analysieren. Die Täter setzen darauf, dass irgendwo jemand DMARC nicht durchsetzt.

Was steckt im Anhang?

ORDER #59990321.zip enthält eine einzige Datei: ORDER #59990321.JS, 3,3 MB JavaScript. Ein Doppelklick startet den Windows Script Host, ohne Rückfrage. Ich habe die Kette statisch zerlegt, also Schicht für Schicht dekodiert und nichts ausgeführt.

Stufe 1, das JavaScript. Der Anfang sieht harmlos aus: eine Tabelle mit x86-Prozessorbefehlen aus der Open-Source-Bibliothek asmjit. Nur sind darin Teile durch den Füllstring YJQSPSLQMCCEYPJN ersetzt. Dahinter folgt verschleierter Code mit umsortierten String-Tabellen und Dutzenden toter Funktionen. Dazu kommen zwei Blobs à 1,3 MB: Base64, rückwärts gespeichert und mit Sonderzeichen wie !$^%*~?&# gespickt. Umgedreht und gesäubert ergeben sie zwei Dateien, die im Ordner Dokumente landen:

  • YJQSPSLQMCCEYPJN.PIF, eine Windows-EXE
  • YJQSPSLQMCCEYPJN.ttf, angeblich eine Schriftart

Stufe 2, der mitgebrachte Interpreter. Die EXE ist LuaJIT 2.1, ein völlig legitimer Interpreter für die Skriptsprache Lua. Unverändert, seit 2020 bekannt, bei VirusTotal schlägt genau ein Scanner von 75 an. Die Endung .PIF stammt aus DOS-Zeiten, Windows startet so eine Datei trotzdem als Programm. Die „Schrift“ ist ein Lua-Skript. Das JS startet LuaJIT in einem unsichtbaren Fenster und übergibt die .ttf als Skript. Antivirus sieht also ein sauberes Programm, das eine Textdatei liest.

Stufe 3, das Lua-Skript. Hier sitzt die eigentliche Arbeit, und die ist nicht von schlechten Eltern. Das Skript lädt über LuaJITs FFI-Schnittstelle direkt Windows-Funktionen. Dann:

  • liest es ntdll.dll frisch von der Platte und überschreibt damit die Version im Speicher. So verschwinden Haken, die Sicherheitssoftware dort gesetzt hat.
  • patcht es EtwEventWrite und verwandte Funktionen auf ein sofortiges return. Damit ist die Ereignisprotokollierung von Windows für diesen Prozess blind.
  • baut es eigene Systemaufruf-Stubs und umgeht damit die normalen API-Wege.
  • prüft es auf Debugger und legt sich bei Treffern 30 bis 60 Sekunden schlafen. Außerdem sucht es nach geladenen DLLs von Defender, CrowdStrike, SentinelOne, Sophos, Cylance und Carbon Black.
  • legt es einen geplanten Task namens YJQSPSLQMCCEYPJN an, der alle 15 Minuten über eine .url- und eine .bat-Datei LuaJIT neu startet.

Zum Schluss dekodiert es einen 370 KB langen String: Zeichentausch per Tabelle, umdrehen, Base64, Verschiebung um 25 Zeichen. Heraus kommen 230 KB Shellcode. Der wird in frisch angeforderten Speicher kopiert und direkt aufgerufen. Auf der Platte liegt nie eine echte Schadsoftware-Datei.

Und was kommt am Ende raus?

Ehrliche Antwort: Das weiß ich nicht. Der Shellcode ist selbst noch einmal verschlüsselt, und statisch bin ich an der Stelle nicht weitergekommen. Die VirusTotal-Sandbox hat das JS zwar ausgeführt, aber keinen Netzwerkverkehr gesehen. Bei den eingebauten Debugger-Prüfungen und Schlafpausen ist das keine Entwarnung. Einige Virenscanner nennen auf dem JS „AgentTesla“ oder „Formbook“, das sind Heuristiken. Welle 1 hat Agent Tesla geliefert, ein Passwortdieb ist also wahrscheinlich, belegt ist er nicht.

Für die Einstufung spielt das kaum eine Rolle. Wer einem Programm erlaubt, die Windows-Protokollierung abzuschalten, Sicherheitssoftware auszuhebeln und sich alle 15 Minuten neu zu starten, hat verloren, egal was danach kommt.

Spannend ist der Vergleich mit Welle 1. Dort lief die Kette über PowerShell und .NET, hier über LuaJIT. Gleicher Versand, zwei völlig verschiedene Loader. Das sieht nach eingekauften Bausteinen aus, nicht nach Eigenentwicklung. Das JS kursiert bei VirusTotal seit dem 11. August unter mindestens neun Namen: Frachtbrief, Pre-Alert, Bestellung, AGB. Die Verpackung wechselt, der Inhalt bleibt.

Woran ihr's erkannt hättet

Das stärkste Signal ist der Anhang selbst: Kein Angebot der Welt kommt als .JS-Datei. Wer im ZIP etwas anderes als PDF, Excel oder Word findet, löscht die Mail. Das gilt genauso für .exe, .scr, .pif, .bat, .vbs, .lnk.

Danach: ein Nachfass zu einem Angebot, das es nie gab. Die Anrede „Dear Sir“ an ein Sammelpostfach. Ein Logistikkonzern, mit dem ihr nie zu tun hattet. Und wer in die Header schaut: SPF fail, keine DKIM-Signatur, ein Server ohne Namen in Litauen.

Was ihr tun könnt

Windows Script Host entschärfen. Per Gruppenrichtlinie oder Intune .js, .jse, .vbs und .wsf mit dem Editor statt mit wscript.exe verknüpfen. Ein Doppelklick öffnet dann Text statt Malware. Das bricht diese Kette an der ersten Stelle und kostet eine halbe Stunde.

Archive mit Skripten am Mailgateway blocken. ZIP, RAR und 7z mit .js, .exe, .pif, .bat oder .lnk darin gehören in Quarantäne. Fast jeder Hoster und jedes Gateway kann das, man muss es nur einschalten.

DMARC durchsetzen lassen. C.H. Robinson hat p=reject gesetzt. Fragt euren Provider, ob er das auch umsetzt. Wie eine Domain aufgestellt ist, seht ihr mit dem Mail-Check hier auf der Seite.

Programme aus Benutzerordnern sperren. AppLocker, WDAC oder Smart App Control verhindern, dass eine EXE aus Dokumente oder Downloads überhaupt startet. Das hätte LuaJIT gestoppt, egal wie harmlos die Datei ist.

Geplante Tasks im Blick behalten. Ein neuer Task mit Fantasienamen und 15-Minuten-Takt ist ein klarer Alarm. Wer den Verdacht hat, dass jemand geklickt hat: schtasks /query /tn YJQSPSLQMCCEYPJN zeigt sofort, ob er da ist. Dann den Rechner vom Netz nehmen und alle Passwörter ändern, die darauf je eingegeben wurden.

Fazit

Die Mail selbst ist Fließbandware. Copy-&-Paste-Signatur, Spoof gegen eine p=reject-Domain, Standardköder. Der Loader dahinter ist es nicht: ein legitimer Interpreter als Tarnkappe, ein Skript als Schrift verkleidet, Protokollierung aus, Persistenz an. Zwischen „Dear Sir“ und dem 15-Minuten-Task liegt genau ein Doppelklick, und den verhindert man am billigsten, indem .js gar nicht erst ausgeführt wird.

Name, Absenderadresse und Telefonnummern der angeblichen Absenderin sind im Artikel und im Screenshot unkenntlich gemacht. Die Signatur stammt vermutlich aus einer echten Mail. Die Person hat mit der Kampagne nichts zu tun, C.H. Robinson ist hier selbst nur Kulisse. Die vollständigen IOCs liegen intern.