Entfernen der Badbox Malware von der bei AliExpress gekauften TV-Box H20pro (Allwinner H616 CPU und Mali G31 GPU)


Weblog vom 31.01.2025: Entfernen der Badbox Malware von der bei AliExpress gekauften TV-Box H20pro (Allwinner H616 CPU und Mali G31 GPU)
Kategorie:IT Security
Stichworte:Internet, Router, Station, TVBox, Hongtop, Hongxin, Shenzhen, AliExpress, China, H20, H20 pro, Malware, BadBox, Firmware, Vodafone, BSI, Firmware, SmartTV, Android, ADB, Analyse, File-Analyse, DNS, dcylog.com, ycxrl.com, Entfernung, Bereinigung, Säuberung, Desinfektion


Die Geschichte beginnt damit, dass ich mir zwei Android-TV-Boxen auf AliExpress gekauft habe und dann irgendwann eine Warn-e-mail von meinem Provider Vodafone bekam, der mir mitteilte, dass irgendwas bei mir mit der Badbox-Malware infiziert sei und sein Unwesen im Internet treibe.

Das musste ich mir natürlich genauer anschauen. Zuerst analysierte ich das Android der beiden Boxen, ob irgendwas verdächtig ist und fand schon ein paar Apps, die mir nicht ganz koscher vorkamen.

Also guckte ich mir auch die Internet-Kommunikation für die H20 Box mit Rockchip RK3228a CPU (32bit Quad Core) mit einer Mali-400MP2 GPU an. Und dann später auch für die zweite, leistungsfähigere Box, nämlich die H20pro mit Allwinner 616-Chipsatz und G31 Mali-Chipsatz, beide gekauft im Topsion Store über AliExpress. Und auch auf der zweiten Box fand ich die Malware vor.

In letztem Artikel dieser Reihe habe ich versucht, die H20 Box (mit (RK3228a CPU und Mali-400MP2 GPU) von der Malware zu befreien, hatte aber leider nur bedingt Erfolg. Jenen Artikel sollte man auf jeden Fall im Vorgang lesen, um zu wissen, um was es hier genau geht. Denn ich werde hier nicht alles noch einmal haarklein wiederholen, was ich dort schon erwähnt habe.

Heute soll es um die Desinfektion (oder den Versuch) der zweiten Box, der H20pro mit Allwinner H616-CPU und Mali G31-GPU gehen. Diese ist um einiges leistungsstärker als die H20 aus dem letzten Artikel und ich würde sie wirklich gerne weiter benutzen.

Viele TV-Boxen haben den gleichen oder einen ganz ähnlichen Chipsatz und heißen T95 (Max/Pro), X12 (Plus), X88 (Pro), G96 (Max), H96 (Max), X96q, MXQ (pro), 4K, 6K, 8K oder ähnlich. Die Wahrscheinlichkeit, dass diese auch mit der Badbox Malware infiziert sind, ist hoch. Möglicherweise verwenden sie aber andere Malware-Domains. Da es so wichtig ist, hier noch einmal die Zusammenstellung der Command-and-Control-Domains, die ich anhand der Quellen unten zusammentragen habe:
6f33933ce4a5c0e1b32fea736a61351a.com bitemores.com bluefish.work cast.jutux.work catmos99.com cbphe.com cbpheback.com coslogdydy.in cxlcyy.com cxzyr.com dcylog.com echojoy.xyz flyermobi.com giddy.cc goologer.com home.1ztop.work huuww.com jolted.vip jutux.work logcer.com meiboot.com msohu.shop mtcpmpm.com old.1ztop.work pccyy.com pcxrl.com pcxrlback.com pixelscast.com pixlo.cc soyatea.online swiftcode.work tvsnapp.com veezy.sitev ycxad.com ycxrl.com ycxrldow.com yydsmr.com ztword.com

Erste Maßnahme: Verbindung zu den C&C-Domains kappen

Als erste Maßnahme hatte ich ja bereits die Domains ycxrl.com, über die die H20pro Box Verbindung zum Command-and-Control-Server aufnehmen wollen, bei mir im DNS-Server Pi-Hole umgeleitet, so dass sie nicht mehr ins Internet kommt.

Damit auch keine (evtl. schädlichen) Firmware-Updates mehr möglich sind, leite ich auch die Domains ota.szhxws.com und www.szhxws.com um. Die erste scheint für Firmware-Updates zuständig zu sein. Bei der zweiten telefoniert die Box wohl einfach nur für statistische Zwecke nach Hause. Beides wird durch die Domain-Umleitung durch Local DNS / DNS Records - Einträge in meinem Pi-Hole unterbunden.

Wer keinen eigenen DNS-Server wie Pi-Hole laufen hat, kann auch direkt auf der Box die Verbindungen zu den verdächtigen Domains unterbinden, indem er sie in /etc/host einträgt, was sogar noch sicherer ist und auch funktioniert, falls der eigene DNS-Server mal ausfällt:
/etc/hosts 127.0.0.1 dcylog.com 127.0.0.1 ycxrl.com 127.0.0.1 ota.szhxws.com 127.0.0.1 www.szhxws.com 127.0.0.1 szhxws.com
Warnung: Mit den falschen ADB-Befehlen oder falls man die falschen Apps deinstalliert, kann man seine TV-Box durchaus bricken, sprich unbrauchbar machen, so dass sie nicht mehr läuft. Also seid vorsichtig und lest alles genau durch und tut nur Dinge, von denen ihr wisst, dass sie die richtigen sind. Ich übernehme keine Haftung, für rein gar nichts.
Falls eure TV-Box nicht mehr startet, hilft eventuell ein Hardware-Reset: Bei den H20 und H20pro (und ähnlichen) Boxen befindet sich der Reset-Taster hinten in der Klinkenbuchse (kein Scherz!) und muss mit einem Zahnstocher oder etwas anderem, nicht elektrisch leitendem, gehalten werden, während man das Stromkabel einsteckt. Video dazu unter https://youtu.be/kIPIU03FjYE. Bei meiner H20pro kam dann leider aber kein Wiederherstellungsmenü, sondern der Bildschirm blieb schwarz, nur die LED wurde rot.
Bei anderen, mit Badbox infizierten Boxen (von denen es reichlich gibt, siehe erster Artikel der Reihe) sollte die Dekontaminierung ganz ähnlich verlaufen. Die C&C-Domains kann man mit Pi-Hole oder PCAPdroid herausfinden (siehe dazu dritter Artikel der Reihe. Die Malware-Apps werden sich unterscheiden, das Prinzip ist aber das Gleiche. Bei anderen Boxen als der H20 und H20pro muss man natürlich noch mehr Umsicht walten lassen.
Wie gesagt: Alles hier auf eigenes Risiko!

Die Datei /etc/hosts kann man über ADB editieren. Wie man ADB unter Windows installiert, erklärt mein Artikel über den ADB-Zugriff auf ein Xiaomi-Redmi-Android-Smartphone. Auch die Android TV-Box ist ein Android-Gerät und da läuft es genauso. Die Befehle, die in dem Artikel nach "ADB-Shell aufrufen und Befehle eingeben" folgen lasst ihr für diesen Fall natürlich weg, die betreffen das nur das im Artikel besprochene Speicherkarten-Problem dort.

Stattdessen müssen wir folgende Befehle eingeben:
11:05:03.43 C:\ >> adb root adbd is already running as root 11:06:39.11 d:\TEMP\ho >> adb remount W DM_DEV_STATUS failed for scratch: No such device or address E [liblp]No device named scratch [liblp]Partition scratch will resize from 0 bytes to 517459968 bytes [liblp]Updated logical partition table at slot 0 on device /dev/block/by-name/super [libfs_mgr]Created logical partition scratch on device /dev/block/dm-3 [libfs_mgr]__mount(source=/dev/block/dm-3,target=/mnt/scratch,type=f2fs)=0: Success Using overlayfs for /system Using overlayfs for /vendor Using overlayfs for /product [libfs_mgr]__mount(source=overlay,target=/system,type=overlay,upperdir=/mnt/scratch/overlay/system/upper)=0 [libfs_mgr]__mount(source=overlay,target=/vendor,type=overlay,upperdir=/mnt/scratch/overlay/vendor/upper)=0 [libfs_mgr]__mount(source=overlay,target=/product,type=overlay,upperdir=/mnt/scratch/overlay/product/upper)=0 remount succeeded
Die Root und Remount-Befehle sind wichtig, da man ansonsten auf die /etc/hosts nicht zugreifen kann und stattdessen den Fehler /system/bin/sh: can't create /etc/hosts: Read-only file system bekommt.

Diese vielen Ausgaben beim remount kommen mir komisch vor. Normalerweise kommen da keine Ausgaben. Da müssen wir gleich noch überprüfen, ob das System noch hochfährt. Scheinbar wurde eine "Scratch"-Partition mit 517 MB angelegt.

Nach diesen Vorbereitungen geht es weiter in der ADB Shell, also direkt auf der TV-Box. Schauen wir erst einmal, was in der /etc/hosts so drin steht und machen eine Sicherheitskopie. Danach lade ich meine auf dem PC editierte hosts.4-Datei, die die Umleitung auf meine Webserver unter der IP 10.10.10.4 enthält, auf die Box und überprüfe noch einmal das Ergebnis:
11:11:07.36 d:\TEMP\ho >> adb shell cat /etc/hosts 127.0.0.1 localhost ::1 ip6-localhost 11:11:55.50 d:\TEMP\ho >> adb shell cp /etc/hosts /etc/hosts.bak 11:12:28.13 d:\TEMP\ho >> adb push hosts.4 /etc/hosts hosts.4: 1 file pushed, 0 skipped. 0.1 MB/s (174 bytes in 0.001s) 11:12:47.47 d:\TEMP\ho >> adb shell cat /etc/hosts 127.0.0.1 localhost ::1 ip6-localhost 10.10.10.4 dcylog.com 10.10.10.4 ycxrl.com 10.10.10.4 ota.szhxws.com 10.10.10.4 www.szhxws.com 10.10.10.4 szhxws.com
Ab sofort werden alle (mir für die H20 Box bekannte vermeintlich) schädlichen Domainabfragen auf meinen Webserver im LAN umgeleitet. Das heißt: Das Ganze ist ja dann auf der Box selbst gespeichert und nicht mehr von einem laufenden, umleitenden DNS-Server abhängig, was bedeutet, dass man die Box auch zu einem Freund mitnehmen kann, der keinen DNS-Server laufen hat.

Später kann ich noch 127.0.0.1 statt 10.10.10.4 eintragen, damit die Anfragen die Box gar nicht verlassen. Aber für Beobachtungszwecke lasse ich das erst einmal so.

Danach fahre ich die Box neu hoch. Die Scratch-Partition scheint keine Auswirkungen zu haben, denn es funktioniert alles einwandfrei. Allerdings auch die Malware. Die entsprechenden Einträge tauchen kurze Zeit im Webserver-Logfile auf:
2025-01-30 10:06:37 10.10.10.4 GET /ott/dev/plugin_conf.xml - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 301 0 0 7 2025-01-30 10:06:37 10.10.10.4 GET /ott/dev/plugin_conf.xml - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 50 2025-01-30 10:06:38 10.10.10.4 GET /Update/cupid/android_tv_box/AB42G/10_29/version.json - 80 - 10.10.10.200 okhttp/3.4.1 - 404 0 2 11 2025-01-30 10:08:01 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 235 2025-01-30 10:08:31 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 5 2025-01-30 10:08:46 10.10.10.4 GET /Update/cupid/android_tv_box/AB42G/10_29/version.json - 80 - 10.10.10.200 okhttp/3.4.1 - 404 0 2 7 2025-01-30 10:09:01 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 4 2025-01-30 10:10:01 10.10.10.4 POST /terminal/client/register - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 6 2025-01-30 10:10:31 10.10.10.4 POST /terminal/client/register - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 5 2025-01-30 10:11:01 10.10.10.4 POST /terminal/client/register - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 4 2025-01-30 10:19:31 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 6 2025-01-30 10:20:01 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 4 2025-01-30 10:20:31 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 3 2025-01-30 10:21:01 10.10.10.4 POST /terminal/client/eventinfo - 80 - 10.10.10.200 Dalvik/2.1.0+(Linux;+U;+Android+10;+android_tv_box+Build/QP1A.191105.004) - 404 0 2 4

Zweiter Schritt: eine Ersatz-Launcher-App besorgen

Auf anderen TV-Boxen, die Sicherheitsforscher untersucht haben, versteckte sich die Schadsoftware oft im Launcher. Der Launcher ist das Stück Software, das nach dem Hochfahren angezeigt wird, um darin die Apps auszuwählen, die man starten will - darum ja auch "Launcher", englisch für "Starter". Der sieht im Original so aus:



Der sollte auf jeden Fall vom Gerät runter, da er häufig Nest der Malware ist. Das Problem ist nur, ohne Launcher kann man keine Apps mehr starten! Also muss vorher, also bevor wir den wohl infizierten Original-Launcher vom Gerät löschen, ein Alternativ-Launcher installiert werden. Davon gibt es einige im Google Play Store zu finden, von dem man sich im Prinzip einen aussuchen kann, der einem gefällt. Aber daran denken, dass der Wunschkandidat auf einer TV-Box mit Fernbedienung und nicht auf einem Smartphone mit Touch laufen soll.

Ich habe mir den Simple TV Launcher ausgesucht. Der ist schön schlank und schnell ohne unnötigen Schnick-Schnack und ich finde sehr gut bedienbar mit den Pfeiltasten auf der Fernbedienung. Ich will nicht mit der Maus-Emulation rummachen, wenn ich nur eine App starten will. Das sieht dann so aus und ich habe alles, was ich brauche:




Ich kann mir einstellen, wieviele Zeilen und Spalten ich haben möchte und habe dann dementsprechend viele Felder, die ich mit installierten Apps belegen kann.

Die kann ich nach einem OK-Klick auf ein leeres Feld (+) aus der Liste der installierten Apps auswählen.

Und wenn ich mehr Programme brauche, passe ich einfach die Anzahl der Felder an. Easy-Peasy und genug für mich.

Wichtig ist, dass der Launcher vorher aktiv war, also der Auswahl-Dialog angezeigt wird, indem gefragt wird, ob man den ersten, vorinstallierten oder den zweiten, alternativen Launcher benutzen möchte.

Ab da an kennt Android den Launcher und nimmt automatisch den Zweiten, wenn der Erste gelöscht wurde.

Dritter Schritt: verdächtige Apps deaktivieren oder deinstallieren

Jetzt heißt die Devise: Vorsichtig sein und Geduld haben.

Vorsichtig deshalb, weil wir nicht die falschen System-Apps entfernen wollen, die dann vielleicht fehlen, damit das System auf der TV-Box startet und korrekt läuft.

Geduldig deshalb, weil wir uns eine nach der anderen, verdächtigen App vornehmen und dann überprüfen, ob die Zugriffe auf die Domains dcylog.com bzw. ycxrl.com und ota.szhxws.com sowie www.szhxws.com aufhören. Die ersten beiden sind für die Malware, die beiden letzten für Systemupdate und Nachhause-Telefonieren.

Ob die DNS und HTTP-Abfragen noch aktiv sind, können wir mit PCAPdroid, Firewall ohne Root oder dergleichen direkt auf dem Android-Gerät sehen. Oder wir leiten doch noch einmal den Internetverkehr für die Domains auf eine eigene IP mit einem Webserver um, dessen Logfiles wir dann beobachten. Dann müssen wir allerdings die Hosts-Datei wieder zurücksetzen, weil zur Zeit ja nichts aus der Box mehr raus geht für die dort definierten Bad-Domains.



Auch diesmal versuche ich auf direktem Web herauszufinden, welche App für die Aufrufe zum C&C-Server (Domain YCXRL.COM) und zum Update-Server (Domain OTA.SZHXWS.COM) verantwortlich ist. Doch leider habe ich mal wieder Pech.

PCAPdroid spuckt für die Update-Requests nur "Android" aus und für die C&C-Requests ebenfalls nur "Android".

Auch die Überprüfung via netstat liefert nur einen brauchbaren Kandidaten für die Update-Anfragen. Für die Malware-Anfragen wird wieder nur "system_server", wie schon bei der H20 Box, angegeben.

Das Versteckspiel beherrscht die Malware also auch auf dieser Box.

12:34:52.92 d:\TEMP >> adb root restarting adbd as root 12:35:28.53 d:\TEMP >> adb shell netstat -t -n -p -a -W -e Active Internet connections (established and servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program Name tcp6 0 0 ::ffff:10.10.10.200:51252 ::ffff:10.10.10.4:80 ESTABLISHED 1000 44366 3733/com.hx.update tcp6 4328 0 ::ffff:10.10.10.200:51254 ::ffff:10.10.10.4:80 ESTABLISHED 1000 40215 2133/system_server tcp6 4328 0 ::ffff:10.10.10.200:51256 ::ffff:10.10.10.4:80 ESTABLISHED 1000 41172 2133/system_server tcp6 4328 0 ::ffff:10.10.10.200:51258 ::ffff:10.10.10.4:80 ESTABLISHED 1000 42736 2133/system_server tcp6 4328 0 ::ffff:10.10.10.200:51260 ::ffff:10.10.10.4:80 ESTABLISHED 1000 42757 2133/system_server
Der Request GET /Update/cupid/android_tv_box/AB42G/10_29/version.json mit dem User-Agent okhttp/3.4.1 gehörte also zum Process com.hx.update.

Der Request POST /terminal/client/eventinfo liefert allerdings wieder nur system_server.

Na, dann fange ich doch einmal mit dem Update-Service an und deaktivieren den. Aber vorher mache ich ein Backup der /system/app und /system/priv-app-Verzeichnisse:
12:57:53.19 d:\TEMP >> adb shell android_tv_box:/ # cd system/ android_tv_box:/system # ls apex app bin build.prop etc fonts framework lib media preinstall priv-app product recovery-from-boot.p usr vendor xbin android_tv_box:/system # ls app AllwinnerGmsIntegration BookmarkProvider CtsShimPrebuilt GoogleContactsSyncAdapter HXUserManual PacProcessor SecureElement Update AppCleaner BuiltInPrintService DragonAgingTV GoogleExtShared KeyChain PartnerBookmarksProvider SimAppDialog WallpaperBackup BasicDreams CertInstaller DragonBox GoogleTTS Music PlatformCaptivePortalLogin SystemUpdate WebScreensaver Bluetooth Chrome EasterEgg HLauncher NfcNci PrintRecommendationService TextViewer WebViewGoogle BluetoothMidiService CompanionDeviceManager GalleryTV HTMLViewer OsuLogin PrintSpooler TvdVideo android_tv_box:/system # ls priv-app/ ApkBridge DownloadProviderUi GooglePartnerSetup ManagedProvisioning SharedStorageBackup UserDictionaryProvider AutoTestTool DynamicSystemInstallationService GoogleRestore MediaProvider Shell Velvet BackupRestoreConfirmation ExternalStorageProvider GoogleServicesFramework MmsService StatementService VideoTest BlockedNumberProvider FusedLocation HXDeviceMonitor MtpDocumentsProvider TeleService VideoTestGuard BugReport GmsCore HXDeviceTest_v2 MusicFX Telecom VpnDialogs CalendarProvider GoogleBackupTransport HttpSpeedTest_builtin PermissionController TelephonyProvider ContactsProvider GoogleConfigUpdater HxHttpVideo PlatformNetworkPermissionConfig Tubesky CtsShimPrivPrebuilt GoogleExtServices InProcessNetworkStack ProxyHandler TvProvider DocumentsUI GoogleOneTimeInitializer InputDevices SettingsAssist TvSettings DownloadProvider GooglePackageInstaller LocalTransport SettingsProvider TvdFileManager android_tv_box:/system # exit
12:59:15.61 d:\TEMP >> md h20pro 12:59:23.72 d:\TEMP >> cd h20pro 12:59:26.52 d:\TEMP\h20pro >> md app 12:59:33.32 d:\TEMP\h20pro >> md priv-app 12:59:36.15 d:\TEMP\h20pro >> cd app 12:59:42.95 d:\TEMP\h20pro\app >> adb pull /system/app /system/app/: 120 files pulled, 0 skipped. 13.4 MB/s (394995198 bytes in 28.180s) 13:00:25.69 d:\TEMP\h20pro\app >> cd ..\priv-app 13:00:40.60 d:\TEMP\h20pro\priv-app >> adb pull /system/priv-app /system/priv-app/: 159 files pulled, 0 skipped. 13.6 MB/s (646214710 bytes in 45.396s)
Dann deinstalliere ich das Package com.hx.update
13:04:31.59 d:\TEMP\h20pro >> adb shell pm list packages | grep -i hx package:com.hx.autotesttool package:com.hx.httpspeedtest package:com.hx.usermanual package:com.hx.guardservice package:com.hx.devicemonitor package:com.hx.update package:com.hx.appcleaner package:com.hx.mboxlauncher package:com.hx.httpvideotest package:com.hxdevicetest package:com.hx.videotest package:com.hx.apkbridge 13:06:45.36 d:\TEMP\h20pro >> adb shell ps | grep -i hx system 2886 1856 1022504 75708 SyS_epoll_wait 0 S com.hx.autotesttool system 2929 1856 1026564 80380 SyS_epoll_wait 0 S com.hxdevicetest system 2954 1856 1020628 72864 SyS_epoll_wait 0 S com.hx.videotest system 3730 1856 1025108 79352 SyS_epoll_wait 0 S com.hx.devicemonitor 13:07:13.32 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.update Success 13:07:25.54 d:\TEMP\h20pro >> adb reboot
Die Update-Aufrufe GET /Update/cupid/android_tv_box/AB42G/10_29/version.json sollten eigentlich damit aufhören. Und das scheinen sie auch zu tun. Das war ja einfach loszuwerden.

Machen wir uns gleich weiter auf die Jagd nach der App, in der die Malware steckt. Das Package com.hx.mboxlauncher wäre ein Verdächtiger, denn bei anderen Sicherheitsvorkommnissen dieser Malware versteckte sich die Malware gerne mal in Launcher (auch wenn das bei der H20 Box nicht der Fall war).
13:29:27.54 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.mboxlauncher Success 13:33:24.48 d:\TEMP\h20pro >> adb reboot
Nach dem Wiederhochfahren der Box überprüfe ich, ob noch alles läuft. Check. Und dann warte ich auch neue Einträge im Webserver-Log. Kurz nach dem Hochfahren gibt es ein GET /ott/dev/plugin_conf.xml und auch das POST /terminal/client/eventinfo stellt sich schnell wieder ein.

Doch dann fällt mir auf: com.hx.mboxlauncher ist gar nicht deinstalliert:
13:38:29.34 d:\TEMP\h20pro >> adb shell pm list packages | grep -i hx package:com.hx.autotesttool package:com.hx.httpspeedtest package:com.hx.usermanual package:com.hx.guardservice package:com.hx.devicemonitor package:com.hx.appcleaner package:com.hx.mboxlauncher package:com.hx.httpvideotest package:com.hxdevicetest package:com.hx.videotest package:com.hx.apkbridge
Also zum Test nocheinmal deinstallieren. Eigentlich sollte dann eine Fehlermeldung kommen. Doch das Package lässt sich nochmal deinstallieren:
13:39:07.60 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.mboxlauncher Success 13:39:27.84 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.mboxlauncher Failure [not installed for 0]
Also fahre ich die Box noch einmal runter und wieder hoch und schaue, ob com.hx.mboxlauncher automatisch neu installiert wird.

Jetzt fehlt der Eintrag seltsamerweise:
13:43:04.56 d:\TEMP\h20pro >> adb shell pm list packages | grep -i hx package:com.hx.autotesttool package:com.hx.httpspeedtest package:com.hx.usermanual package:com.hx.guardservice package:com.hx.devicemonitor package:com.hx.appcleaner package:com.hx.httpvideotest package:com.hxdevicetest package:com.hx.videotest package:com.hx.apkbridge
Ein wenig an mir selbst zweifelnd checke ich meinen Befehls-Log und finde
13:29:27.54 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.mboxlauncher Success
Sehr seltsam. Ich habe den Befehl richtig abgesetzt. Und Root war ich die ganze Zeit auch:
13:08:02.02 d:\TEMP\h20pro >> adb root restarting adbd as root
Und außerdem gab es ja eine Success-Meldung. Sehr seltsam. Tarnt sich die Malware, indem sie nur jedes soundsovielte mal versucht, sich neu zu installieren, damit es nicht so sehr auffällt? Das sollte ich mal im Hinterkopf behalten.

In der Zwischenzeit sind einige neue POST /terminal/... eingetrudelt. In com.hx.mboxlauncher war die Malware wohl nicht drin.

Also deinstalliere ich gleich ein bisschen mehr. Nehmen wir uns zuerst die laufenden Prozesse vor:
13:49:25.97 d:\TEMP\h20pro >> adb shell ps | grep -i hx system 2841 1858 1022504 75940 0 0 S com.hx.autotesttool system 2893 1858 1027588 80848 0 0 S com.hxdevicetest system 2913 1858 1021684 73216 0 0 S com.hx.videotest system 3697 1858 1025108 79492 0 0 S com.hx.devicemonitor
und deinstallieren die:
13:51:27.74 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.autotesttool Success 13:52:19.86 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hxdevicetest Success 13:52:25.66 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.videotest Success 13:52:31.48 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.devicemonitor Success 13:52:37.96 d:\TEMP\h20pro >> adb reboot
Erster Test nach dem Wiederhochfahren: Läuft noch alles? Ja. Zweiter Check: Laufen die Prozesse zu den Packages auch nicht mehr?
13:52:47.36 d:\TEMP\h20pro >> adb root restarting adbd as root 13:55:37.81 d:\TEMP\h20pro >> adb shell ps | grep -i hx
Auch Check. Sind sie auch aus der Liste der installierten Apps verschwunden?
13:55:41.30 d:\TEMP\h20pro >> adb shell pm list packages | grep -i hx package:com.hx.httpspeedtest package:com.hx.usermanual package:com.hx.guardservice package:com.hx.appcleaner package:com.hx.httpvideotest package:com.hx.apkbridge
Auch Check. Nun die große Frage: Habe die POST /terminal - Requests aufgehört?

Leider nein, immer noch nicht. Also lassen wir auch die restlichen Apps über die Klinge springe, die HX im Namen haben:
13:57:11.92 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.httpspeedtest Success 13:59:31.27 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.usermanual Success 14:00:14.11 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.guardservice Success 14:00:27.90 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.appcleaner Success 14:00:36.29 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.httpvideotest Success 14:00:49.10 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.hx.apkbridge Success 14:00:58.21 d:\TEMP\h20pro >> adb shell pm list packages | grep -i hx 14:01:02.51 d:\TEMP\h20pro >> adb reboot
Und wieder das selbe Abchecken nach dem Neustart. Box läuft. Die GET /ott/dev/plugin_conf.xml sind wohl jetzt weg, aber die POST /terminal/client/register und POST /terminal/client/eventinfo kommen immer noch.

Der Malware ist wohl hier ähnlich schwer der Garaus zu machen wie bei der H20 Box.

Austreibungsversuch über Sperrung von /data/system/Corejava

Bei DesktopECHO und den Jungs von Malwarebytes Labs (8, 7) hört sich bei einer ähnlichen Box, der T95 TV Box, auch ausgestattet mit Allwinner H616 Quadcore-Cortex-A53-CPU und der Mali-G31 MP2-GPU, ganz einfach an. Die hatten die Malware in dessen Launcher com.swe.dgbluancher gefunden und die Malware in einer Node im Verzeichnis /data/system/Corejava erwischt. Ich habe dort allerdings keine Nodes, sondern nur eine Datei "e.l". Bei mir ist das Verzeichnis leer:
android_tv_box:/ # du | grep -i Corejava 4 ./data/system/Corejava/node 8 ./data/system/Corejava android_tv_box:/ # cd /data/system/Corejava android_tv_box:/data/system/Corejava # ls -l total 3 -rw------- 1 system system 40 2025-01-30 14:01 e.l drwxr-xr-x 2 system system 3488 2024-04-09 06:16 node android_tv_box:/data/system/Corejava # cd node android_tv_box:/data/system/Corejava/node # ls -l total 0
Um zu schauen, ob es sich nicht doch um den gleichen Typ Malware handelt, lösche ich das Verzeichnis /data/system/Corejava komplett und reboote die Box, nur um zu schauen, ob das Verzeichnis neu angelegt wird.
14:28:23.64 d:\TEMP\h20pro >> adb shell rm -rf /data/system/Corejava 14:28:47.86 d:\TEMP\h20pro >> adb shell ls -l /data/system/Corejava ls: /data/system/Corejava: No such file or directory
Nach dem Neustart ist es wieder da, wieder nur mit einer kurzen Datei namens "e.l":
14:33:58.08 d:\TEMP\h20pro >> adb shell xxd /data/system/Corejava/e.l 00000000: 0000 0194 b769 399f 0000 0000 0000 0000 .....i9......... 00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000020: 0000 0028 0000 0000 ...(....
Ich sperre mal das Verzeichnis /data/system/Corejava für weitere Zugriffe, wie von Malwarebytes beschrieben
14:34:08.29 d:\TEMP\h20pro >> adb shell rm -rf /data/system/Corejava 14:36:16.72 d:\TEMP\h20pro >> adb shell touch /data/system/Corejava 14:36:26.86 d:\TEMP\h20pro >> chmod 000 /data/system/Corejava chmod: cannot access '/data/system/Corejava': No such file or directory 14:37:01.34 d:\TEMP\h20pro >> adb shell chmod 000 /data/system/Corejava 14:37:29.72 d:\TEMP\h20pro >> adb shell busybox chattr +i /data/system/Corejava 14:37:41.67 d:\TEMP\h20pro >> adb shell ls -l /data/system/Corejava ---------- 1 root root 0 2025-01-30 14:36 /data/system/Corejava 14:38:35.39 d:\TEMP\h20pro >> adb reboot
So kann die Datei e.l nach dem Neustart nicht mehr angelegt werden und das Verzeichnis bleibt leer:
14:38:58.97 d:\TEMP\h20pro >> adb root restarting adbd as root 14:40:29.42 d:\TEMP\h20pro >> adb shell ls -l /data/system/Corejava ---------- 1 root root 0 2025-01-30 14:36 /data/system/Corejava
Alles, was auf /data/system/Corejava zugreifen will, bekommt einen Fehler:
14:43:16.00 d:\TEMP\h20pro >> adb logcat | grep Corejava 01-30 14:41:12.766 2447 2447 W FileUtils: Failed to chmod(/data/system/Corejava): android.system.ErrnoException: chmod failed: EPERM (Operation not permitted) 01-30 14:41:12.768 2447 2447 W FileUtils: Failed to chmod(/data/system/Corejava/node): android.system.ErrnoException: chmod failed: ENOTDIR (Not a directory)
Bleibt die Frage, ob die Box noch läuft (ja, tut sie) und ob noch Malware-Zugriffe erfolgen... ja, tun sie. Das "Rezept" von Malwarebytes funktioniert also leider nicht bei meiner Box. Die Malware-Entwickler scheinen wohl dazu gelernt zu haben. Aber einen Versuch war es wert.

Was sagt uns der User-Agent Dalvik?

Ich frage mich auch, warum die Malware einen so langen User-Agent Dalvik/2.1.0 (Linux; U; Android 10; android_tv_box Build/QP1A.191105.004) bei seinen Webzugriffen benutzt. Wenn sie nur ihren Herrn und Meister kontaktieren will, dann reicht doch auch ein kurzer User-Agent-String.

Aber vielleicht setzt die Malware ja auch die HTTP-Requests gar nicht mit eigenem Code ab, sondern missbraucht dazu ein anderes Programm, vielleicht einen Browser. Das wäre doch auch eine gute Tarnung und würde die Rückverfolgbarkeit behindern.

Allerdings scheint es, das der User-Agent "Dalvik" nur darauf schließen, dass die Malware in der Dalvik Virtual Machine (25) läuft bzw. dafür kompiliert wurde und damit dessen Programmbestandteile benutzt, auch für den Internet-Transfer.

Weitere Verdächtige ausfindig mache und deinstallieren

Es bleibt mir also nichts anderes als nach folgendem Motto vorzugehen: Die Auswahl an Kandidaten ist groß. Vielleicht sollte ich mich erst einmal auf die Priv-Apps konzentrieren und dort die auswählen, die mir suspekt oder überflüssig erscheinen. Zum Beispiel werde ich mit meiner TV-Box weder Fotos knipsen, noch telefonieren...
15:22:20.88 d:\TEMP\h20pro >> adb shell pm list packages -s -f package:/system/app/TvdVideo/TvdVideo.apk=com.softwinner.TvdVideo package:/system/priv-app/CtsShimPrivPrebuilt/CtsShimPrivPrebuilt.apk=com.android.cts.priv.ctsshim package:/system/priv-app/GoogleExtServices/GoogleExtServices.apk=com.google.android.ext.services package:/system/priv-app/TelephonyProvider/TelephonyProvider.apk=com.android.providers.telephony package:/system/priv-app/DynamicSystemInstallationService/DynamicSystemInstallationService.apk=com.android.dynsystem package:/system/priv-app/Velvet/Velvet.apk=com.google.android.googlequicksearchbox package:/system/priv-app/CalendarProvider/CalendarProvider.apk=com.android.providers.calendar package:/system/priv-app/TvSettings/TvSettings.apk=com.android.tv.settings package:/system/priv-app/MediaProvider/MediaProvider.apk=com.android.providers.media package:/system/priv-app/GoogleOneTimeInitializer/GoogleOneTimeInitializer.apk=com.google.android.onetimeinitializer package:/system/app/GoogleExtShared/GoogleExtShared.apk=com.google.android.ext.shared package:/product/priv-app/WallpaperCropper/WallpaperCropper.apk=com.android.wallpapercropper package:/system/priv-app/BugReport/BugReport.apk=com.dd.bugreport package:/product/app/AwlogSettings/AwlogSettings.apk=com.softwinner.awlogsettings package:/system/priv-app/DocumentsUI/DocumentsUI.apk=com.android.documentsui package:/system/priv-app/ExternalStorageProvider/ExternalStorageProvider.apk=com.android.externalstorage package:/system/app/HTMLViewer/HTMLViewer.apk=com.android.htmlviewer package:/system/app/CompanionDeviceManager/CompanionDeviceManager.apk=com.android.companiondevicemanager package:/system/priv-app/MmsService/MmsService.apk=com.android.mms.service package:/system/priv-app/DownloadProvider/DownloadProvider.apk=com.android.providers.downloads package:/system/priv-app/TvProvider/TvProvider.apk=com.android.providers.tv package:/system/priv-app/InProcessNetworkStack/InProcessNetworkStack.apk=com.android.networkstack.inprocess package:/system/app/DragonBox/DragonBox.apk=com.softwinner.dragonbox package:/system/priv-app/GoogleConfigUpdater/GoogleConfigUpdater.apk=com.google.android.configupdater package:/system/priv-app/DownloadProviderUi/DownloadProviderUi.apk=com.android.providers.downloads.ui package:/system/priv-app/Tubesky/Tubesky.apk=com.android.vending package:/system/app/PacProcessor/PacProcessor.apk=com.android.pacprocessor package:/system/app/SimAppDialog/SimAppDialog.apk=com.android.simappdialog package:/product/app/ModuleMetadata/ModuleMetadata.apk=com.android.modulemetadata package:/system/app/CertInstaller/CertInstaller.apk=com.android.certinstaller package:/system/framework/framework-res.apk=android package:/product/app/Camera2/Camera2.apk=com.android.camera2 package:/system/app/EasterEgg/EasterEgg.apk=com.android.egg package:/system/priv-app/MtpDocumentsProvider/MtpDocumentsProvider.apk=com.android.mtp package:/system/app/NfcNci/NfcNci.apk=com.android.nfc package:/system/priv-app/BackupRestoreConfirmation/BackupRestoreConfirmation.apk=com.android.backupconfirm package:/system/priv-app/StatementService/StatementService.apk=com.android.statementservice package:/system/app/OsuLogin/OsuLogin.apk=com.android.hotspot2 package:/product/priv-app/SettingsIntelligence/SettingsIntelligence.apk=com.android.settings.intelligence package:/system/priv-app/SettingsProvider/SettingsProvider.apk=com.android.providers.settings package:/system/priv-app/SharedStorageBackup/SharedStorageBackup.apk=com.android.sharedstoragebackup package:/system/app/PrintSpooler/PrintSpooler.apk=com.android.printspooler package:/system/app/BasicDreams/BasicDreams.apk=com.android.dreams.basic package:/system/app/SecureElement/SecureElement.apk=com.android.se package:/system/priv-app/InputDevices/InputDevices.apk=com.android.inputdevices package:/system/app/BuiltInPrintService/BuiltInPrintService.apk=com.android.bips package:/system/app/TextViewer/TextViewer.apk=pt.pedro.textfileviewer package:/system/priv-app/MusicFX/MusicFX.apk=com.android.musicfx package:/data/app/com.google.android.webview-vPyjIC5GTB3zz9hnNS-zyg==/base.apk=com.google.android.webview package:/system/priv-app/Telecom/Telecom.apk=com.android.server.telecom package:/system/app/GoogleContactsSyncAdapter/GoogleContactsSyncAdapter.apk=com.google.android.syncadapters.contacts package:/system/app/KeyChain/KeyChain.apk=com.android.keychain package:/data/app/com.android.chrome-0MZ5vayVfbEkDaDn86ApHA==/base.apk=com.android.chrome package:/system/app/PrintRecommendationService/PrintRecommendationService.apk=com.android.printservice.recommendation package:/system/priv-app/SettingsAssist/SettingsAssist.apk=com.softwinner.settingsassist package:/system/app/GalleryTV/GalleryTV.apk=com.android.gallery3d package:/system/priv-app/GooglePackageInstaller/GooglePackageInstaller.apk=com.google.android.packageinstaller package:/system/priv-app/GmsCore/GmsCore.apk=com.google.android.gms package:/system/priv-app/GoogleServicesFramework/GoogleServicesFramework.apk=com.google.android.gsf package:/data/app/com.google.android.tts-Ow1oe5tXMSFFZJs5hTpjFQ==/base.apk=com.google.android.tts package:/system/priv-app/GooglePartnerSetup/GooglePartnerSetup.apk=com.google.android.partnersetup package:/system/app/WebScreensaver/WebScreensaver.apk=com.android.dreams.web package:/system/priv-app/LocalTransport/LocalTransport.apk=com.android.localtransport package:/system/priv-app/ProxyHandler/ProxyHandler.apk=com.android.proxyhandler package:/product/app/LatinIME/LatinIME.apk=com.android.inputmethod.latin package:/system/priv-app/ManagedProvisioning/ManagedProvisioning.apk=com.android.managedprovisioning package:/system/app/AllwinnerGmsIntegration/AllwinnerGmsIntegration.apk=com.allwinnertech.gmsintegration package:/product/app/PackageOverride/PackageOverride.apk=com.allwinnertech.packageoverride package:/system/app/PartnerBookmarksProvider/PartnerBookmarksProvider.apk=com.android.providers.partnerbookmarks package:/system/priv-app/GoogleBackupTransport/GoogleBackupTransport.apk=com.google.android.backuptransport package:/system/app/BookmarkProvider/BookmarkProvider.apk=com.android.bookmarkprovider package:/system/priv-app/PlatformNetworkPermissionConfig/PlatformNetworkPermissionConfig.apk=com.android.networkstack.permissionconfig package:/system/app/CtsShimPrebuilt/CtsShimPrebuilt.apk=com.android.cts.ctsshim package:/system/app/DragonAgingTV/DragonAgingTV.apk=com.softwinner.agingdragonbox package:/system/priv-app/VpnDialogs/VpnDialogs.apk=com.android.vpndialogs package:/system/app/Music/Music.apk=com.android.music package:/system/priv-app/TeleService/TeleService.apk=com.android.phone package:/system/priv-app/Shell/Shell.apk=com.android.shell package:/system/app/WallpaperBackup/WallpaperBackup.apk=com.android.wallpaperbackup package:/system/priv-app/BlockedNumberProvider/BlockedNumberProvider.apk=com.android.providers.blockednumber package:/system/priv-app/UserDictionaryProvider/UserDictionaryProvider.apk=com.android.providers.userdictionary package:/system/priv-app/FusedLocation/FusedLocation.apk=com.android.location.fused package:/product/priv-app/SystemUI/SystemUI.apk=com.android.systemui package:/system/app/BluetoothMidiService/BluetoothMidiService.apk=com.android.bluetoothmidiservice package:/system/priv-app/PermissionController/PermissionController.apk=com.android.permissioncontroller package:/system/app/Update/Update.apk=com.softwinner.update package:/product/overlay/framework-res__auto_generated_rro_product.apk=android.auto_generated_rro_product__ package:/system/app/Bluetooth/Bluetooth.apk=com.android.bluetooth package:/system/priv-app/ContactsProvider/ContactsProvider.apk=com.android.providers.contacts package:/system/app/PlatformCaptivePortalLogin/PlatformCaptivePortalLogin.apk=com.android.captiveportallogin package:/system/priv-app/TvdFileManager/TvdFileManager.apk=com.softwinner.TvdFileManager package:/vendor/overlay/framework-res__auto_generated_rro_vendor.apk=android.auto_generated_rro_vendor__ package:/system/priv-app/GoogleRestore/GoogleRestore.apk=com.google.android.apps.restore
Das Easter Egg (com.android.egg) kommt mir schon mal sehr komisch vor. Auch die beiden Dragon-Apps (com.softwinner.dragonbox und com.softwinner.agingdragonbox) sind wohl überflüssig. Also weg damit und testen...
15:43:36.81 d:\TEMP\h20pro >> adb root adbd is already running as root 15:44:50.67 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.egg Success 15:45:29.38 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.softwinner.dragonbox Success 15:45:37.97 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.softwinner.agingdragonbox Success 15:45:50.20 d:\TEMP\h20pro >> adb reboot
Die Box läuft noch nach dem Neustart. Die Malware funkt aber immer noch fröhlich umher. Also kommt der nächste Schub Apps dran:
15:46:00.51 d:\TEMP\h20pro >> adb root restarting adbd as root 15:50:01.15 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.providers.telephony Success 15:50:13.56 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.camera2 Success 15:50:31.56 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 pt.pedro.textfileviewer Success 15:50:45.99 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.phone Success 15:50:59.83 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.softwinner.TvdFileManager Success 15:51:19.95 d:\TEMP\h20pro >> adb reboot
Die Box fährt hoch und läuft. Und die Malware-Zugriffe sind immer noch da.

Versuchen wir noch mehr zu deinstallieren:
15:51:26.83 d:\TEMP\h20pro >> adb root restarting adbd as root 15:56:05.89 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.dynsystem Success 15:56:55.81 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.android.providers.blockednumber Success 15:57:47.83 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 com.softwinner.update Success 15:58:17.18 d:\TEMP\h20pro >> adb reboot
Die Box fährt noch hoch und funktioniert auch noch. Leider sind die Malware-Zugriffe auch noch da.

Beim Nächsten bin ich mir nicht sicher:
16:10:27.33 d:\TEMP\h20pro >> adb shell pm list packages -s -f vendor package:/vendor/overlay/framework-res__auto_generated_rro_vendor.apk=android.auto_generated_rro_vendor__ 16:13:23.08 d:\TEMP\h20pro >> adb shell pm uninstall -k --user 0 android.auto_generated_rro_vendor__ Success
Die Box kommt aber auch nach diesem Deinstall wieder hoch und funktioniert. Kann also nicht so wichtig gewesen sein. Aber wie könnte es anders sein, auch das beseitigt nicht die Malware-Zugriffe.

Als Nächstes gehe ich nochmal alle System-Apps in den App-Einstellungen durch und beende bzw. deaktiviere alle Apps, die mir nur halbwegs suspekt vorkommen. Doch die Zugriffe hören nicht auf, als ich zahlreiche Apps beendet habe und zwischendrin immer mal wieder ausprobiert habe, ob die gewünschten Apps noch funktionieren.

Dabei ist mir die App HXDeviceMonitor (com.hx.devicemonitor) aufgefallen, die sich nicht Beenden lassen wollte. Nach dem Neustart der TV Box läuft diese und die Positiv-Apps noch, trotz der deaktivierten Apps. Aber die Malware-Posts kommen auch noch regelmäßig.

Wegen der App HXDeviceMonitor mache ich mir aber so meine Gedanken. Wieso scheint die in Einstellungen / Apps zu laufen und kommt nach einem "Beenden erzwingen" immer wieder? Ich habe doch alle HX-Apps deinstalliert, wie sich zeigt, als ich das noch einmal überprüfe:
11:29:36.61 d:\TEMP\h20pro >> adb shell ps | grep hx 11:29:43.86 d:\TEMP\h20pro >> adb shell ps | grep mon root 1896 2 0 0 kthread_worker_fn 0 S [psimon] 11:29:45.64 d:\TEMP\h20pro >> adb shell pm list packages -s hx 11:29:49.71 d:\TEMP\h20pro >> adb shell pm list packages -s -u hx package:com.hx.autotesttool package:com.hx.httpspeedtest package:com.hx.usermanual package:com.hx.guardservice package:com.hx.devicemonitor package:com.hx.update package:com.hx.appcleaner package:com.hx.mboxlauncher package:com.hx.httpvideotest package:com.hxdevicetest package:com.hx.videotest package:com.hx.apkbridge
Irgendetwas ist daran doch seltsam... spinnt die Anzeige in Einstellungen / Apps ? Nachdem ich die APK umbenannt habe,
android_tv_box:/system/priv-app/HXDeviceMonitor # mv HXDeviceMonitor.apk HXDeviceMonitor.xxx
taucht die App nicht mehr in der Liste unter Einstellungen / Apps auf, weder als HXDeviceMonitor, noch als com.hx.devicemonitor.

Scheinbar orientiert sich der Einstellungsdialog nach den Dateien, die sich unter /system/app und /system-priv-app befinden und nicht an den laufenden Prozessen (für "Beenden erzwingen") oder den installierten Packages.

Ich gehe also davon aus, das HXDeviceMonitor nicht lief, sondern nur falsch angezeigt wurde. Das Umbenennen hat übrigens nicht daran geändert, dass weiterhin die Malware versucht, seinen Command-and-Control-Server zu kontaktieren. Nebenbei erwähnt: das tut er auch, wenn man die Box mit der Fernbedienung in den Standby geschaltet hat, was sie durch einen schwarzen Bildschirm und eine rote LED anzeigt. Die Malware funkt im Hintergrund fröhlich weiter.

Nachdem ich alle Apps deinstalliert habe, die mir halbwegs suspekt oder überflüssig vorkamen, läuft die Box zwar zu meiner Überraschung noch einwandfrei, aber die Malware leider auch. Ich wüsste nicht, was ich noch deinstallieren könnte.

Fazit: Teilerfolg

Leider konnte das Ziel, die Malware von der H20pro Box komplett zu entfernen, wie schon bei der H20 Box nicht erreicht werden. Die Desinfektionsanleitung der anderen Sicherheitsforscher (7, 8) sind inzwischen veraltet, so einfach bekommt man die Malware nicht mehr vom System. Die versteckt sich - so hat es den Anschein - mittlerweile nicht mehr einfach in einer App, die man deinstallieren könnte, sondern tief im System.

Das vorliegende Dalvik Android 10 System (Build QP1A.191105.004) nutzt die Zygote-Architektur, die es schwierig macht, die App mit der Malware ausfindig zu machen:



Beim Systemstart wird der Zygote-Prozess gestartet, der wiederum System Server startet. Dies war ja auch die Prozess-Signatur bei den abgesetzten POST-Requests der Malware. Irgendwo da drin muss sich der Code der Malware befinden. Auch, dass die Malware während des Standby-Modus immer noch POSTs absetzt, spricht dafür, dass sie tief im System steckt, denn eigentlich sollte dann normale Apps ruhen.

Ein Teilerfolg verbuche ich, weil Damit könnte ich die H20pro eigentlich wieder in Betrieb nehmen, aber ein gutes Gefühl hätte ich nicht dabei, denn man weiß ja nie, ob man nicht doch eine Kleinigkeit übersehen hat.

Wie sind die Warn-Mails vom BSI zu bewerten?

Rufen wir uns die e-mail von meinem Provider noch einmal in Erinnerung, die die Sache losgetreten hat:
Sicherheitsinformation zu Ihrem Internetanschluss

Sehr geehrte Damen und Herren.

Wichtiger Sicherheitshinweis vom Vodafone-Sicherheitsteam zu Ihrem Produkt vom 21.12.2024.

Ihre Kundennummer: 123456789

Es liegen uns Hinweise vor, dass an Ihrem Internetzugang mindestens ein internetfähiges Endgerät (z.B. Smartphone, Tablet, CTV-Box) mit der Schadsoftware Badbox infiziert ist. Ihr Endgerät ist somit Teil eines weltweiten Bot-Netzes und wird von Kriminellen für deren Zwecke missbraucht.

Detaillierte Hinweise, die uns zu Ihrem Anschluss vorliegen, können Sie über https://kundensicherheit.vodafone.de/ABCD12 abrufen.

Wie konnte es dazu kommen? Badbox wird während der Produktion oder unmittelbar danach in der Firmware des Geräts installiert. Das Gerät ist bereits infiziert, wenn es bereits gekauft wurde.

Badbox ist eine Android Schadsoftware, die mit der Firmware des Geräts ausgeliefert wird. Infizierte Geräte verbinden sich unverzüglich mit einem Command-and-Control (C2) Server und ermöglichen den Angreifern Zweifaktor Schlüssel abzufangen, weitere Schadsoftware zu installieren sowie Zugriff auf das Netzwerk, in dem sich das infizierte Gerät befindet (Proxy), zu erhalten.

Was muss ich jetzt machen?

Infizierte Geräte sollten sofort außer Betrieb genommen werden, da die Schadsoftware auf einer nicht beschreibbaren Partition der Firmware befindet und durch den Endverbraucher nicht entfernt werden kann.

...
Nach all den Analysen und Recherchen, die ich diesbezüglich in den letzten Wochen durchgeführt habe, kann ich sagen, dass die e-mail im Prinzip gut verfasst ist. Sie erwähnt das Wesentliche in allgemein verständlicher Sprache für den Otto-Normalverbraucher, ohne mit all zuviel Fachbegriffen zu verwirren.

Das mit dem Proxy kann ich nicht nachvollziehen. Bei mir hat die Box keine Ports aufgemacht, auf denen es im LAN erreichbar wäre (außer natürlich den Ports für ADB, wenn das eingeschaltet ist). Zudem ist der Vodafone-Router ja an sich auch eine Hardware-Firewall, die keine Anfrage von draußen aus dem Internet entgegen nimmt. Es sei denn, man hätte explizit ein Port-Forwarding eingerichtet.

Und das Laien das Gerät am besten außer Betrieb nehmen ist wohl auch wahr. Genauso wie, dass die Malware nicht von Endverbrauchern entfernt werden kann.

Die e-mail bietet Stichwörter, nach denen man googlen kann, um sich näher zu informieren und Links am Ende, zum Beispiel auf (29), um mehr Informationen zu dem Thema abzurufen.

Dass das BSI (bzw. das Fraunhofer-Institut für Kommunikation, Informationsverarbeitung und Ergonomie, FKIE (30)) ein Sinkhole eingerichtet hat und die Zugriffe der Malware protokolliert, um so die Box-Besitzer über den Provider zu informieren, ist eine effiziente Maßnahme, damit die Malware-infizierten Boxen vom Netz kommen. Außerdem wird bei Sinkholes nichts Unnötiges mitprotokolliert. Eben nur, dass eine bestimmte IP (die des Besitzers der Box) versucht hat, eine bestimmte Domain (die des Malware-Betreibers) zu erreichen. Datensparsamkeit ist also gegeben.

Ich würde sagen: Das Ziel, die Netzinfrastruktur Deutschlands zu schützen, wurde erreicht. Und die ergriffenen Maßnahmen adäquat. Denn jedes einzelne Endgerät, dass durch Klick-Betrug, Spam- und Phishing-Mails und anderen Betrügereien Geld in die Kassen der Betrüger spült, ist eines zu viel. Diese Leute werden erst aufhören, wenn sich ihre Betrügereien nicht mehr lohnen.

Falls ein anderer Sicherheitsforscher es geschafft haben sollte, die Malware, von der hier die Rede ist, von einer H20 oder H20pro Box restlos zu entfernen, möge er sich bitte per e-mail bei mir melden. Danke.



Quellen, Literaturverweise und weiterführende Links