Jak i dlaczego przeprowadza się weryfikację tokenów Google OAuth?

Pomiędzy tokenami dostępu, tokenami odświeżania, zakresami, odbiorcami i identyfikatorami klientów, byłem zdezorientowany, gdy dokumentacja Google OAuth poleciła mi zweryfikować wszystkie tokeny, aby zapobiec problemowi zdezorientowanego zastępcy. artykuł Wikipedii powiązany z opisuje tylko ogólny problem na wysokim poziomie, nie specyficzny dla OAuth ani nawet uwierzytelniania sieciowego. Jeśli dobrze to Rozumiem, Walidacja tokena nie jest nawet częścią OAuth2, ale w rzeczywistości zależy od konkretnego wdrożenie. Oto moje pytanie:

Jak i dlaczego przeprowadza się weryfikację tokenów Google OAuth?

Konkretny przykład zdezorientowanego problemu zastępcy w tym kontekście byłby szczególnie doceniany. Zauważ również, że pytam o to w kontekście całkowicie aplikacji po stronie klienta, jeśli to robi różnicę.

Author: Jakob, 2013-06-21

2 answers

Google odnosi się konkretnie do tokena access .

W kontekście OAuth 2.0 problem confused deputy dotyczy Implicit Grant protocol flow , gdy jest używany do uwierzytelniania . To, co Google nazywa "OAuth 2.0 Dla aplikacji po stronie klienta", opiera się na niejawnym przepływie protokołu dotacji.

Ponieważ implicit Flow ujawnia token dostępu użytkownikowi końcowemu poprzez fragment URI, wprowadza możliwość, że token dostępu może być majstrowanym. Legalna aplikacja (klient OAuth) może stać się zdezorientowanym zastępcą, akceptując token dostępu, który został wydany innej (złośliwej) aplikacji, dając w ten sposób atakującemu dostęp do konta ofiary.

Krytycznym krokiem w walidacji tokenu dostępu jest sprawdzenie przez aplikację, czy token dostępu nie został pierwotnie wydany innej aplikacji. Google zwraca na to uwagę, gdy mówią :

Uwaga: podczas weryfikacji tokena ważne jest, aby upewnij się, że pole odbiorców w odpowiedzi dokładnie odpowiada identyfikatorowi client_id zarejestrowanemu w konsoli API. Jest to złagodzenie problemu zdezorientowanego zastępcy, a wykonanie tego kroku jest absolutnie niezbędne.

Jako uproszczony przykład, wyobraź sobie, że istnieją dwie aplikacje: (1) FileStore, legalna aplikacja do przechowywania plików i (2) EvilApp. Obie aplikacje wykorzystują proces uwierzytelniania Google dla aplikacji po stronie klienta. Alice jest niewinnym użytkownikiem końcowym, a jej identyfikator użytkownika Google to XYZ.

  1. Alice Zaloguj się do FileStore za pomocą Google.
  2. Po procesie auth FileStore tworzy konto Alice i kojarzy je z Google user ID XYZ.
  3. [23]} Alice wgrywa kilka plików na swoje konto FileStore. Jak na razie wszystko jest w porządku. [23]}później, Alice podpisuje się do EvilApp, który oferuje gry, które wyglądają trochę zabawy. W rezultacie EvilApp otrzymuje token dostępu, który jest powiązany z Google user ID XYZ.
  4. właściciel EvilApp może teraz skonstruować URI przekierowania dla FileStore, wstawiając token dostępu, który został wydany dla konta Google Alicji.
  5. atakujący łączy się z FileStore, który pobierze token dostępu i sprawdzi w Google, dla którego użytkownika jest. Google powie, że to użytkownik XYZ.
  6. FileStore da atakującemu dostęp do plików Alice, ponieważ atakujący ma token dostępu dla użytkownika Google XYZ.

Błąd FileStore polegał na tym, że nie sprawdzał w Google, czy dany token dostępu był naprawdę wydany do FileStore; token został naprawdę wydany do EvilApp.

Inni opisali to znacznie bardziej elegancko niż ja:

Mam nadzieję, że to wyjaśnia Dlaczego {[2] } część walidacji tokena dostępu z aplikacjami po stronie klienta, oraz jak odnosi się to do problemu dezorientacji.

 42
Author: Andre D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 03:46:42

Jak używasz OAuth2? Czy uzyskujesz kod autoryzacyjny i wymieniasz na token odświeżania? A może uzyskujesz tokeny dostępu bezpośrednio przez swój frontend?

Jeśli otrzymujesz kod autoryzacyjny, jesteś skończony, ponieważ sprawdzenie client_secret przeprowadzone przez Google w backendzie gwarantuje, że wszystkie tokeny zwrócone w zamian za kod autoryzacyjny zostały wydane dla Twojej aplikacji.

Jeśli otrzymujesz access_token+id_token przez frontend, powinieneś zweryfikuj podpis id_token przy użyciu zalecanych bibliotek, a następnie sprawdź, czy pole " aud " w id_token pasuje do tego, które zarejestrowałeś dla swojej aplikacji w / Google. Dla pełnego bezpieczeństwa, również krzyżować access_token z id_token (id_token zawiera skrócony hash access_token jako złożony 'at_hash'), jak udokumentowano w: https://developers.google.com/accounts/docs/OAuth2Login

 3
Author: breno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-22 20:43:05