Client-Geheimnis in OAuth 2.0

95

Um die Google Drive API zu verwenden, muss ich mit der Authentifizierung mit OAuth2.0 spielen. Und ich habe ein paar Fragen dazu.

  1. Client-ID und Client-Geheimnis werden verwendet, um zu identifizieren, was meine App ist. Sie müssen jedoch fest codiert sein, wenn es sich um eine Clientanwendung handelt. So kann jeder meine App dekompilieren und aus dem Quellcode extrahieren. Bedeutet dies, dass eine schlechte App unter Verwendung der Client-ID und des Geheimnisses der guten App vorgeben kann, eine gute App zu sein? Der Benutzer würde also einen Bildschirm anzeigen, auf dem er um Erlaubnis für eine gute App bittet, obwohl er tatsächlich von einer schlechten App gefragt wird. Wenn ja, was soll ich tun? Oder sollte ich mir darüber eigentlich keine Sorgen machen?

  2. In mobilen Anwendungen können wir eine Webansicht in unsere App einbetten. Und es ist einfach, das Passwortfeld in der Webansicht zu extrahieren, da die App, die um Erlaubnis bittet, tatsächlich ein "Browser" ist. OAuth in mobilen Anwendungen hat also nicht den Vorteil, dass die Clientanwendung keinen Zugriff auf die Benutzeranmeldeinformationen des Dienstanbieters hat.

Bär
quelle
2
Ich denke auch, dass Leute normalerweise Verdacht haben, wenn die App sie nach ihren Facebook-, Twitter-, Dropbox- oder anderen Anmeldeinformationen fragt. Ich bezweifle, dass viele normale Leute die OAuth-Spezifikation lesen und "Jetzt bin ich sicher" sagen, aber stattdessen den gesunden Menschenverstand verwenden und im Allgemeinen keine Apps verwenden, denen sie nicht vertrauen.
Igor Čordaš
Wirklich eine gute Frage sollte definitiv mehr Punkte haben
Shravan
Sie können einfach die ClientId und das Geheimnis von Ihrem Server herunterladen und bei der ersten erfolgreichen Anmeldung in einem Schlüsselbund speichern
Shravan
@ Sharvan Ich kann mich irren, aber ich denke, Schlüsselanhänger sind auf gerooteten Telefonen anfällig, so dass Ihr Kundengeheimnis veröffentlicht werden könnte.
Chichilatte

Antworten:

16

Ich habe angefangen, einen Kommentar zu Ihrer Frage zu schreiben, aber dann herausgefunden, dass es zu viel zu sagen gibt. Hier sind meine Ansichten zu diesem Thema in der Antwort.

  1. Ja, es gibt eine echte Möglichkeit dafür und es gab einige Exploits, die darauf basierten. Es wird empfohlen, die App in Ihrer App nicht geheim zu halten. Es gibt sogar einen Teil der Spezifikation, dass verteilte Apps dieses Token nicht verwenden sollten. Jetzt könnten Sie fragen, aber XYZ benötigt es, um zu arbeiten. In diesem Fall wird die Spezifikation nicht ordnungsgemäß implementiert, und Sie sollten A diesen Dienst nicht verwenden (nicht wahrscheinlich) oder B versuchen, das Token mithilfe einiger verschleierter Methoden zu sichern, um das Auffinden oder Verwenden Ihres Servers als Proxy zu erschweren.

    Zum Beispiel gab es einige Fehler in der Facebook-Bibliothek für Android, bei denen Token in Protokolle verloren gingen. Weitere Informationen finden Sie hier http://attack-secure.com/all-your-facebook-access-tokens-are-belong -zu uns und hier https://www.youtube.com/watch?v=twyL7Uxe6sk . Alles in allem sollten Sie besonders vorsichtig sein, wenn Sie Bibliotheken von Drittanbietern verwenden (gesunder Menschenverstand, aber wenn Token-Hijacking Ihr großes Anliegen ist, fügen Sie ein weiteres Extra zur Vorsicht hinzu).

  2. Ich habe mich schon seit einiger Zeit über Punkt 2 geärgert. Ich habe sogar einige Problemumgehungen in meinen Apps durchgeführt, um die Einwilligungsseiten zu ändern (z. B. Ändern von Zoom und Design, um sie an die App anzupassen), aber nichts hinderte mich daran, Werte aus Feldern in der Webansicht mit Benutzername und Kennwort zu lesen. Daher stimme ich Ihrem zweiten Punkt voll und ganz zu und finde, dass es ein großer "Fehler" in der OAuth-Spezifikation ist. Der Punkt "App erhält keinen Zugriff auf Benutzeranmeldeinformationen" in der Spezifikation ist nur ein Traum und gibt Benutzern ein falsches Sicherheitsgefühl. Ich denke auch, dass Menschen normalerweise Verdacht haben, wenn die App sie nach ihren Facebook-, Twitter-, Dropbox- oder anderen Anmeldeinformationen fragt. Ich bezweifle, dass viele normale Leute die OAuth-Spezifikation lesen und "Jetzt bin ich sicher" sagen, aber stattdessen den gesunden Menschenverstand verwenden und im Allgemeinen keine Apps verwenden, denen sie nicht vertrauen.

Igor Čordaš
quelle
3
Ihre Client-ID und Ihr Client-Geheimnis sind nicht sicher, nur weil Sie sie in einem SSL-Tunnel veröffentlichen. Ja, sie sind vor Menschen in den mittleren Angriffen sicherer. Wenn ein Benutzer Ihre HTTPs anruft, kann er das fehlerhafte Zertifikat akzeptieren und alles sehen, was Sie posten. Dies ist übrigens der einfachste Weg, um jemandes Client-Geheimnis auf Mobilgeräten zu stehlen.
EpicThreeDev
5
Ich freue mich über Ihren Kommentar, kann ihn aber in keiner Weise mit meiner Antwort verbinden. Könnten Sie bitte erläutern, warum Sie meine Antwort kommentiert haben, weil ich ausdrücklich angegeben habe, dass das Client-Geheimnis nicht in verteilten Apps verwendet werden sollte, und der andere Punkt war dies Es gibt Problemumgehungen, um Benutzeranmeldeinformationen in den Apps abzurufen, selbst wenn OAuth verwendet wird. Daher sollten Benutzer dem App-Anbieter und nicht dem OAuth vertrauen.
Igor Čordaš
Ich verstehe auch nicht, was Sie unter "Wenn ein Benutzer Ihren HTTP-Anruf vertritt" verstehen. Ja, Benutzer erhalten Zugriff auf Daten, die sie über HTTP gesendet haben, und sie können Proxy-Anrufe nach Belieben ausführen. Wie ich verstanden habe, schlagen Sie dies als eine nette Alternative zum Zerlegen der apk vor, um das Geheimnis zu erfahren, aber andererseits sollten Sie das App-Geheimnis überhaupt nicht senden.
Igor Čordaš
Für Punkt 1) muss die fehlerhafte App Zugriff auf dasselbe System haben und das Zugriffs- / Aktualisierungstoken von demselben Gerät abrufen ?
Gauteh
Es ist nicht klar, was Sie in diesem Zusammenhang als "dasselbe System" betrachten. Die App erstellt eine Webansicht, in der die Bestätigungsseite angezeigt wird, und kann auf alle Daten in dieser Ansicht zugreifen (einschließlich Cookies oder URL-Parameter, die das Zugriffstoken hosten). In einigen Fällen ist auch ein appübergreifender Zugriff möglich. Wenn eine App beispielsweise auf andere App-Protokolle zugreifen kann, kann sie dort das Token finden, wie mit dem Fehler fb lib erwähnt.
Igor Čordaš
15

Ich hatte die gleiche Frage wie die Frage 1 hier und habe kürzlich selbst recherchiert. Mein Fazit ist, dass es in Ordnung ist, "Kundengeheimnis" nicht geheim zu halten. Der Clienttyp, der die Vertraulichkeit des Clients nicht geheim hält, wird in der OAuth2-Spezifikation als "öffentlicher Client" bezeichnet. Die Möglichkeit, dass jemand, der böswillig ist, Autorisierungscode erhalten und dann auf Token zugreifen kann, wird durch die folgenden Fakten verhindert.

1. Der Kunde muss den Autorisierungscode direkt vom Benutzer und nicht vom Dienst erhalten

Selbst wenn der Benutzer den Dienst angibt, dem er dem Client vertraut, kann der Client keinen Autorisierungscode vom Dienst erhalten, indem er nur die Client-ID und das Client-Geheimnis anzeigt. Stattdessen muss der Client den Autorisierungscode direkt vom Benutzer erhalten. (Dies erfolgt normalerweise durch URL-Umleitung, auf die ich später noch eingehen werde.) Für den böswilligen Client reicht es also nicht aus, die vom Benutzer vertrauenswürdige Client-ID / das Client-Geheimnis zu kennen. Es muss den Benutzer irgendwie einbeziehen oder fälschen, um ihm den Autorisierungscode zu geben, was schwieriger sein sollte, als nur die Client-ID / das Geheimnis zu kennen.

2. Die Weiterleitungs-URL ist mit der Client-ID / dem Client-Geheimnis registriert

Nehmen wir an, der böswillige Client hat es irgendwie geschafft, den Benutzer einzubeziehen, und ihn dazu gebracht, auf der Serviceseite auf die Schaltfläche "Diese App autorisieren" zu klicken. Dadurch wird die URL-Umleitungsantwort vom Dienst an den Browser des Benutzers mit dem Autorisierungscode ausgelöst. Anschließend wird der Autorisierungscode vom Browser des Benutzers an die Umleitungs-URL gesendet, und der Client soll die Umleitungs-URL abhören, um den Autorisierungscode zu erhalten. (Die Weiterleitungs-URL kann auch localhost sein, und ich habe festgestellt, dass dies ein typischer Weg ist, auf dem ein „öffentlicher Client“ Autorisierungscode erhält.) Da diese Weiterleitungs-URL beim Dienst mit der Client-ID / dem Client-Geheimnis registriert ist, ist dies beim böswilligen Client nicht der Fall Sie können steuern, wo der Autorisierungscode angegeben wird.

Hideaki
quelle
3
Das ist vielversprechend, haben Sie Referenzen dafür? Es wäre beruhigend zu wissen.
Gauteh
1
Ich habe in den Drive-Dokumenten gesehen, dass in installierten Apps das Client-Geheimnis nicht wirklich ein Geheimnis ist, aber sie haben nicht erklärt, warum es in Ordnung ist, es dort zu speichern. Ihre Erklärung hat sehr geholfen!
Martin Spasov
1

Beantwortung der zweiten Frage: Google APIs schreiben aus Sicherheitsgründen vor, dass die Authentifizierung / Anmeldung nicht in der App selbst erfolgen kann (wie Webviews nicht zulässig sind) und für eine bessere Sicherheit außerhalb der App mit dem Browser durchgeführt werden muss. Dies wird weiter unten erläutert: https: //developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html

vj
quelle
Zumindest ist es "behoben" 3 Jahre nachdem ich gefragt hatte :)
Bär