Aikido zufolge verwendet die Kampagne exakt denselben ICP-Canister (tdtqy-oyaaa-aaaae-af2dq-cai[.]raw[.]icp0[.]io), der bereits für CanisterWorm dokumentiert wurde – ebenso wie denselben C2-Server, denselben Backdoor-Code und denselben Ablagepfad /tmp/pglog. Diese Übereinstimmungen begründen die Zuordnung zu TeamPCP.

Das Skript unterscheidet je nach erkanntem System zwischen mehreren Verhaltensweisen. Werden iranische Zeitzone und Spracheinstellung erkannt und ist Kubernetes vorhanden, bringt die Malware im Namespace ‘kube-system’ ein DaemonSet namens ‘Host-provisioner-iran’ aus. Es nutzt privilegierte Container und bindet das Wurzeldateisystem des Hosts unter /mnt/host ein. Jeder Pod startet einen Alpine-Container namens ‘kamikaze’, der sämtliche Verzeichnisse der obersten Ebene auf dem Host löscht und anschließend einen Neustart erzwingt.

Ist Kubernetes vorhanden, das System aber nicht als iranisch eingestuft, verteilt die Malware ein DaemonSet namens ‘host-provisioner-std’ – ebenfalls mit privilegierten Containern und eingebundenem Host-Dateisystem. Statt Daten zu löschen, schreibt hier jeder Pod eine Python-Backdoor auf das Host-Dateisystem und richtet sie als systemd-Dienst ein, sodass sie auf jedem Knoten dauerhaft bestehen bleibt.

Auf iranischen Systemen ohne Kubernetes löscht die Malware jede für den aktuellen Benutzer erreichbare Datei einschließlich der Systemdaten, indem sie den Befehl rm -rf / mit der Option –no-preserve-root ausführt. Fehlen Root-Rechte, versucht sie es über passwortloses sudo. Trifft keine der Bedingungen zu, bleibt das Schadprogramm untätig und beendet sich.

Eine neuere Version der Malware, die dieselbe ICP-Canister-Backdoor nutzt, verzichtet laut Aikido auf die seitliche Ausbreitung über Kubernetes. Stattdessen verbreitet sie sich über SSH: Sie durchsucht Authentifizierungsprotokolle nach gültigen Zugangsdaten und setzt gestohlene private Schlüssel ein.

Als auffällige Anzeichen dieser Aktivität nennen die Forscher ausgehende SSH-Verbindungen mit ‘StrictHostKeyChecking=no’ von kompromittierten Hosts, ausgehende Verbindungen zur Docker-API auf Port 2375 im lokalen Subnetz sowie privilegierte Alpine-Container über eine nicht authentifizierte Docker-API, bei denen / als hostPath eingebunden ist.