Android-Analyse der von AliExpress gekauften TV-Box H20 mit Badbox-Malware

Weblog vom 09.01.2025: Android-Analyse der von AliExpress gekauften TV-Box H20 mit Badbox-Malware
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, NHG47K


Wie in meinem vorhergehenden Artikel erwähnt, habe ich mir zwei Android-TV-Boxen auf AliExpress gekauft und bekam dann irgendwann eine Warn-e-mail von meinem Provider Vodafone, die mir mitteilte, dass irgendwas bei mir mit der Badbox-Malware infiziert sei und Schindluder im Internet treibt.

Mein Verdacht fiel auf die "üblichen Verdächtigen": Billig-Produkte als China und da hatte ich gleich die beiden TV-Boxen H20 und H20 pro im Sinn. Da dank BSI-Sinkhole zur zeit nicht viel passieren kann, hängte ich das H20 pro wieder ans Internet und beobachtete weiter. Es traten keine Vorfälle mehr auf und damit stand fest: Die mails kamen wegen dem H20 und nicht wegen des H20 pro.

Welche meiner TV-Boxen ist "böse" und wie finde ich das heraus?

Damit hätte ich die H20 entsorgen, die H20 pro weiterverwenden und das Kapitel schließen können. Hätte. Denn natürlich weckt sowas in mir meinen Forschergeist und ich wollte der Sache doch ein wenig mehr auf den Grund gehen. Herausfinden, wie ich ohne Warn-Mails herausfinde, dass die Tv-Box infiziert ist. Und zudem sichergehen, dass die H20 pro nicht doch auch irgendwie infiziert ist. Mein Misstrauen wurde geweckt.

The good, the bad and the ugly

Besonders hübsch sind beide Boxen nicht, aber hässlich (ugly) würde ich sie auch nicht nennen. Aber eine war böse und eine gut, zumindest laut der Warn-mails vom BSI. Die H20 habe ich gleich einmal in der Firewall meines Routers ausgeschlossen, so dass die nicht mehr ins Internet kommt, selbst wenn sie sich die WLAN-Credentials irgendwo gespeichert haben sollte. Das kann ich dann später zum Zwecke von Tests wieder zeitweilig aufheben, wenn ich mir noch den Internet-Traffic anschauen will.

Doch erstmal will ich schauen, ob man auf der Android-Oberfläche Unterschiede zwischen der H20 (bad) und H20 pro (good) erkennen kann.

H20 (bad, wohl mit Badbox infiziert)H20 pro (good, wohl sauber lt. BSI-mails)


Komischerweise hat die Badbox, also die H20 keine Seriennummer und zeigt dort nur "unknown" an.


Die Badbox zeigt beim Gerätenamen und dem Modell "H20" an, die Goodbox "android_tv_box". Bei Kernel-Version finden wir bei der Badbox "hxws@gxt #92". Was das bedeuten soll, ist schleierhaft- HXWS war mal ein Android Smartphone-Hersteller und unter GXT werden eher Gaming-Mäuse verkauft.

Und der Angabe des Builds verweist bei beiden Boxen wieder auf hxws und liest sich auch recht seltsam mit "userdebug 10" und "test-keys".

Bei der Badbox steht außerdem "NHG47K". Lauft Sicherheitsforschern (9, 10) soll "NHG47K" auf die Vo1d Malware hinweisen und in den Android-Versionen 7.1.2, 12.1 und 10.1 vorkommen, die AOSP (Android Open Source Project) Versionen sind. Diese sind besonders einfach und kostengünstig anzupassen. Über 1.3 Mio. TV Boxen sollen laut Dr.Web (11) in 200 Ländern damit infiziert sein.


Auf beiden Geräten ist eine "HX[chin.]"-App installiert, die sich zu "HX-Testgerät" übersetzt. Sie ist wohl nicht gefährlich. Die sonst noch verdächtige App komplett in chinesisch übersetzt sich zu "Google Pinyin-Eingabemethode", ist nur auf der Badbox installiert, aber wohl auch ungefährlich, denn sie dient der Eingabe von chinesischen Zeichen durch Wischen über die Tastatur.


Mehr können wir auf der Oberfläche von Android nicht erfahren. Wo wir gerade dabei sind, schalten wir dort das ADB-Debugging im Entwicklermodus frei, um später noch ein wenig näher auf die installierten Dateien zu schauen.

Malware Android.Vo1d

Das Vorhandensein von "NHG47K" im Build lässt also auf die Vo1d (zur Tarnung mit einer eins statt einem kleinen L) Malware schließen.

Die Infektionsmerkmale sind laut Dr.Web: Dadurch wird jedesmal, wenn das Betriebssystem startet, die Malware, die unter /system/xbin/vo1d und /system/xbin/wd liegt, mitgestartet. Und das sogar 3-fach-redundant. Um sicherzugehen, dass die Malware auch läuft, überwacht "Vo1d" (Identifier Android.Vo1d.1) die "wd-"-Komponente (Identifier Android.Vo1d.3) und startet sie automatisch neu, sollte sie aus irgendeinem Grund beendet werden.

Die "wd-"-Komponente installiert dann auf Befehl des Command-and-Control-Servers weitere Malware und installiert den Dämon (Identifier Android.Vo1d.5), in diesem Fall eventuell Badbox und führt diesen aus.

Als Netzwerk-Indikatoren werden außerdem folgende Domains genannt:

Das globale Ausmaß der Malware-Verbreitung

Die Untersuchung von Doctor Web hat gezeigt, dass das Backdoor-Programm Android.Vo1d knapp 1.300.000 Geräte in fast 200 Ländern infizierte. Am stärksten betroffen waren Nutzer in Brasilien, Marokko, Pakistan, Saudi-Arabien, Russland, Argentinien. Ecuador, Tunesien, Malaysia, Algerien und Indonesien.

Das ist schon eine Hausnummer. Doch damit nicht genug. Laut wired (6) haben Sicherheitsforscher auch Malware bei den folgenden TV-Boxen gefunden: Als Netzwerk-Indikator wird die Domain flyermobi.com genannt.

Und das H20 und wahrscheinlich viele andere günstige TV-Boxen aus China können sich in diese Liste einreihen. Die Namen, unter denen die TV-Boxen verkauft werden, sind zahlreich und es kommen immer wieder neue hinzu, auch wenn die Innereien oft die Gleichen sind. Oft sind AllWinner T95, AllWinner T95Max, RockChip X12-Plus, and RockChip X88-Pro-10 verbaut.

Und alle treiben reichlich Unfug im Internet: Angefangen mit dem verdeckten anklicken von Werbe-Banner, um damit Werbeeinnahmen zu generieren, über das Anlegen von Whatsapp, Google Mail und anderen Mailkonten, um damit Spam und Phishing-Mails und -Nachrichten abzusetzen. Bis hin zu allem Möglichen, denn es lässt sich angepasste, neue Malware vom C&C-Server nachladen und installieren.

Es gibt sogar Anbieter, die Botnetze vermieten. Eine chinesischer Anbieter behauptet von sich, über 20 Millionen Geräte infiziert zu haben, von denen jederzeit ca. 2 Mio. online sind. So lassen sich die infizierten Geräte im Prinzip von jedem, der dafür bezahlt mieten und missbrauchen, etwa für eine DDOS-Attacke. Technisches Know-How ist dafür nicht notwendig.

Aber nicht nur TV-Boxen, also Hardware, ist betroffen: Die Malware wird auch als Android-App verteilt. Man sollte also aufpassen, was man sich auf dem Smartphone installiert. Sicherheitsforscher haben festgestellt, (16, 17) dass es auch im vermeintlich als sicher angesehenen offiziellen Google Play-Store vor Malware wimmelt: 600 Millionen mal wurde Malware von Google Play in 2023 heruntergeladen, davon 1.5 Millionen mal chinesische Spyware.

Versuch der Identifizierung der Vo1d-Malware-Files

Leider habe ich es zuerst nicht geschafft, mit dem ADB Debugging Tool per USB auf die Boxen zuzugreifen - später dann doch, dazu unten mehr. Dazu braucht es normalerweise ein USB A zu USB Kabel, was man sich mit einem USB A zu USB C Kabel und USB C zu USB A Adapter zusammenstecken kann. Mein USB-Kabel-Tester zeigt auch an, dass alle, auch die Daten-Pins verbunden sind, aber leider wird nur ein treiberloses unbekanntes Gerät unter Windows gefunden. Auch der ADB-USB-Universal-Treiber fand das Gerät nicht, wobei es bei meinem Xiaomi Android Smartphone keine Probleme hatte.

Also habe ich über eine APK einen Filemanager, genauer gesagt den TotalCommander, installiert und mir damit die System-Files direkt auf dem H20 angesehen. Doch dort gab es kein Verzeichnis namens /system/xbin/vo1d, /system/xbin/wd, /system/bin/debuggerd oder /system/bin/debuggerd_real. Und auch die Datei daemonsu scheint ganz normal zu sein, zumindest hat VirusTotal nichts finden können.

Ich habe es also mit einer Malware zu tun, die sich auf andere Weise tarnt und selbst startet. Vielleicht auch nicht direkt die Vo1d-Malware, sondern eine andere, die dann die Badbox-Malware, oder eine, die sich wie Badbox verhält, nachinstalliert. Nur welche?

Während ich auf der H20-Badbox in die System-Verzeichnisse /system/bin und /system/xbin hereinkomme und sie mir anschauen kann, gelingt mir dies auf der H20-pro (Goodbox) nicht. Das spricht dafür, dass ich Root-Rechte auf der H20 habe, die ganze TV-Box also mit Root-Rechten arbeitet.

Was findet ein Virenscanner?

Dann kam ich auf die Idee, ein Antivirus-Programm auf der Android TV-Box zu installieren, um die nach verdächtigen Files scannen zu lassen, die ich mir dann genauer anschauen könnte. Mein erster Versuch war Anti-Virus Dr.Web Light. Hier fand ich wenigstens die APK-Datei zum Download beim Hersteller. Allerdings machte sich die Software nicht gut. Auf meinem Smartphone beendete sie sich immer nach ein paar Sekunden von selbst. Und auf der TV-Box kam nur eine Meldung, ich solle mir die Vollversion kaufen, die Light-Version würde nicht auf TV-Boxen laufen.

Bei anderen fand ich nicht mal eine herunterladbare APK beim Hersteller, sondern nur Verweise in den Google Play Store. Was denken sich die Antivirus-Hersteller nur? Ist denen nicht klar, dass man vielleicht ein Gerät untersuchen will und gerade nicht ins Internet (und lokale Netzwerk) will, weil man den Verdacht auf Malware hat? So ist man ja gezwungen, das vermeintlich kompromittierte Gerät ins Internet zu lassen, wo es dann unter Umständen auch gleich Unsinn anstellt.


Auf der Goodbox (der H20 Pro) habe ich über den Google Play Store Dr. Web Security Space installieren können und einen schnellen als auch einen vollständigen Scan durchführen können. Es gab zwar Probleme beim Herunterladen der 14-Tage-Demo-Lizenz, aber die Scans gingen dann gnädigerweise trotzdem. Normalerweise scheint das ein Kaufprogramm zu sein. Auf der Goodbox wurde damit keine Malware gefunden. Hier scheint alles gut. Dr. Web Security Space kann man dann übrigens auch wieder als APK herunterladen.


Was ich auch getan habe, um damit die BadBox zu scannen. Allerdings war es mir damit nicht möglich, eine 14-Tage-Test-Lizenz zu bekommen, selbst, als ich die Internet-Sperre wieder herausgenommen hatte. Ich musste die APK-Version wieder deinstallieren und auch hier in den Play Store, um dort unter Tools das Dr. Web Security Space herunterzuladen und zu installieren. Damit gelang mir dann auch ein Scan auf der Badbox (H20).

Der Schnell-Scan blieb ohne Fund. Und selbst der vollständige Scan kann nichts zu Tage fördern: Null Bedrohungen erkannt.

Im übrigen kann man hier sehen, dass die H20-pro doch ein gutes Stück schneller ist als die H20. Die H20-pro schafft 107086 Files in 4:13 Minuten, also 423 Files die Sekunde. Die H20 nur 63988 in 5:29 Minuten, was nur 194 Files/sec ist. Damit ist hier die H20-pro gut doppelt so schnell.

Trügerische Sicherheit durch Virenscanner



Ein gutes Beispiel für die trügerische Sicherheit eines Virenscanners: Es wird nichts gefunden und der Benutzer denkt, dass ja dann alles in Ordnung sein dürfte. So ist es aber nicht, wenn man den BSI-Mails Glauben schenken darf.

Ein Virenscanner auf der Ebene kann nur die Files auf dem Gerät scannen, auf etwas anderes hat es ja auch keinen Zugriff. Bei einem vollständigen Scan schaut er sich jeder einzelne File an, ob dort verdächtige Signaturen drin vorkommen.

Was aber, wenn die Malware sich auf Systemebene versteckt, ein so genanntes Root-Kit ist? Es war ja von einer speziellen Partition mit der Malware in der Pressemitteilung vom BSI die Rede. Die wird wohl zuerst gestartet und hat dann die Möglichkeit, heile Welt vorzuspielen, indem es nur "gesunde" Dateien auf der Hauptpartition anzeigt. So kann der Virenscanner nichts finden.

Um mir die Partitionen des Android-Systems anzuschauen, muss ich über ADB darauf zugreifen.

Analyse über ADB


Schließlich habe ich doch noch eine ADB-USB-Verbindung herstellen können. In den Entwickler-Optionen musste neben "USB-Debugging, Debugmodus bei Anschluss über USB" auch noch "USB settings, (dis)connect to Computer" eingeschaltet werden. Diese Option scheint sich bei jedem Neustart von selbst zurückzusetzen und muss jedes mal neu gesetzt werden.

Das zusammengesteckte USB-A-C-A-Kabel wie oben beschrieben funktionierte dann auch gut und zwar in beide Richtungen, also einmal den Adapter in die TV-Box eingesteckt und einmal in den USB-Hub am Computer.

Nun kann ich wieder einen Vergleich zwischen Goodbox und Badbox fahren, um weitere Auffälligkeiten zu finden.
ADB BefehlH20 (bad, wohl mit Badbox infiziert)H20 pro (good, wohl sauber lt. BSI-mails)


adb devices -l6UKR5FYF1W device product:H20 model:H20 device:H20 (Seriennummer war ja "unknown")
Irgendwie ist das Format des Gerätenamens dem Gefühl nach auffällig.
4c001071cnnnnnnnnnn device product:android_tv_box model:android_tv_box device:android_tv_box (entspricht der Seriennummer)
adb shell, sm ...>> adb shell
H20:/ # sm list-disks
H20:/ # sm list-volumes all
private mounted null
emulated mounted null

Hier lässt sich nichts an verdächtigen Datenträgern erkennen
>> adb shell
android_tv_box:/ $ sm list-disks
android_tv_box:/ $ sm list-volumes all
private mounted null
emulated mounted null
adb shell, cat /proc/partitionsmajor minor #blocks name 179 0 7634944 mmcblk0 179 1 4096 mmcblk0p1 179 2 8192 mmcblk0p2 179 3 4096 mmcblk0p3 179 4 1024 mmcblk0p4 179 5 15360 mmcblk0p5 179 6 12288 mmcblk0p6 179 7 12288 mmcblk0p7 179 8 32768 mmcblk0p8 179 9 65536 mmcblk0p9 179 10 131072 mmcblk0p10 179 11 16384 mmcblk0p11 179 12 4096 mmcblk0p12 179 13 2097152 mmcblk0p13 179 14 5222400 mmcblk0p14 179 32 4096 mmcblk0rpmb

Auch die Partionsübersicht gibt wenig Aufschluss über eine eventuell "versteckte" Partition
major minor #blocks name 1 0 8192 ram0 1 1 8192 ram1 1 2 8192 ram2 1 3 8192 ram3 1 4 8192 ram4 1 5 8192 ram5 1 6 8192 ram6 1 7 8192 ram7 1 8 8192 ram8 1 9 8192 ram9 1 10 8192 ram10 1 11 8192 ram11 1 12 8192 ram12 1 13 8192 ram13 1 14 8192 ram14 1 15 8192 ram15 254 0 744900 zram0 179 0 7634944 mmcblk0 179 1 32768 mmcblk0p1 179 2 16384 mmcblk0p2 179 3 32768 mmcblk0p3 179 4 2555904 mmcblk0p4 179 5 16384 mmcblk0p5 179 6 32768 mmcblk0p6 179 7 1310720 mmcblk0p7 179 8 16384 mmcblk0p8 179 9 16384 mmcblk0p9 179 10 16384 mmcblk0p10 179 11 16384 mmcblk0p11 179 12 16384 mmcblk0p12 179 13 512 mmcblk0p13 179 14 15872 mmcblk0p14 179 15 16384 mmcblk0p15 259 0 16384 mmcblk0p16 259 1 3469295 mmcblk0p17 179 48 512 mmcblk0rpmb 179 32 4096 mmcblk0boot1 179 16 4096 mmcblk0boot0 253 0 1791420 dm-0 253 1 201332 dm-1 253 2 56028 dm-2
adb shell, ... H20:/ # ls -l /system/xbin/v*
ls: /system/xbin/v*: No such file or directory

H20:/ # ls -l /system/xbin/w*
ls: /system/xbin/w*: No such file or directory


Keine Files, die auf die Vo1d-Malware hinweisen (/vo1d und /wd)

android_tv_box:/ $ ls -l /system/xbin/v*
ls: /system/xbin/v*: No such file or directory

android_tv_box:/ $ ls -l /system/xbin/w*
ls: /system/xbin/w*: No such file or directory

(per ADB habe ich nach "adb root" auch beim nicht gerootete H20pro auf dieRoot-Verzeichnisse Zugriff)
adb shell, ps 152 laufende Prozesse:
USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 7608 1272 ep_poll 0008f77c S /init root 2 0 0 0 kthreadd 00000000 S kthreadd root 3 2 0 0 smpboot_th 00000000 S ksoftirqd/0 root 4 2 0 0 worker_thr 00000000 S kworker/0:0 root 5 2 0 0 worker_thr 00000000 S kworker/0:0H root 7 2 0 0 smpboot_th 00000000 S migration/0 root 8 2 0 0 rcu_gp_kth 00000000 S rcu_preempt root 9 2 0 0 rcu_gp_kth 00000000 S rcu_bh root 10 2 0 0 rcu_gp_kth 00000000 S rcu_sched root 11 2 0 0 smpboot_th 00000000 S watchdog/0 root 12 2 0 0 smpboot_th 00000000 S watchdog/1 root 13 2 0 0 smpboot_th 00000000 S migration/1 root 14 2 0 0 smpboot_th 00000000 S ksoftirqd/1 root 15 2 0 0 worker_thr 00000000 S kworker/1:0 root 16 2 0 0 worker_thr 00000000 S kworker/1:0H root 17 2 0 0 smpboot_th 00000000 S watchdog/2 root 18 2 0 0 smpboot_th 00000000 S migration/2 root 19 2 0 0 smpboot_th 00000000 S ksoftirqd/2 root 20 2 0 0 worker_thr 00000000 S kworker/2:0 root 21 2 0 0 worker_thr 00000000 S kworker/2:0H root 22 2 0 0 smpboot_th 00000000 S watchdog/3 root 23 2 0 0 smpboot_th 00000000 S migration/3 root 24 2 0 0 smpboot_th 00000000 S ksoftirqd/3 root 25 2 0 0 worker_thr 00000000 S kworker/3:0 root 26 2 0 0 worker_thr 00000000 S kworker/3:0H root 27 2 0 0 rescuer_th 00000000 S khelper root 28 2 0 0 devtmpfsd 00000000 S kdevtmpfs root 29 2 0 0 rescuer_th 00000000 S netns root 30 2 0 0 worker_thr 00000000 S kworker/3:1 root 31 2 0 0 worker_thr 00000000 S kworker/0:1 root 32 2 0 0 worker_thr 00000000 S kworker/2:1 root 33 2 0 0 worker_thr 00000000 S kworker/1:1 root 34 2 0 0 console_th 00000000 S kconsole root 35 2 0 0 rescuer_th 00000000 S writeback root 36 2 0 0 rescuer_th 00000000 S bioset root 37 2 0 0 rescuer_th 00000000 S crypto root 38 2 0 0 worker_thr 00000000 S kworker/u9:0 root 39 2 0 0 rescuer_th 00000000 S kblockd root 40 2 0 0 hub_thread 00000000 S khubd root 41 2 0 0 ion_heap_d 00000000 S vmalloc root 42 2 0 0 irq_thread 00000000 S irq/65-rga root 43 2 0 0 rk_fb_wait 00000000 S fb-vsync root 44 2 0 0 kthread_wo 00000000 S rk-fb root 45 2 0 0 cpufreq_in 00000000 S cfinteractive root 46 2 0 0 rescuer_th 00000000 S rpciod root 62 2 0 0 watchdog 00000000 S khungtaskd root 63 2 0 0 kswapd_try 00000000 S kswapd0 root 64 2 0 0 ksm_scan_t 00000000 S ksmd root 65 2 0 0 fsnotify_m 00000000 S fsnotify_mark root 66 2 0 0 rescuer_th 00000000 S nfsiod root 67 2 0 0 rescuer_th 00000000 S cifsiod root 88 2 0 0 rescuer_th 00000000 S hdmi-200a0000.h root 90 2 0 0 irq_thread 00000000 S irq/63-20070000 root 92 2 0 0 rescuer_th 00000000 S dwc_otg root 93 2 0 0 rescuer_th 00000000 S uether root 94 2 0 0 rescuer_th 00000000 S kpsmoused root 95 2 0 0 irq_thread 00000000 S irq/90-tsadc root 96 2 0 0 rescuer_th 00000000 S rockchip_tsadc root 97 2 0 0 rescuer_th 00000000 S dm_bufio_cache root 98 2 0 0 rescuer_th 00000000 S dw-mci-card root 99 2 0 0 rescuer_th 00000000 S dw-mci-card root 100 2 0 0 rescuer_th 00000000 S dw-mci-card root 101 2 0 0 mmc_queue_ 00000000 S mmcqd/0 root 102 2 0 0 mmc_queue_ 00000000 S mmcqd/0rpmb root 103 2 0 0 rescuer_th 00000000 S binder root 106 2 0 0 rfcomm_run 00000000 S krfcommd root 109 2 0 0 ddrfreq_ta 00000000 S ddrfreqd root 110 2 0 0 rescuer_th 00000000 S dvfs root 111 2 0 0 worker_thr 00000000 S kworker/0:1H root 112 2 0 0 rescuer_th 00000000 S deferwq root 113 2 0 0 rescuer_th 00000000 S f_mtp root 114 2 0 0 sleep_thre 00000000 S file-storage root 115 1 2456 820 poll_sched 0008f81c S /sbin/ueventd root 123 2 0 0 kjournald2 00000000 S jbd2/mmcblk0p13 root 124 2 0 0 rescuer_th 00000000 S ext4-rsv-conver root 125 2 0 0 kjournald2 00000000 S jbd2/mmcblk0p10 root 126 2 0 0 rescuer_th 00000000 S ext4-rsv-conver root 130 2 0 0 kjournald2 00000000 S jbd2/mmcblk0p11 root 131 2 0 0 rescuer_th 00000000 S ext4-rsv-conver root 135 2 0 0 kjournald2 00000000 S jbd2/mmcblk0p14 root 136 2 0 0 rescuer_th 00000000 S ext4-rsv-conver root 137 1 3004 260 ep_poll 00057e00 S /sbin/healthd root 138 1 9088 1592 hrtimer_na aab211d0 S /system/bin/displayd root 139 1 4552 1416 ep_poll b57fa1a8 S /system/bin/lmkd system 140 1 4860 1596 binder_thr b182e2ec S /system/bin/servicemanager system 141 1 88736 5036 ep_poll b2d8c1a8 S /system/bin/surfaceflinger root 142 1 10812 2916 hrtimer_na b07871d0 S /system/bin/vold root 153 2 0 0 irq_thread 00000000 S irq/43-20020000 root 154 2 0 0 irq_thread 00000000 S irq/41-20020000 root 155 2 0 0 irq_thread 00000000 S irq/39-20030000 root 159 1 5080 1368 wait_for_m b3387108 S /system/bin/debuggerd root 173 159 5080 428 wait_for_m b338833c S debuggerd:signaller logd 175 1 13336 2404 sigsuspend ab4a84f0 S /system/bin/logd shell 177 1 3532 1216 n_tty_read a712533c S /system/bin/sh root 178 1 145436 2296 0 00066ad8 S /sbin/adbd root 183 1 7056 1196 hrtimer_na a8bd81d0 S /system/bin/log_service root 185 1 1550584 63948 poll_sched a7963394 S zygote audioserver 186 1 32028 6264 binder_thr b18ac2ec S /system/bin/audioserver cameraserver 187 1 55172 13568 binder_thr ae99e2ec S /system/bin/cameraserver drm 189 1 15760 5408 binder_thr b560d2ec S /system/bin/drmserver root 192 1 5092 1956 unix_strea b263a33c S /system/bin/installd keystore 193 1 7468 2592 binder_thr ab9f72ec S /system/bin/keystore mediacodec 194 1 23060 4844 binder_thr ae3622ec S media.codec media 195 1 37524 8180 binder_thr a88782ec S /system/bin/mediadrmserver mediaex 196 1 39536 5804 binder_thr aeba32ec S media.extractor media 197 1 63964 9280 binder_thr b23962ec S /system/bin/mediaserver root 198 1 20320 2284 binder_thr b5a992ec S /system/bin/netd root 200 2 0 0 kauditd_th 00000000 S kauditd system 201 1 7220 2064 binder_thr ab4e72ec S /system/bin/gatekeeperd root 202 1 4088 1372 hrtimer_na ac3e31d0 S /system/xbin/perfprofd root 203 183 3988 1296 wait_for_m b1db73dc S logcat root 242 1 3532 472 wait_for_m b03b8108 S daemonsu:mount:master root 282 1 4564 644 wait_for_m b03b8108 S daemonsu:master system 553 185 1704556 98920 ep_poll a79631a8 S system_server u0_a19 643 185 1101540 97208 ep_poll a79631a8 S com.android.systemui media_rw 677 142 7840 2240 inotify_re ab34d33c S /system/bin/sdcard root 732 2 0 0 rescuer_th 00000000 S cfg80211 u0_a10 832 185 967684 33896 ep_poll a79631a8 S com.google.android.ext.services root 883 2 0 0 sdio_irq_t 00000000 S ksdioirqd/mmc2 u0_a9 884 185 1039716 71788 ep_poll a79631a8 S com.google.android.gms.persistent system 906 185 967164 34100 ep_poll a79631a8 S com.example.changeled u0_a32 916 185 979476 44320 ep_poll a79631a8 S com.android.inputmethod.latin system 924 185 979860 39780 ep_poll a79631a8 S com.hx.appcleaner system 940 185 968164 34852 ep_poll a79631a8 S com.cghs.stresstest system 952 185 969204 34616 ep_poll a79631a8 S com.hxdevicetest system 971 185 967572 32668 ep_poll a79631a8 S com.hx.videotest u0_a40 1016 185 1038580 49248 ep_poll a79631a8 S org.cosinus.launchertv root 1073 2 0 0 down_inter 00000000 S WL_XMIT_THREAD root 1074 2 0 0 rescuer_th 00000000 S wl-workqueue root 1075 2 0 0 down_inter 00000000 S WLHALXT root 1076 2 0 0 down_inter 00000000 S WLHALXT system 1092 185 968092 35124 ep_poll a79631a8 S com.rockchip.devicetest system 1382 185 970084 37292 ep_poll a79631a8 S android.rockchip.update.service system 1430 185 1015976 52612 ep_poll a79631a8 S com.android.tv.settings u0_a49 1465 185 1005340 58708 ep_poll a79631a8 S com.drweb.pro u0_a49 1502 1465 3748 1008 unix_strea b6a843dc S 49 system 1791 185 969760 34008 ep_poll a79631a8 S com.hx.devicemonitor system 1911 185 972512 34860 ep_poll a79631a8 S com.hx.update system 1929 185 994472 43380 ep_poll a79631a8 S com.rockchips.mediacenter system 1960 185 988488 39212 ep_poll a79631a8 S com.rockchips.mediacenter:dmr_service root 2043 282 5596 684 wait_for_m b03b8108 S daemonsu:10046 u0_a49 2540 185 1017884 70764 ep_poll a79631a8 S com.drweb.pro:monitor u0_a49 2650 2540 3748 1008 unix_strea ae06c3dc S 51 root 3058 2 0 0 worker_thr 00000000 S kworker/u8:1 wifi 3064 1 8720 3404 poll_sched ac86d3ec S /system/bin/wpa_supplicant root 3094 2 0 0 worker_thr 00000000 S kworker/u9:1 root 3234 2 0 0 worker_thr 00000000 S kworker/u8:0 root 3254 178 3532 1268 sigsuspend ac3a94f0 S /system/bin/sh u0_a9 3274 185 976260 40508 ep_poll a79631a8 S com.google.process.gapps root 3303 2 0 0 worker_thr 00000000 S kworker/u9:2 root 3304 2 0 0 worker_thr 00000000 S kworker/u8:2 root 3326 3254 4512 1268 0 b0f4c33c R ps Es wäre eine Menge Arbeit, jeden Einzelnen der Prozesse darauf zu untersuchen, ob er legitim ist oder eventuell zu einer Malware gehört. Insbesondere weil die Malware-Entwickler gerne täuschen und tarnen.

227 laufende Prozesse, hier nicht nicht aufgelistet.

Die "normalen" Linux-Befehle zeigen also keine neuen Dinge, die auf eine Malware schließen würden. Ich versuche zum Schluss noch ein "adb bugreport h20", um zahllose weitere Informationen über das System zu sammeln, um genau zu sein, 6.7 MB. Diese nach Auffälligkeiten durchzuarbeiten ist eine Sisyphus-Aufgabe. Darum hier nur ein paar Dinge, die mir aufgefallen sind:
Build: H20-userdebug 10 NHG47K eng.hxws.20230928.160107 test-keys Build fingerprint: 'Android/hx322x_box/hx322x_box:7.1.2/NHG47K/hxws09281601:userdebug/test-keys' Bootloader: unknown Radio: (unknown) Network: (unknown) Kernel: Linux version 3.10.104 (hxws@gxt) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #92 SMP PREEMPT Thu Sep 28 15:58:44 CST 2023
Es wird wohl sinnvoller sein, sich den ausgehenden Internetverkehr der Badbox anzuschauen, als den Bugreport händisch durchzustöbern. Aber das ist eine andere Analyse, die ich hier verlinken werde, sobald ich sie gemacht habe.

Nachtrag 2025-01-10: weitere Ausprägung der Malware

Auf Github bin ich über die Analyse (8) von Daniel Milisic, Gründer von DesktopEcho, gestoßen, der eine Malware auf einem T95-H616-Android-System analysiert hat.

Betroffen sind lt. seiner Analyse die folgenden TV-Boxen mit folgenden SoC / Prozessoren:
  • T95 · AllWinner H616
  • T95Max · AllWinner H618
  • X12-Plus · RockChip 3328
  • X88-Pro-10 · RockChip 3328
Die Malware soll sich durch folgende Indikatoren identifizieren lassen:
  • Vorhandensein des Verzeichnisses /data/system/Corejava
  • Vorhandensein der Datei /data/system/shared_prefs/open_preference.xml
Und fürwahr - beide Dinge sind auf meiner Badbox H20 vorhanden, aber nicht auf der H20pro:
H20:/data/system/Corejava # ls -a -l total 32 drwxr-xr-x 3 system system 4096 1970-01-01 01:15 . drwxrwxr-x 16 system system 4096 1970-01-01 01:30 .. -rw------- 1 system system 40 1970-01-01 01:00 e.l drwxr-xr-x 2 system system 4096 1970-01-01 01:15 node
e.l ist eine binäre Datei mit 40 Bytes und das node-Verzeichnis ist leer.
H20:/data/system/Corejava # xxd -g 1 e.l 00000000: 00 00 00 00 00 02 26 07 00 00 00 00 00 00 00 00 ......&......... 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020: 00 00 00 28 00 00 00 00 ...(....
H20:/data/system/Corejava/node # ls -a -l total 16 drwxr-xr-x 2 system system 4096 1970-01-01 01:15 . drwxr-xr-x 3 system system 4096 1970-01-01 01:15 ..
Bei Milisics Infektion soll sich in /data/system/Corejava/node aber ein weiteres Verzeichnis mit einem Namen aus vielen Hexzeichen und den Dateien classes.dex, classes.png und config.make befinden (7, 8), die bei mir aber fehlen.

Vielleicht sind das noch Überbleibsel der früheren Version der Badbox-Malware, bei denen vergessen wurde, sie in der Firmware komplett zu löschen.

Ein weiteres Feld, in denen man nach der Malware suchen könnte, sind die installierten Pakete. Dies sind auf meiner H20 TV-Box die folgenden, wobei ich ein paar fett markiert habe, die vielleicht aus dem Rahmen fallen.
H20:/data/system/Corejava/node # pm list packages package:com.android.cts.priv.ctsshim package:com.google.android.ext.services package:com.example.changeled package:com.android.providers.calendar package:com.android.tv.settings package:com.android.providers.media package:com.google.android.onetimeinitializer package:com.google.android.ext.shared package:com.dd.bugreport package:com.uptodown (von mir installiert) package:com.android.documentsui package:com.android.gallery package:com.android.externalstorage package:com.android.htmlviewer package:com.ghisler.android.TotalCommander package:com.hx.guardservice package:com.android.providers.downloads package:com.android.providers.tv package:org.cosinus.launchertv (von mir installierter Simple TV Launcher) package:com.google.android.configupdater package:com.android.inputmethod.pinyin package:com.android.defcontainer package:com.android.providers.downloads.ui package:com.android.vending package:com.android.pacprocessor package:com.android.certinstaller package:android.rockchip.update.service package:android package:com.android.rockchip package:com.android.backupconfirm package:com.android.statementservice package:com.hx.devicemonitor package:com.android.providers.settings package:com.android.sharedstoragebackup package:com.rockchip.devicetest package:com.android.printspooler package:com.charon.rocketfly package:com.rockchips.mediacenter package:com.android.dreams.basic package:com.android.inputdevices package:com.google.android.webview package:com.rockchip.wfd package:com.google.android.syncadapters.contacts package:com.android.keychain package:com.android.chrome package:com.teamsmart.videomanager.tv package:com.google.android.gms package:com.google.android.gsf package:com.google.android.partnersetup package:com.android.packageinstaller package:com.svox.pico package:com.hx.update package:org.xbmc.kodi (von mir installiert) package:com.android.proxyhandler package:com.android.inputmethod.latin package:com.google.android.feedback package:com.google.android.syncadapters.calendar package:com.hx.appcleaner package:com.google.android.gsf.login package:com.android.wallpaper.livepicker package:com.hx.rcs package:com.cghs.stresstest package:org.mozilla.firefox package:com.hx.mboxlauncher package:com.google.android.backuptransport package:com.android.settings package:com.android.calculator2 package:com.android.cts.ctsshim package:com.hxdevicetest package:com.drweb.pro (von mir installiert) package:com.android.vpndialogs package:com.hx.videotest package:com.android.music package:com.android.shell package:com.android.wallpaperbackup package:com.android.providers.userdictionary package:com.android.location.fused package:com.android.systemui package:com.android.bluetooth package:com.android.providers.contacts package:com.android.captiveportallogin

Zusammenfassung Android Analyse

Die Badbox-Malware auf meiner H20 TV-Box kann also durch folgende Eigenschaften des Android identifiziert werden:
  • "NHG47K" taucht in der Build-Angabe unter Info in der Android Oberfläche unter Einstellungen auf
  • Rootrechte, Zugriff auf z. B. die System-Verzeichnisse /system/bin und /system/xbin mit File-Manager wie TotalCommander
  • Vorhandensein des Verzeichnisses /data/system/Corejava
  • Vorhandensein der Datei /data/system/shared_prefs/open_preference.xml


Hier geht es weiter zur Analyse des Netzwerk-Verkehrs der Badbox.



Quellen, Literaturverweise und weiterführende Links