Sicherheit von mobilem OAuth 2.0

Bild

Die Popularität mobiler Anwendungen nimmt weiter zu. Dies gilt auch für das OAuth 2.0-Protokoll für mobile Apps. Es reicht nicht aus, Standard zu implementieren, um das OAuth 2.0-Protokoll dort sicher zu machen. Man muss die Besonderheiten mobiler Anwendungen berücksichtigen und einige zusätzliche Sicherheitsmechanismen anwenden.

In diesem Artikel möchte ich die Konzepte mobiler OAuth 2.0-Angriffe und Sicherheitsmechanismen zur Verhinderung solcher Probleme erläutern. Beschriebene Konzepte sind nicht neu, aber es fehlen strukturierte Informationen zu diesem Thema. Das Hauptziel des Artikels ist es, diese Lücke zu schließen.

OAuth 2.0 Art und Zweck


OAuth 2.0 ist ein Autorisierungsprotokoll , das eine Möglichkeit für einen Clientdienst beschreibt, einen sicheren Zugriff auf die Ressourcen des Benutzers bei einem Dienstanbieter zu erhalten. Dank OAuth 2.0 muss der Benutzer sein Passwort nicht außerhalb des Dienstanbieters eingeben: Der gesamte Vorgang beschränkt sich auf das Klicken auf die Schaltfläche "Ich stimme zu, Zugriff auf ... zu gewähren".

Ein Anbieter ist ein Dienst, dem die Benutzerdaten gehören und der mit Erlaubnis des Benutzers Diensten (Clients) von Drittanbietern einen sicheren Zugriff auf diese Daten bietet. Ein Client ist eine Anwendung, die die vom Anbieter gespeicherten Benutzerdaten abrufen möchte.

Kurz nach der Veröffentlichung des OAuth 2.0-Protokolls wurde es für die Authentifizierung angepasst, obwohl es nicht dafür gedacht war. Durch die Verwendung von OAuth 2.0 zur Authentifizierung wird ein Angriffsvektor von den beim Dienstanbieter gespeicherten Daten auf die Benutzerkonten des Clientdienstes verschoben.

Die Authentifizierung war jedoch nur ein Anfang. In Zeiten mobiler Apps und der Verherrlichung von Conversions klang der Zugriff auf eine App mit nur einer Taste gut. Entwickler haben OAuth 2.0 für den mobilen Einsatz angepasst. Natürlich machten sich nicht viele Sorgen um die Sicherheit und die Besonderheiten mobiler Apps: zap und in die Produktion gingen sie! Andererseits funktioniert OAuth 2.0 außerhalb von Webanwendungen nicht gut: Sowohl bei mobilen als auch bei Desktop-Apps treten dieselben Probleme auf.

Lassen Sie uns also herausfinden, wie Sie Mobile OAuth 2.0 sicher machen können.

Wie funktioniert es


Es gibt zwei Hauptprobleme bei der mobilen OAuth 2.0-Sicherheit:

  1. Nicht vertrauenswürdiger Kunde. Einige mobile Anwendungen haben kein Backend für OAuth 2.0, sodass der Client-Teil des Protokollflusses auf dem mobilen Gerät ausgeführt wird.
  2. Die Umleitungen von einem Browser zu einer mobilen App verhalten sich je nach Systemeinstellungen, Reihenfolge der Installation der Anwendungen und anderer Magie unterschiedlich.

Schauen wir uns diese Themen genauer an.

Mobile Anwendung ist ein öffentlicher Client


Um die Wurzeln und Konsequenzen des ersten Problems zu verstehen, sehen wir uns an, wie OAuth 2.0 bei Server-zu-Server-Interaktion funktioniert, und vergleichen es dann mit OAuth 2.0 bei Client-zu-Server-Interaktion.

In beiden Fällen beginnt alles mit den Client-Service-Registern im Provider-Service und empfängt client_id und in einigen Fällen , client_secret. client_id , client_secret. client_id ist ein öffentlicher Wert, der für die Identifizierung des client_secret erforderlich ist, im Gegensatz zum Wert client_secret , der privat ist. Weitere Informationen zum Registrierungsprozess finden Sie in RFC 7591 .

Das folgende Schema zeigt die Funktionsweise von OAuth 2.0 bei Server-zu-Server-Interaktionen.


Bildursprung: https://tools.ietf.org/html/rfc6749#section-1.2

Das OAuth 2.0-Protokoll kann in drei Hauptschritte unterteilt werden:

  1. [Schritte AC] Erhalten Sie einen authorization_code (im Folgenden code ).
  2. [Schritte DE] Tauschen Sie den code in access_token .
  3. Ressource über access_token .


Lassen Sie uns den Prozess zum Abrufen des code näher erläutern:

  1. [Schritt A] Der Client leitet den Benutzer an den Dienstanbieter weiter.
  2. [Schritt B] Der Dienstanbieter fordert vom Benutzer die Erlaubnis an, dem Client die Daten bereitzustellen (Pfeil B nach oben). Der Benutzer bietet Datenzugriff (Pfeil B nach rechts).
  3. [Schritt C] Der Dienstanbieter gibt code an den Benutzerbrowser zurück, der den code an den Client weiterleitet.

Lassen Sie uns mehr über den Prozess des access_token von access_token :

  1. [Schritt D] Der Client-Server sendet eine Anforderung für access_token . Code , client_secret und redirect_uri sind in der Anfrage enthalten.
  2. [Schritt E] Bei gültigem code , client_secret und redirect_uri , wird access_token bereitgestellt.

Die Anforderung von access_token erfolgt gemäß dem Server-zu-Server-Schema. Daher muss der Angreifer im Allgemeinen den Client-Service-Server oder den Service-Provider-Server hacken, um access_token zu stehlen.

Betrachten wir nun das mobile OAuth 2.0-Schema ohne Backend (Client-Server-Interaktion).


Bildursprung: https://tools.ietf.org/html/rfc8252#section-4.1

Das Hauptschema ist in die gleichen Hauptschritte unterteilt:

  1. [Schritte 1-4 im Bild] code abrufen.
  2. [Schritte 5-6 im Bild] Tauschen Sie den code in access_token
  3. access_token Ressourcenzugriff über access_token

In diesem Fall verfügt die mobile App jedoch auch über die Serverfunktionen. Daher würde client_secret in die Anwendung eingebettet. Daher kann client_secret auf mobilen Geräten nicht vor Angreifern verborgen client_secret . Eingebettetes client_secret kann auf zwei Arten extrahiert werden: durch Analyse des Anwendungs-Server-Verkehrs oder durch Reverse Engineering. Beides kann einfach implementiert werden, weshalb client_secret auf Mobilgeräten unbrauchbar ist.

Sie könnten fragen: "Warum bekommen wir nicht sofort access_token ?" Sie könnten denken, dass dieser zusätzliche Schritt unnötig ist. Darüber hinaus gibt es ein implizites Grant- Schema, mit dem ein Client access_token sofort empfangen access_token . Obwohl es in einigen Fällen verwendet werden kann, funktioniert Implicit Grant nicht für sicheres mobiles OAuth 2.0.

Umleitung auf mobilen Geräten


Im Allgemeinen werden benutzerdefinierte URI- Schema- und AppLink- Mechanismen für die Umleitung von Browser zu App verwendet. Keiner dieser Mechanismen kann so sicher sein wie Browser-Weiterleitungen für sich.

Das benutzerdefinierte URI-Schema (oder Deep Link) wird folgendermaßen verwendet: Ein Entwickler bestimmt vor der Bereitstellung ein Anwendungsschema. Das Schema kann ein beliebiges sein, und ein Gerät kann mehrere Anwendungen mit demselben Schema haben.

Dies erleichtert die Arbeit, wenn jedes Schema auf einem Gerät einer Anwendung entspricht. Was aber, wenn zwei Anwendungen dasselbe Schema auf einem Gerät registrieren? Wie entscheidet das Betriebssystem, welche App geöffnet werden soll, wenn es über das benutzerdefinierte URI-Schema kontaktiert wird? Android zeigt ein Fenster mit einer Auswahl an Apps und einem Link, dem Sie folgen können. iOS hat hierfür kein Verfahren und daher kann jede Anwendung geöffnet werden. Auf jeden Fall hat der Angreifer die Möglichkeit, Code oder access_token abzufangen .

Im Gegensatz zum benutzerdefinierten URI-Schema garantiert AppLink , dass die richtige Anwendung geöffnet wird. Dieser Mechanismus weist jedoch mehrere Mängel auf:

  1. Jeder Service-Client muss sich dem Überprüfungsverfahren unterziehen .
  2. Android-Benutzer können AppLink für eine bestimmte App in den Einstellungen deaktivieren.
  3. Android-Versionen älter als 6.0 und iOS-Versionen älter als 9.0 unterstützen AppLink nicht.

All diese AppLink-Fehler verlängern die Lernkurve für potenzielle Service-Clients und können unter bestimmten Umständen zu einem OAuth 2.0-Fehler des Benutzers führen. Aus diesem Grund wählen viele Entwickler den AppLink-Mechanismus nicht als Ersatz für die Browserumleitung im OAuth 2.0-Protokoll.

OK, was gibt es zum Angriff?


Mobile OAuth 2.0-Probleme haben einige spezifische Angriffe verursacht. Mal sehen, was sie sind und wie sie funktionieren.

Abfangangriff auf Autorisierungscode


Betrachten wir die Situation, in der das Benutzergerät eine legitime Anwendung (OAuth 2.0-Client) und eine bösartige Anwendung hat, die dasselbe Schema wie die legitime registriert hat. Das Bild unten zeigt das Angriffsschema.


Bildursprung https://tools.ietf.org/html/rfc7636#section-1

Hier ist das Problem: Im vierten Schritt gibt der Browser den code in der Anwendung über das benutzerdefinierte URI-Schema zurück. Daher kann der code von einer böswilligen App abgefangen werden (da er dasselbe Schema wie eine legitime App registriert hat). Anschließend ändert die böswillige App den code in access_token und erhält Zugriff auf die Benutzerdaten.

Was ist der Schutz? In einigen Fällen können Sie die Kommunikation zwischen Prozessen verwenden. Wir werden später darüber sprechen. Im Allgemeinen benötigen Sie ein Schema namens Proof Key für Code Exchange . Es ist im folgenden Schema beschrieben.


Bildursprung: https://tools.ietf.org/html/rfc7636#section-1.1

Die code_verifier verfügt über mehrere zusätzliche Parameter: code_verifier , code_challenge (im Schema t(code_verifier) ) und code_challenge_method (im Schema t_m ).

Code_verifier - ist eine Zufallszahl mit einer Mindestlänge von 256 Bit , die nur einmal verwendet wird . Ein Client muss code_verifier für jede code_verifier einen neuen code_verifier code .

Code_challenge_method - Dies ist ein Name einer Konvertierungsfunktion, meistens SHA-256.

Code_challenge - ist der code_verifier auf den die Konvertierung von code_challenge_method angewendet wurde und der in URL Safe Base64 codiert wurde.

Die Konvertierung von code_verifier in code_challenge ist erforderlich, um die Angriffsvektoren basierend auf code_verifier Abfangen von code_verifier (z. B. aus den Gerätesystemprotokollen) beim Anfordern von code code_verifier .

Wenn ein Benutzergerät SHA-256 nicht unterstützt , kann ein client is allowed to use plain conversion of code_verifier . In allen anderen Fällen muss SHA-256 verwendet werden.

So funktioniert dieses Schema:

  1. Der Client generiert code_verifier und speichert ihn.
  2. Der Client wählt code_challenge_method und empfängt code_challenge von code_verifier .
  3. [Schritt A] Der Client fordert code , wobei der Anforderung code_challenge und code_challenge_method hinzugefügt werden.
  4. [Schritt B] Der Anbieter speichert code_challenge und code_challenge_method auf dem Server und gibt code an einen Client zurück.
  5. [Schritt C] Der Client fordert access_token und code_verifier hinzu.
  6. Der Anbieter empfängt code_challenge vom eingehenden code_verifier und vergleicht ihn code_challenge mit dem von ihm gespeicherten code_challenge .
  7. [Schritt D] Wenn die Werte übereinstimmen, gibt der Anbieter dem Client access_token .

Um zu verstehen, warum code_challenge Abfangen von Code code_challenge , sehen wir uns an, wie der Protokollfluss aus der Sicht des Angreifers aussieht.

  1. Zunächst legitimer App-Anforderungscode ( code_challenge und code_challenge_method werden zusammen mit der Anforderung gesendet).
  2. Schädliche App fängt code (aber nicht code_challenge , da _challenge nicht in der Antwort enthalten ist).
  3. Schädliche App fordert access_token (mit gültigem code , aber ohne gültigen code_verifier ).
  4. Der Server stellt eine code_challenge von code_challenge und gibt eine Fehlermeldung aus.

Beachten Sie, dass der Angreifer code_verifier (zufälliger 256-Bit-Wert!) Nicht erraten oder irgendwo in den Protokollen finden kann (da die erste Anforderung tatsächlich code_challenge übertragen code_challenge ).

code_challenge beantwortet also die Frage des Dienstanbieters: "Wird access_token von demselben App-Client angefordert, der code angefordert hat code oder von einem anderen?".

OAuth 2.0 CSRF


OAuth 2.0 CSRF ist relativ harmlos, wenn OAuth 2.0 für die Autorisierung verwendet wird. Ganz anders sieht es aus, wenn OAuth 2.0 zur Authentifizierung verwendet wird. In diesem Fall führt OAuth 2.0 CSRF häufig zu einer Kontoübernahme.

Lassen Sie uns am Beispiel des Taxi-App-Clients und des Anbieters von provider.com mehr über den CSRF-Angriff gemäß OAuth 2.0 sprechen. Zunächst meldet sich ein Angreifer auf seinem eigenen Gerät bei attacker@provider.com an und erhält den code für das Taxi. Dann unterbricht er den OAuth 2.0-Prozess und generiert einen Link:

 com.taxi.app://oauth? code=b57b236c9bcd2a61fcd627b69ae2d7a6eb5bc13f2dc25311348ee08df43bc0c4 

Dann sendet der Angreifer diesen Link an sein Opfer, beispielsweise in Form einer Mail oder einer Textnachricht von Taxis. Das Opfer klickt auf den Link, die Taxi-App wird geöffnet und erhält access_token . Infolgedessen befinden sie sich auf dem Taxikonto des Angreifers . Das Opfer ist sich dessen nicht bewusst und verwendet dieses Konto: Reisen, persönliche Daten eingeben usw.

Jetzt kann sich der Angreifer jederzeit in das Taxikonto des Opfers einloggen, da es mit attacker@provider.com verknüpft ist. Durch einen CSRF-Anmeldeangriff konnte der Übertreter ein Konto stehlen.

CSRF-Angriffe werden normalerweise mit einem CSRF-Token (auch als state ) zurückgewiesen, und OAuth 2.0 ist keine Ausnahme. So verwenden Sie das CSRF-Token:

  1. Die Clientanwendung generiert und speichert CSRF-Token auf dem mobilen Gerät eines Clients.
  2. Die Clientanwendung enthält das CSRF-Token in der Codezugriffsanforderung.
  3. Der Server gibt dasselbe CSRF-Token mit code in seiner Antwort zurück.
  4. Die Clientanwendung vergleicht die eingehenden und gespeicherten CSRF-Token. Wenn ihre Werte übereinstimmen, wird der Prozess fortgesetzt.

CSRF-Token-Anforderungen: Nonce muss mindestens 256 Bit groß sein und von einer guten Quelle pseudozufälliger Sequenzen empfangen werden.

access_token gesagt, mit dem CSRF-Token kann ein Anwendungsclient die folgende Frage beantworten: "War das ich, der die Anforderung access_token initiiert access_token oder versucht jemand, mich access_token ?".

Hardcodiertes Kundengeheimnis


Mobile Anwendungen ohne Backend speichern manchmal client_id client_secret Werte für client_id und client_secret . Natürlich können sie einfach per Reverse Engineering App extrahiert werden.

Die Auswirkung der Offenlegung von client_id und client_secret hängt stark davon ab, wie viel Vertrauensdienstanbieter auf das bestimmte Paar client_id , client_secret legt. Man verwendet sie nur, um einen Client von einem anderen zu unterscheiden, während andere versteckte API-Endpunkte öffnen oder für einige Clients niedrigere Ratenbeschränkungen festlegen.

In dem Artikel Warum OAuth-API-Schlüssel und -Sekrete in mobilen Apps nicht sicher sind, wird dieses Thema ausführlicher behandelt.

Schädliche App als legitimer Client


Einige böswillige Apps können die legitimen Apps imitieren und in ihrem Namen einen Zustimmungsbildschirm anzeigen (ein Zustimmungsbildschirm ist ein Bildschirm, auf dem ein Benutzer Folgendes sieht: "Ich bin damit einverstanden, Zugriff auf ... zu gewähren"). Der Benutzer kann auf "Zulassen" klicken und der bösartigen App seine Daten zur Verfügung stellen.

Android und iOS bieten die Mechanismen für die Gegenprüfung von Anwendungen. Ein Anwendungsanbieter kann sicherstellen, dass eine Clientanwendung legitim ist und umgekehrt.

Wenn der OAuth 2.0-Mechanismus einen Thread über einen Browser verwendet, ist es leider unmöglich, sich gegen diesen Angriff zu verteidigen.

Andere Angriffe


Wir haben uns die Angriffe genauer angesehen, die nur für mobile OAuth 2.0 gelten. Vergessen wir jedoch nicht die ursprüngliche OAuth 2.0: Ersetzung von redirect_uri , Abfangen des Datenverkehrs über eine unsichere Verbindung usw. Hier können Sie mehr darüber lesen.

Wie geht das sicher?


Wir haben erfahren, wie das OAuth 2.0-Protokoll funktioniert und welche Schwachstellen es auf Mobilgeräten aufweist. Lassen Sie uns nun die einzelnen Teile zusammenfügen, um ein sicheres mobiles OAuth 2.0-Schema zu erhalten.

Gute, schlechte OAuth 2.0


Beginnen wir mit der richtigen Verwendung des Einwilligungsbildschirms. Mobile Geräte haben zwei Möglichkeiten, eine Webseite in einer mobilen Anwendung zu öffnen.



Der erste Weg führt über die benutzerdefinierte Registerkarte "Browser" (links im Bild). Hinweis : Die benutzerdefinierte Registerkarte "Browser" für Android heißt "Chrome Custom Tab" und für iOS - SafariViewController. Es ist nur eine Browser-Registerkarte, die in der App angezeigt wird: Es gibt keinen visuellen Wechsel zwischen den Anwendungen.

Der zweite Weg führt über WebView (rechts im Bild) und ich halte es für schlecht in Bezug auf das mobile OAuth 2.0.

WebView ist ein eingebetteter Browser für eine mobile App.

" Eingebetteter Browser " bedeutet, dass der Zugriff auf Cookies, Speicher, Cache, Verlauf und andere Safari- und Chrome-Daten für WebView verboten ist. Das Gegenteil ist auch richtig: Safari und Chrome können nicht auf WebView-Daten zugreifen.

" Browser für mobile Apps" bedeutet, dass eine mobile App, auf der WebView ausgeführt wird, vollen Zugriff auf Cookies, Speicher, Cache, Verlauf und andere WebView-Daten hat.

Stellen Sie sich nun vor: Ein Benutzer klickt auf "Enter with ..." und ein WebView einer bösartigen App fordert seinen Login und sein Passwort vom Dienstanbieter an.

Epischer Fehler:

  1. Der Benutzer gibt sein Login und Passwort für das Konto des Dienstanbieters in die App ein, mit dem diese Daten leicht gestohlen werden können.
  2. OAuth 2.0 wurde ursprünglich entwickelt, um die Anmeldung und das Kennwort des Dienstanbieters nicht einzugeben.

    Der Benutzer gewöhnt sich daran, sein Login und Passwort überall einzugeben, was die Angelmöglichkeiten erhöht.

In Anbetracht aller Nachteile von WebView bietet sich eine offensichtliche Schlussfolgerung an: Verwenden Sie die benutzerdefinierte Registerkarte Browser für den Zustimmungsbildschirm.

Wenn jemand Argumente für WebView anstelle von Browser Custom Tab hat, würde ich mich freuen, wenn Sie darüber in den Kommentaren schreiben.

Sicheres mobiles OAuth 2.0-Schema


Wir werden das Authorization Code Grant-Schema verwenden, da es uns ermöglicht, code_challenge hinzuzufügen sowie einen Code-Interception-Angriff und OAuth 2.0 CSRF code_challenge und zu verteidigen.


Bildursprung: https://tools.ietf.org/html/rfc8252#section-4.1

Die Codezugriffsanforderung (Schritte 1-2) sieht wie folgt aus:

 https://o2.mail.ru/code? redirect_uri=com.mail.cloud.app%3A%2F%2Foauth& state=927489cb2fcdb32e302713f6a720397868b71dd2128c734181983f367d622c24& code_challenge=ZjYxNzQ4ZjI4YjdkNWRmZjg4MWQ1N2FkZjQzNGVkODE1YTRhNjViNjJjMGY5MGJjNzdiOGEzMDU2ZjE3NGFiYw%3D%3D& code_challenge_method=S256& scope=email%2Cid& response_type=code& client_id=984a644ec3b56d32b0404777e1eb73390c 3D% 3D & https://o2.mail.ru/code? redirect_uri=com.mail.cloud.app%3A%2F%2Foauth& state=927489cb2fcdb32e302713f6a720397868b71dd2128c734181983f367d622c24& code_challenge=ZjYxNzQ4ZjI4YjdkNWRmZjg4MWQ1N2FkZjQzNGVkODE1YTRhNjViNjJjMGY5MGJjNzdiOGEzMDU2ZjE3NGFiYw%3D%3D& code_challenge_method=S256& scope=email%2Cid& response_type=code& client_id=984a644ec3b56d32b0404777e1eb73390c 

In Schritt 3 erhält der Browser eine Antwort mit Umleitung:

 com.mail.cloud.app://outh? code=b57b236c9bcd2a61fcd627b69ae2d7a6eb5bc13f2dc25311348ee08df43bc0c4& state=927489cb2fcdb32e302713f6a720397868b71dd2128c734181983f367d622c24 

In Schritt 4 öffnet der Browser das benutzerdefinierte URI-Schema und übergibt das CSRF-Token an eine Client-App.
access_token Anforderung (Schritt 5):

 https://o2.mail.ru/token? code_verifier=e61748f28b7d5daf881d571df434ed815a4a65b62c0f90bc77b8a3056f174abc& code=b57b236c9bcd2a61fcd627b69ae2d7a6eb5bc13f2dc25311348ee08df43bc0c4& client_id=984a644ec3b56d32b0404777e1eb73390c 

Der letzte Schritt bringt eine Antwort mit access_token .

Dieses Schema ist im Allgemeinen sicher, aber es gibt einige Sonderfälle, in denen OAuth 2.0 einfacher und sicherer sein kann.

Android IPC


Android verfügt über einen Mechanismus zur bidirektionalen Datenkommunikation zwischen Prozessen: IPC (Inter-Process Communication). IPC ist aus zwei Gründen besser als das benutzerdefinierte URI-Schema:

  1. Eine App, die den IPC-Kanal öffnet, kann die Authentizität einer App, die sie öffnet, anhand ihres Zertifikats bestätigen. Das Gegenteil ist auch der Fall: Die geöffnete App kann die Authentizität der App bestätigen, die sie geöffnet hat.
  2. Wenn ein Absender eine Anfrage über den IPC-Kanal sendet, kann er eine Antwort über denselben Kanal empfangen. Zusammen mit der Gegenprüfung (Punkt 1) bedeutet dies, dass kein fremder Prozess access_token abfangen access_token .



Daher können wir Implicit Grant verwenden , um das mobile OAuth 2.0-Schema zu vereinfachen. Keine code_challenge und kein code_challenge bedeuten auch weniger Angriffsfläche. Wir können auch das Risiko verringern, dass sich böswillige Apps wie legitime Kunden verhalten, die versuchen, die Benutzerkonten zu stehlen.

SDK für Kunden


Neben der Implementierung dieses sicheren mobilen OAuth 2.0-Schemas sollte ein Anbieter ein SDK für seine Kunden entwickeln. Dies vereinfacht die Implementierung von OAuth 2.0 auf Clientseite und reduziert gleichzeitig die Anzahl der Fehler und Schwachstellen.

Schlussfolgerungen


Lassen Sie es mich für Sie zusammenfassen. Hier ist die (grundlegende) Checkliste für sicheres OAuth 2.0 für OAuth 2.0-Anbieter:

  1. Ein starkes Fundament ist entscheidend. Im Fall von mobilem OAuth 2.0 ist die Grundlage ein Schema oder ein Protokoll, das für die Implementierung ausgewählt wurde. Es ist leicht, Fehler zu machen, während Sie Ihr eigenes OAuth 2.0-Schema implementieren . Andere haben bereits geklopft und ihre Lektion gelernt; Es ist nichts Falsches daran, aus ihren Fehlern zu lernen und eine sichere Implementierung auf einmal durchzuführen. Das sicherste mobile OAuth 2.0-Schema wird unter Wie wird es sicher durchgeführt ? Beschrieben.
  2. Access_token und andere vertrauliche Daten müssen in Keychain für iOS und in Internal Storage für Android gespeichert werden. Diese Speicher wurden speziell dafür entwickelt. Der Inhaltsanbieter kann in Android verwendet werden, muss jedoch sicher konfiguriert sein.
  3. Client_secret ist nutzlos , es sei denn, es wird im Backend gespeichert. Geben Sie es nicht an öffentliche Kunden weiter.
  4. Verwenden Sie WebView nicht für den Zustimmungsbildschirm. Verwenden Sie die benutzerdefinierte Registerkarte des Browsers.
  5. Verwenden Sie code_challenge um sich gegen Code-Interception-Angriffe zu verteidigen.
  6. Verwenden Sie state um sich gegen OAuth 2.0 CSRF zu verteidigen.
  7. Verwenden Sie HTTPS überall , wobei ein Downgrade auf HTTP verboten ist. Hier ist eine 3-minütige Demo, die erklärt, warum (mit einem Beispiel aus einer Bug Bounty).
  8. Befolgen Sie die Kryptografiestandards (Auswahl des Algorithmus, Länge der Token usw.). Sie können die Daten kopieren und herausfinden, warum dies so gemacht wird, aber keine eigene Krypto rollen.
  9. Code darf nur einmal verwendet werden, mit einer kurzen Lebensdauer.
  10. Überprüfen Sie auf der Seite eines App-Clients, was Sie für OAuth 2.0 öffnen. Überprüfen Sie auf der Seite eines App-Anbieters, wer Sie für OAuth 2.0 öffnet.
  11. Beachten Sie die allgemeinen OAuth 2.0-Schwachstellen . Mobile OAuth 2.0 vergrößert und vervollständigt das Original. Daher ist redirect_uri Überprüfung von redirect_uri auf eine genaue Übereinstimmung und andere Empfehlungen für das Original OAuth 2.0 noch in Kraft.
  12. Sie sollten Ihren Kunden das SDK zur Verfügung stellen. Sie haben weniger Fehler und Schwachstellen und es wird für sie einfacher sein, OAuth 2.0 zu implementieren.

Weiterführende Literatur


  1. "Sicherheitslücken von Mobile OAuth 2.0" https://www.youtube.com/watch?v=vjCF_O6aZIg
  2. OAuth 2.0 Race Condition Research https://hackerone.com/reports/55140
  3. Fast alles über OAuth 2.0 an einem Ort https://oauth.net/2/
  4. Warum OAuth-API-Schlüssel und -Sekrete in mobilen Apps nicht sicher sind https://developer.okta.com/blog/2019/01/22/oauth-api-keys-arent-safe-in-mobile-apps
  5. [RFC] OAuth 2.0 für native Apps https://tools.ietf.org/html/rfc8252
  6. [RFC] Proof-Schlüssel für den Code-Austausch durch öffentliche OAuth-Clients https://tools.ietf.org/html/rfc7636
  7. [RFC] Überlegungen zum OAuth 2.0-Bedrohungsmodell und zur Sicherheit https://tools.ietf.org/html/rfc6819
  8. [RFC] OAuth 2.0 Dynamic Client Registration Protocol https://tools.ietf.org/html/rfc7591
  9. Google OAuth 2.0 für mobile und Desktop-Apps https://developers.google.com/identity/protocols/OAuth2InstalledApp

Credits


Vielen Dank an alle, die mir geholfen haben, diesen Artikel zu schreiben. Insbesondere an Sergei Belov, Andrei Sumin, Andrey Labunets für das Feedback zu technischen Details, an Pavel Kruglov für die englische Übersetzung und an Daria Yakovleva für die Hilfe bei der Veröffentlichung der russischen Version dieses Artikels.

Source: https://habr.com/ru/post/de456702/


All Articles