De onzichtbare passagier in je auto: De eerste Android-malware voor automotive head units
Belangrijkste bevindingen
- We hebben nieuwe Android-malware geïdentificeerd: een multi-stage downloader waarvan het uiteindelijke doel advertentiefraude en het creëren van een proxy-botnet is.
- De malware verspreidde zich via de ingebouwde updaters van Android-gebaseerde firmware voor automotive head units. Dit is het eerste gedocumenteerde geval van malware op een head unit van een auto met een infectieketen die specifiek is voor dit type apparaat.
- We schrijven deze activiteit met een hoge mate van zekerheid toe aan de MoYu Group, een actor die gelinkt is aan het BADBOX-botnet.
Kaspersky-oplossingen detecteren de hieronder beschreven dreigingen onder de volgende namen:
HEUR:Trojan-Dropper.AndroidOS.Agent.vuHEUR:Trojan-Downloader.AndroidOS.Agent.ovHEUR:Trojan-Proxy.AndroidOS.Zhima.*HEUR:Trojan.AndroidOS.Vo1d.*
Overzicht van head unit-firmware
Een head unit is een systeem dat multimediafuncties combineert met gedeeltelijke controle over bepaalde voertuigfuncties. Head units kunnen deel uitmaken van de fabrieksapparatuur van een auto of als aftermarket-upgrade worden toegevoegd. De belangrijkste aanvalsvectoren voor deze systemen zijn compromittering via fysieke toegang en kwetsbaarheden in het besturingssysteem of de componenten van de head unit.
In sommige gevallen draaien head units op Android, voornamelijk omdat dit handig is voor fabrikanten: de broncode van Android houdt al rekening met use-cases binnen automotive head units. Android stelt fabrikanten bovendien in staat om hun eigen systeemapplicaties toe te voegen tijdens het buildproces, die ze kunnen gebruiken voor diverse doeleinden: het aanpassen van de UI, het toevoegen van systeemscomponenten die zijn afgestemd op de behoeften van de leverancier, en meer.
De meeste apps die voor Android-apparaten zijn ontwikkeld, kunnen ook draaien op een Android-gebaseerde head unit, en dat geldt ook voor malware. Desondanks is het moeilijk voorstelbaar dat bepaalde categorieën malware die op smartphones zijn gericht, worden gebruikt om een head unit aan te vallen. Banking Trojans zijn een goed voorbeeld: aangezien mobiel bankieren bijna uitsluitend op smartphones wordt gebruikt, zou het infecteren van een head unit met een banking Trojan een verspilling van de middelen van de aanvaller zijn.
Het is vermeldenswaardig dat head units vaak SIM-kaartsleuven bevatten en verbinding kunnen maken met internet, wat functies zoals navigatie en software-updates mogelijk maakt. Aangezien een head unit doorgaans niets van waarde voor een aanvaller bevat, is een van de waarschijnlijkere aanvalscenario's met "klassieke" Android-malware het infecteren van het apparaat om het te rekruteren in een botnet – vergelijkbaar met aanvallen op IoT-apparaten.
Tijdens ons onderzoek vonden we precies dit soort malware. Het ontwerp van de firmware voor DoFun head units stelde aanvallers in staat om malware te verspreiden. We hebben de leverancier op de hoogte gesteld van het distributieschema, waarna zij meldden de beveiligingsproblemen te hebben opgelost.
De TWCore-app
TWCore is een legitieme systeemapplicatie die verantwoordelijk is voor het verzamelen van analysedata en het bijwerken van de software van de head unit.
Het updateproces is vrij eenvoudig. Een MQTT-berichtbroker, gehost op het subdomein cardoor[.]cn, stuurt een bericht met informatie over de APK-bestanden die moeten worden gedownload en geïnstalleerd op de head unit. Opvallend is dat het object dat dit bericht beschrijft een installNotExists-veld bevat, een Boolean-vlag die op true of false kan worden gezet. Deze vlag stelt TWCore in staat om apps te installeren die oorspronkelijk niet op het apparaat aanwezig waren. TWCore controleert alleen of een app al op het apparaat is geïnstalleerd wanneer installNotExists = false.
Het APK-bestand wordt gedownload naar <TWCore external cache dir>/push/apk/ voor installatie. Onze telemetrie onthulde eerder onbekende malware op deze bestandspaden. Bovendien wijzen onze gegevens erop dat in elk waargenomen geval de malware werd geïnstalleerd door een app met de pakketnaam com.tw.core, wat overeenkomt met de pakketnaam van TWCore.
Stap 1: de JarService-dropper
JarService is een kleine dropper-app zonder enige gebruikersinterface. Het ontsleutelt data die als versleutelde blokken in de code van de Trojan zijn opgeslagen. Elk blok is XOR-versleuteld met een single-byte sleutel die lineair verschuift van blok naar blok. De ontsleutelde data bevat geserialiseerde informatie over de versie van de payload en het toegangspunt, samen met de eigen code van de malware voor verdere loading.
In de versie van JarService die we analyseerden, was het toegangspunt voor de payload van de volgende fase de wa-methode van de com.c.j.qbh-klasse.
Stap 2: de loader
De payload van deze fase is een kwaadaardige loader. De code bevat versleutelde strings die later als klassenamen worden gebruikt om de payload van fase 3 uit te voeren via het reflectiemechanisme. De loader stuurt informatie over het implantaat naar een van de servers van de aanvallers via een POST-verzoek.
Voorbeeld van een verzoek aan de C2-server:
{
"userId": "REDACTED",
"dexVersion": "1.7",
"dexType": 1,
"channelId": "2039",
"packageName": "com.tw.jar1",
"appVersion": 12,
"appName": "JarService"
}
Als reactie op het POST-verzoek stuurt de C2-server een link terug voor het downloaden van de payload van fase 3. Een voorbeeld van een C2-respons:
{
"code": 200,
"data": {
"dexUrl": "hxxp://144.217.243[.]201/vr34der34/dex3.68.png",
"dexVersion": 3.680,
"status": 0
}
}
De Trojan gebruikt de link in het dexUrl-veld om geserialiseerde data te downloaden voor het laden van de volgende fase. Deze data begint met een single-byte integer, een sleutel die wordt gebruikt om de strings in de code van de loader te ontsleutelen. Direct daarna volgt een floating-point waarde van vier bytes die wordt gebruikt om de payload van fase 3 via XOR te ontsleutelen.
In de ontsleutelde payload is het toegangspunt de init-methode van de com.ast.sdk.BillingMain-klasse. Tijdens de analyse merkten we op dat de downloadlink voor de volgende payload een versienummer bevat. Door andere versienummers te proberen, verkregen we zeven verschillende varianten. De vroegste versie (3.57) gebruikt een ander decodeeralgoritme, wat kan wijzen op een eerdere versie van de infectieketen met een andere loader tussen JarService en fase 3.
Stap 3: clicker / reverse proxy loader
In deze fase stuurt de malware standaard elke 90 minuten een POST-verzoek naar /cpc/api/task. Dit verzoek bevat informatie over het geïnfecteerde apparaat (schermresolutie, model, SSID van het verbonden wifi-netwerk, MAC-adres, etc.) samen met de configuratieversie van de Trojan. Als de configuratie verouderd is, stuurt de C2-server een bijgewerkte configuratie terug met nieuwe C2-adressen en nieuwe paden voor HTTP-verzoeken.
Voorbeeld van een configuratierespons:
{
"code": 100,
"data": {
"configVersion": 3.820,
"hosts": ["hxxp://t2.kshahnd[.]sbs", "hxxp://t2.mdsjhd[.]sbs", "hxxp://t2.nmnsny[.]sbs", "hxxps://t2.nmnsny[.]sbs"],
"interval": 5500000,
"reportApi": "/cpc/api/report",
"tagName": "config",
"taskApi": "/cpc/api/task",
"updates": ["hxxp://a2.kshahnd[.]sbs", "hxxp://a2.mdsjhd[.]sbs", "hxxp://a2.nmnsny[.]sbs", "hxxps://a2.nmnsny[.]sbs"],
"vn": 1.010
}
}
Als de configuratie niet hoeft te worden bijgewerkt, stuurt de C2-server in plaats daarvan integer-commando-identificatoren terug, die de aanvallers aanduiden als productId. De Trojan koppelt elke identificator aan commando-informatie, die als een geserialiseerd JSON-object wordt opgeslagen via de SharedPreferences API. Als de C2-respons een onbekende of verouderde productId bevat, stuurt de malware een GET-verzoek naar /cpc/api/xml om de inhoud van deze commando's op te halen.
Lijst met uitvoerbare commando's
Ten tijde van ons onderzoek hadden de aanvallers negen commando's geïmplementeerd. De functionaliteit suggereert dat de malware kan worden gebruikt om advertenties te tonen, advertentiefraude te plegen (als clicker) en aanvullende kwaadaardige code te downloaden.
| Commando | Beschrijving | Argumenten |
|---|---|---|
return | Retourneert een waarde uit SharedPreferences. | key: de sleutel waarvan de waarde moet worden geretourneerd |
copy | Stelt de inhoud van het klembord in. | text: de sleutel uit SharedPreferences; url: optionele link voor gzip-data |
http | Maakt een POST/GET HTTP-verzoek en slaat eventueel de respons op. | url, method (opt.), startLabel (opt.), endLabel (opt.), valueLabel (opt.), header (opt.), content (opt.) |
web | Opent een link in de WebView en voert willekeurige JavaScript-code uit. | url, js (base64-encoded), corejs (opt.), param, client, time |
loadlib | Niet volledig geïmplementeerd tijdens dit onderzoek. | – |
loadlib2 | Downloadt en voert willekeurige code uit. | url, name, md5, clear (opt.), params, className, method, cmethod (opt.), thread, reload |
loadlib3 | Niet volledig geïmplementeerd tijdens dit onderzoek. | – |
deeplink | Opent een resource in de browser. | url: link naar de resource |
traceroute | Controleert de beschikbaarheid van resources via ICMP ping. | host: lijst met resources |
In real-world aanvallen gebruiken de aanvallers slechts een klein deel van deze commando's. Op dit moment worden vooral loadlib2 en http gebruikt. De payload die via loadlib2 wordt gedownload is een reverse proxy-module genaamd "zhima". Dit bevestigt dat het uiteindelijke doel het bouwen van een proxy-botnet is.
Toeschrijving
Tijdens de analyse van de infectieketen merkten we op dat de loader van fase 2 een thread aanmaakte met de naam mosdk-host-loader. Onderzoek naar "mosdk" leidde ons naar een kwaadaardige app op diverse TV-settopboxen met de pakketnaam com.abc.nexus. Deze app bevat componenten om de rekenkracht van het apparaat heimelijk te monetiseren. De service die de lanceercode bevat voor de JarService-achtige dropper heet AdmoyuService.
Op basis van deze naamgeving en de overlap in netwerkinfrastructuur schrijven we deze activiteit met een hoge mate van zekerheid toe aan de MoYu Group, een actor die gelinkt is aan het BADBOX-malwareplatform.
Daarnaast ontdekten we dat het domein admin.uipoxy[.]com resolveerde naar een C2-server voor de zhima-module. Op dit domein bevindt zich een admin-paneel voor de malware-operator. Tijdens de registratie worden gebruikers verwezen naar gebruiksvoorwaarden en privacybeleid op het domein pxyedge[.]com (een leverancier van residentiële proxies) en wordt er verwezen naar proxyforu[.]com (eveneens een proxy-leverancier). De overeenkomsten in de authenticatie-API's tussen deze sites versterken de link met de MoYu Group.
Conclusie
Ondanks pogingen om het BADBOX-botnet op te ruimen, blijven individuele actoren gelinkt aan dit netwerk actief. De methoden voor distributie variëren van pre-installed backdoors tot geïnfecteerde IPTV-apps. Deze casus toont een nog geavanceerdere methode: distributie via de legitieme updatefunctionaliteit van een systeemapplicatie. Bovendien breiden aanvallers zich uit naar nieuwe platforms. Deze malware is de eerste bekende kwaadaardige app die head units target, wat betekent dat deze systemen nu ook bescherming tegen malware vereisen.
Indicatoren van compromis (IoC)
Stap 1: JarService
ba27951b4ee1c341f4415d033369ecd3d63bacd6d6709dd68a10ef9d374c78356c2e34b30da42085240ede53ab6107d48b5e513144a6138a966ea59e68bf9da2e119845877089d6f4b0a70dc7388f316
Stap 2: loader
e9f3a0dab6949ce2cddab9e0aa80ae1a
Stap 3: loader/clicker
0fbaa7092204f4b1494e0b840b0147741dcf031c40ce456b6a36a00b0acf3d1144b6b213a6a3f299eaf88e078de95ecb67dc78e544ebce16b85dc7c195dfbc589642ae619b3165d23c6349002d1abe24b067d5b0dbecbd6498bcdfba45dba77ef0e3f7eba2cde91e2dedb921bab47422
zhima module
412e9243f2981bbea3894254d105b3b871ab5517f71866279d0d87d37f2ae32089ef78f716a75964539f2db6520be362a4223ce4288a230d1e6c3ff2c7639045bd4d81cd27125ad3d9a114922d468499c6bfb1643ac7474ed8a7b4f96a187fdbde77c3303e93c9450424759f1741441cf8cf8c23ff597700d471fb7767df8bac
Domeinen en IP-adressen
xmsae[.]sbsishano456[.]sbsxshaon123[.]sbskshahnd[.]sbsmdsjhd[.]sbsnmnsny[.]sbskookjar[.]comty54fgd435[.]myue886578433[.]onlinety4523[.]space144.217.243[.]201107.151.248[.]132128.14.210[.]58
Adressen gebruikt voor het downloaden van JarService
hxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2026-06-08/bd80bd3c3d0e4bf6b5b4a825650d01f5.apkhxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2025-06-10/fe71af9ecf174de48d2b2ccc2c15fb04.apkhxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2024-11-07/fa831c3c23824b99871163387bcda7ad.apk
Hashes van TWCore (legitieme software gebruikt voor distributie)
2a64c3efc11bf224aa54f24e876446c97a4d3ba2dacccfdda55859a5dfee2671ea24487996eb70c1780922fb3063bcc5
Groetjes,