Die meisten Online-Transaktionen erfordern eine zweistufige Authentifizierung, und der per SMS gesendete Einmalpasswort (One-Time-Password, OTP) stellt einer dieser beiden Schritte dar. Der Zweck eines OTP besteht darin, Betrug zu verhindern, indem bei einer durchgeführten Transaktion sichergestellt wird, dass der Kreditkarteninhaber mit dem Anwender übereinstimmt. Aus diesem Grund wird automatisch ein temporärer Code per SMS an die Telefonnummer gesendet, die dem verwendeten Bankkonto zugeordnet ist.
Sobald die SMS mit OTP empfangen wurde, gibt der Benutzer den Code in den Transaktionsformular ein und kann dann seinen Kauf abschließen. Aber kann man sich auf die mobilen Geräte (Smartphones/Tablets) zum Senden und Empfangen von SMS komplett verlassen? Leider nicht sehr. Was bei seiner Einführung wie ein starker Authentifizierungsprozess aussah, wird heutzutage von mobilen Apps leicht umgangen.
Unser Team hat mithilfe der OTP-Abhörtechnik zwei Arten von mobilen Anwendungen identifiziert: die legitimen und die böswilligen. Während eine sichere App einen SMS-OTP abfängt, um die Transaktionen zu vereinfachen und zu beschleunigen, fängt eine böswillige App es ab, um Bankbetrug zu begehen.
Unterschiedliche Zwecke, gleicher Mechanismus
Die gleichen Berechtigungen sind erforderlich
Je mehr Berechtigungen eine App benötigt, desto verdächtiger wirkt sie. Für ein OTP-Abfangen müssen jedoch nur zwei Berechtigungen ausgeführt werden, von denen eine (Internetzugang) sehr häufig ist. Infolgedessen erscheinen Apps mit OTP-Überwachung für böswillige Zwecke auf den ersten Blick nicht als verdächtig.
- Erlaubnis zum Abfangen von SMS: 'android.permission.RECEIVE_SMS'
- Berechtigung zum Senden des Inhalts über das Internet oder eine SMS: 'android.permission.INTERNET' oder 'android.permission.SEND_SMS'
Eine Schwachstelle für Anwendungsspeicher
Google Play und der Apple App Store führen Überprüfungen der ersten Ebene durch, um zu verhindern, dass Malware in ihre Stores gelangt. Die mangelnde Tiefe dieser Sicherheitsüberprüfungen lässt jedoch aufgrund der Systemgrenzen häufig bösartige Apps durch. Umso schwierig sind sie zu identifizieren, besonders wenn die ersten sichtbaren Ebenen einer App, die Berechtigungen und Funktionen, keinen Hinweis auf ihre wahre Natur geben.
Die OTP-Interception kann sowohl von legitimen Apps als auch von Malware verwendet werden. Infolgedessen besteht die Möglichkeit für beide App-Typen die Standardsicherheitsprüfungen der Stores erfolgreich zu bestehen.
Anwendungsfall
App name: Postbank Finanzassistent (Eine Betrüger-App, die die offizielle App der Deutschen Postbank nachahmt)
sha1: 32f85c91e5a1437e93128203c27cd8eeb8bbea19
Diese App fängt SMS OTP in zwei Schritten ab:
1 – Abfangen von SMS mit der Implementierung eines android.content.BroadcastReceiver (org.slempo.service.MessageReceiver)
2 – Senden von SMS-Inhalten über (Lorg/slempo/service/MainService) und genauer mit der Verwendung von java.lang.Runnable (org.slempo.service.a.a$1)
1 – Interception über BroadcastReceiver
Erforderliche Genehmigung: 'android.permission.RECEIVE_SMS'
Ein Broadcast Receiver (MessageReceiver) wird verwendet, um eingehende SMS mit der 'onReceive'-Methode abzufangen.
Name von dem Broadcast Receiver :
.class public Lorg/slempo/service/MessageReceiver;
.super Landroid/content/BroadcastReceiver;
Methode :
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
Beschreibung :
(*) Diese Methode ruft ein (Landroid / content / Intent;) Ljava/util /Map auf, um auf die SMS zuzugreifen
invoke-static {p2}, Lorg/slempo/service/MessageReceiver;->a(Landroid/content/Intent;)Ljava/util/Map;
(*) dann ruft die Methode auf b(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V welche formatiert die Informationen in JSON.
invoke-static {p1, v1, v0}, Lorg/slempo/service/a/f;->b(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)V
(-) Methode, die den Konstruktor aufruft <init>
(Ljava/lang/String;Lorg/slempo/service/a/a$a;Landroid/content/Context;)V welches speichert die Informationen im Feld: Lorg/slempo/service/a/a;->a:Ljava/lang/String;
invoke-direct {v0, v1, v2, p0}, Lorg/slempo/service/a/a;-><init>(Ljava/lang/String;Lorg/slempo/service/a/a$a;Landroid/content/Context;)V
2 - Datenversand
Service name:
.class public Lorg/slempo/service/MainService;
.super Landroid/app/Service;
Diese Methode instanziiert die Runnable MainService$1:
.method public onCreate()V
(*) creation of Lorg/slempo/service/MainService$1
new-instance v1, Lorg/slempo/service/MainService$1;
invoke-direct {v1, p0},
Lorg/slempo/service/MainService$1;-><init>(Lorg/slempo/service/MainService;)V
Runnable Name:
.class Lorg/slempo/service/MainService$1
.implements Ljava/lang/Runnable;
Methode Name:
.method public run()V
Der Aufruf erfolgt in der Methode run()
(*) invoke-static {v0}, Lorg/slempo/service/a/f;->a(Landroid/content/Context;)V
(-) Lorg/slempo/service/a/a;->a()V that runs Runnable Lorg/slempo/service/a/a$1
Runnable Name:
.class Lorg/slempo/service/a/a$1;
.implements Ljava/lang/Runnable;
Method Name:
.method public run()V
(*) Versand via http
Berechtigung: 'android.permission.INTERNET'
invoke-static {v0, v2, v3, v4},
Lorg/slempo/service/a/a;->a(Lorg/slempo/service/a/a;Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;)Lorg/apache/http/HttpResponse;
(*) Unsichtbarer SMS-Versand
Berechtigung: 'android.permission.SEND_SMS'
invoke-static {v0, v2},
Lorg/slempo/service/a/h;->a(Ljava/lang/String;Ljava/lang/String;)Z
Vielleicht interessiert Sie auch:
- Mobile Threat Defense
- Mobile Application Security Testing
- In-App Protection
- Secure Private Store
- Mobile Threat Intelligence