Mein Hetzner-Server wurde gehackt und begann, Monero zu schürfen
(blog.jakesaunders.dev)- Auf einem privat betriebenen Hetzner-Server wurde eine ungewöhnliche CPU-Auslastung festgestellt; die Untersuchung ergab, dass ein Kryptowährungs-Miner für Monero (
xmrig) lief - Ursache war ein Angriff auf den Umami-Analytics-Container, der die Remote-Code-Execution-Schwachstelle in Next.js (CVE-2025-66478) enthielt
- Glücklicherweise lief der Container als Non-Root-Benutzer und ohne Host-Mounts oder Privilegienerweiterung, sodass der Einbruch auf den Container beschränkt blieb
- Die Angreifer nutzten unsichere Deserialisierung in Next.js Server Components, um eine schädliche Payload auszuführen und den Miner zu installieren
- Der Vorfall zeigt die Bedeutung von Dependency-Management und sicheren Container-Einstellungen; der Autor verschärfte daraufhin seine Sicherheitsmaßnahmen mit aktivierter Firewall, gehärtetem SSH und regelmäßigen Updates
Der Hack und die erste Reaktion
- Von Hetzner kam eine Warn-E-Mail, dass der Server externe Netzwerke gescannt habe
- Einschließlich des Hinweises, dass der Server ohne Gegenmaßnahmen innerhalb von 4 Stunden gesperrt werden könnte
- Nach dem Login per SSH zeigte sich ein Prozess mit 819 % CPU-Auslastung unter
/tmp/.XIN-unix/javaesowie mehrerexmrig-Prozesse - Es stellte sich heraus, dass etwa 10 Tage lang Kryptowährungs-Mining betrieben worden war
Untersuchung des Angriffswegs
- Alle schädlichen Prozesse liefen unter dem Benutzer mit UID 1001, was zum Umami-Container passte
- Im Verzeichnis
/app/node_modules/next/dist/server/lib/xmrig-6.24.0/wurde die Miner-Binärdatei gefunden - Der Ausführungsbefehl enthielt die Adresse des Mining-Pools
auto.c3pool.org:443sowie einen Benutzerschlüssel
Next.js-Schwachstelle und Angriffsmethode
- Ursache war die Deserialisierungs-Schwachstelle in React Server Components von Next.js (CVE-2025-66478)
- Wenn Angreifer eine manipulierte HTTP-Anfrage senden, kann auf dem Server beliebiger Code ausgeführt werden
- Dadurch wurde die Installation und Ausführung eines Kryptomining-Programms möglich
- Der Autor war davon ausgegangen, „Next.js nicht direkt zu verwenden“, erkannte jedoch erst später, dass Umami auf Next.js basiert
Bestätigung der Container-Isolation
- Es wurde bestätigt, dass
/tmp/.XIN-unix/javaenicht im Host-Dateisystem existierte- Dass der Prozess in der Ausgabe von Docker-
pserschien, war lediglich ein Anzeigeeffekt; tatsächlich blieb die Isolation erhalten
- Dass der Prozess in der Ausgabe von Docker-
- Ergebnis von
docker inspect:- Benutzer:
nextjs Privileged: falseMounts: keine
- Benutzer:
- Deshalb konnte die Schadsoftware nicht auf den Host zugreifen, keine Cronjobs eintragen, keine Systemdienste anlegen und kein Rootkit installieren
Wiederherstellung und Härtung der Sicherheit
- Nach dem Stoppen und Löschen des infizierten Umami-Containers normalisierte sich die CPU-Auslastung
- Durch das Aktivieren der UFW-Firewall wurden nur noch SSH, HTTP und HTTPS erlaubt
- Nach dem Bericht der Untersuchungsergebnisse an Hetzner wurde das Ticket innerhalb einer Stunde geschlossen
Lehren und Verbesserungen
- „Ich nutze X nicht“ gilt nicht automatisch für Abhängigkeiten
- Man muss prüfen, aus welchem Technologie-Stack die verwendeten Tools bestehen
- Die Wirksamkeit von Container-Isolation wurde bestätigt
- Non-Root-Benutzer, nicht privilegierter Modus und der Verzicht auf unnötige Volumes verhinderten eine Ausweitung des Schadens
- Notwendig ist eine mehrschichtige Sicherheitsstrategie (Defense in Depth)
- Firewall, fail2ban, Monitoring und regelmäßige Updates sind essenziell
- Hervorgehoben wurde die Bedeutung eines selbst geschriebenen Dockerfiles und minimaler Container-Berechtigungen
Maßnahmen nach dem Vorfall
- Umami wurde auf die neueste Version aktualisiert und alle Third-Party-Container auditiert
- Geprüft wurden Laufzeitbenutzer, Mounts, Update-Zeitpunkt und Notwendigkeit
- Umstellung auf SSH-Schlüssel-basierte Authentifizierung, Deaktivierung des Passwort-Logins und Einrichtung von fail2ban
- Ausbau des Monitorings mit Grafana und Node Exporter sowie sofortige Anwendung von Sicherheitsupdates
Fazit
- Durch die Next.js-Schwachstelle in Umami wurde der Server 10 Tage lang zum Monero-Mining missbraucht,
doch dank Container-Isolation und Non-Root-Konfiguration blieb der Schaden begrenzt - Durch diese Erfahrung erkannte der Autor die Wichtigkeit von Dependency-Transparenz, Sicherheitskonfiguration und Update-Management
- Der Vorfall war in etwa zwei Stunden behoben und bleibt ein Praxisbeispiel für die tatsächliche Wirksamkeit von Container-Sicherheit
1 Kommentare
Hacker-News-Kommentare
Früher habe ich UFW aktiviert, aber heute empfehle ich firewalld.
UFW wird mit der Zeit schwer zu verwalten, während firewalld mit XML-basierten Einstellungen deutlich robuster ist.
Mit dem Befehl
firewall-cmdlassen sich SSH, HTTPS, Port 80 usw. konfigurieren, und es ist besser, das nftables-Backend zu verwenden.Bei Docker werden Ports oft unter Umgehung der Firewall-Regeln geöffnet, daher ist es sicherer, in
/etc/firewalld/firewalld.confStrictForwardPorts=yeszu setzen.8080:8080zu öffnen, ist es besser, sie wie192.168.0.1:8080:8080an eine private IP zu binden.Ich betreibe Docker auf einer VM mit 10.0.10.11, die nur über WireGuard erreichbar ist, und nutze davor bequem Caddy als Reverse Proxy.
Schadsoftware versucht, sich mit externen Mining-Pools oder C2-Servern zu verbinden, daher muss der Netzwerkzugriff nicht erlaubter Binärdateien blockiert werden.
Hilfreich ist auch, die Ausführungsrechte für
/tmp,/var/tmpund/dev/shmzu entfernen.nftables.confallein einfach und klar genug ist.iptables ist bereits abgekündigt, daher braucht man nicht zwingend eine zusätzliche Schicht wie firewalld.
Das scheint ein Problem im Zusammenhang mit React2Shell CVE-2025-55182 zu sein.
Es ist seltsam, dass eine Schwachstelle, die seit über einem Jahr Auswirkungen hat, kaum Aufmerksamkeit bekommt.
Wenn du in den letzten 12 Monaten eine Web-App mit Next.js ausgerollt hast, ist sie mit hoher Wahrscheinlichkeit bereits Teil eines Botnetzes.
Es ist frustrierend, dass die Branche nur Ratschläge auf dem Niveau von „Nutze Docker“ oder „Aktiviere eine Firewall“ gibt.
In letzter Zeit bin ich vom Frontend-Ökosystem so ernüchtert, dass ich überlege, meine Karriere eher in Richtung C++ zu verlagern.
Heute ist die Kombination aus Next.js, React, Tailwind und Postgres seit fünf Jahren fast schon als Standard zementiert.
Verglichen mit der Zeit der Framework-Schwemme Ende der 2000er bis Anfang der 2010er ist das ziemlich stabil.
Wenn dir Trends und Veränderungen nicht gefallen, dann verändert sich AI-Entwicklung deutlich schneller.
Im Backend kann man solide Tech-Stacks wie .NET, Java oder Go einsetzen und das Frontend frei wählen.
So gibt es weniger CVEs und weniger technische Ermüdung.
Zugehörige GitHub-Diskussion
Wenn man die CPU-Nutzung eines Docker-Containers mit
--cpus="0.5"begrenzt, können fehlfunktionierende Dienste oder Miner nicht das gesamte System beeinträchtigen.Einen Server ohne Firewall zu betreiben, ist eine ziemlich mutige Entscheidung.
Nutzt man zusätzlich Hetzners externe Firewall, hat man bei Fehlern noch eine weitere Schutzschicht.
Ich erlaube SSH nur von meiner Heim-IP aus und öffne es bei Bedarf von außen vorübergehend über die Hetzner-Website.
Wirklich wichtig ist, keine Software mit RCE-Schwachstellen zu betreiben.
Dass Docker wie ein Retter wirkt, ist in Wahrheit oft einfach nur Glück.
Stattdessen kann man einen Bastion Host einsetzen und Ein- und Ausgaben über einen HTTP-Proxy steuern, aber die Einrichtung ist komplex.
Schon die Nutzung nicht standardisierter Ports war überraschend effektiv.
Ob das wirklich wirksam ist, weiß ich nicht, aber es fühlt sich wie eine psychologische Art Regenschirm an.
Ich habe mich gefragt, ob ein Docker-Container, der als root läuft, auch den Host angreifen kann.
Für nicht vertrauenswürdigen Code sollte man VMs (KVM/QEMU) oder Technologien wie gVisor(https://gvisor.dev/) und Firecracker(https://firecracker-microvm.github.io/) verwenden.
Docker sollte man eher als isolierte Laufzeitumgebung verstehen, nicht als Sandbox.
Die Standardkonfiguration von Docker begrenzt RAM-, CPU- und Festplattennutzung nicht und ist daher auch anfällig für DoS-Angriffe.
Außerdem empfehlen viele Anleitungen riskante Optionen wie
--privilegedoderCAP_SYS_PTRACE.Man kann auch einen neuen Container starten und sich Root-Rechte verschaffen.
Bei Docker ist das noch nicht der Standard, daher ist das Ausbruchsrisiko hoch, wenn man es nicht konfiguriert.
Die meisten Container-Escapes in der Vergangenheit hätten durch User Namespaces verhindert werden können.
Bei Servern, die keine sensiblen Daten verarbeiten, reicht es oft aus, nur den Container aufzuräumen.
Um die Angriffsfläche zu verringern, sollte man Dienste, die nicht öffentlich sein müssen, nicht nach außen exponieren.
Zum Beispiel kann man Analyse-Tools so konfigurieren, dass sie nur über WireGuard oder einen SSH-SOCKS-Proxy erreichbar sind.
Ich hatte auf einem Hetzner-Server ebenfalls eine Monero-Miner-Infektion.
Zum Glück trat sie nur innerhalb eines LXC-Containers unter Incus auf, und wegen der niedrigen CPU-Priorität habe ich es zunächst nicht bemerkt.
Dem root-Konto wurden SSH-Schlüssel hinzugefügt, und ein Remote-Management-Agent war installiert worden.
Letztlich habe ich den Container verworfen, aber ich habe einige Lehren daraus gezogen.
Der Beitrag enthielt AI-Halluzinationen, die nicht von einem Menschen gegengelesen worden waren.
Wiederholt wurde behauptet, es handle sich um eine Schwachstelle rund um Puppeteer, was aber nicht stimmt.
In letzter Zeit werden an vielen Stellen Monero-Miner über eine React-19-Schwachstelle installiert.
Ich hatte dasselbe Problem.
Sie funktioniert wie eine Art automatisches Bug-Bounty-System und weist einen auf die Schwachstelle hin.
Wenn Netzwerk- oder Prozessmonitoring gut eingerichtet ist, lässt sie sich leicht erkennen.
Das war zugleich ein guter Anlass, mein Backup-System zu verbessern.
Wenn ich solche Fälle sehe, bin ich froh, keinen VPS selbst zu betreiben.
Ich habe das früher gemacht, aber ich bin eben nur ein durchschnittlicher Administrator, und es fiel mir schwer, die Sicherheit aufrechtzuerhalten.
Deshalb überlasse ich es heute lieber Experten und zahle dafür, was mir deutlich mehr Ruhe gibt.