Security w Single Page Application

Security w Single Page Application
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Witam,
próbuje zrobić security dla aplikacji typu SPA i się trochę zakręciłem. Chciałem użyć OAuth2 lub/i JWT. Jednak mam problem z przechowywaniem tokenów ponieważ z przeglądarki każdy może dostać się do tokena. Dostaje się do tokena kopiuje go i już mogę robić requesty do serwera. Czy istnieje jakiś sposób, aby zabezpieczyć się przed "kradzieżą" tokena?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Nie wiem co robisz do końca. (implementujesz OUATH2?)
Ale popatrz np. na zabezpieczanie COOKIE (klasyczne) - z przeglądarki każdy może odczytać COOKIe i już robić requesty do serwera...

A może korzystasz z serwisu Oauth2 - wtedy patrz "implicit flow".


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Nie implementuje OAuth2. "Implicit flow" też Ci nic nie daje bo musisz podać ClientId.

Chodzi mi o to w jaki sposób przechowywać tokeny (ewentualnie inne dane jak np. clientId czy clientSecret) po stronie klienta, tak żeby osoby trzecie nie mogły ich odczytać i użyć.

several
  • Rejestracja:prawie 16 lat
  • Ostatnio:36 minut
1
Kozy napisał(a):

Jednak mam problem z przechowywaniem tokenów ponieważ z przeglądarki każdy może dostać się do tokena. Dostaje się do tokena kopiuje go i już mogę robić requesty do serwera.

Jeśli chodzi o przegląrkę to nie ma znaczenia, że ktoś ma dostęp do tokena skoro jest same origin policy. W skrócie, jeśli skrypt, który chce zrobić request na Twój serwer pochodzi z innej domeny, przeglądarka mu na to nie pozwoli.

edit
@Shalom w komentarzu słusznie zauważył że SOP można omijać, ale mógł chociaż wspomnieć, że przed CSRF można się bronić, przykłady z django np https://docs.djangoproject.com/en/dev/ref/csrf/. To pewnie też da się obejść, albo znaleźć exploit co sprowadza się do konkluzji, że jak dobry cracker się na Ciebie uprze to i tak Cie dojedzie prędzej czy później.

Generalnie nie można polegać na jednej warstwie, oauth2 ma znane problem, które są opisane chyba nawet w jakimś RFC.


edytowany 3x, ostatnio: several
Shalom
@several akurat SOP da się omijać, szczególnie w aplikacjach SPA, więc tak mocno to bym na nim nie polegał.
Shalom
Token csrf to takie-sobie zabezpieczenie bo chroni tylko przed czymś w stylu clickjackingu. Jak ktoś moze robić requesty w twoim imieniu to nic nie stoi na przeszkodzie najpierw pobrać sobie tokena a potem wykonać akcje. I nie trzeba być wielkim hackerem w czasach kiedy mamy takie rzeczy jak http://beefproject.com/ ;) A co do SOP to problem polega na tym ze SOP działa na bazie gołego URLa a nie na bazie DNSów. Jak sobie ktoś w DNS ustawi że jego domena pokazuje nagle na twój serwer to z punktu widzenia przeglądarki wszystko jest ok, bo domena ta sama (patrz: dns rebinding)
several
Jeżeli broni przed clickjackingiem to to już jest coś :) Framework to trzeba chociaż umieć obsłużyć, są gotowe narzędzia przecież do pobrania https://www.metasploit.com/ albo gotowe exploity https://www.exploit-db.com/ i to jest najbardziej przerażające, byle script kiddie może Cie dojechać. Ten DNS rebinding to ciekawa lektura nawet, dzięki :) Ale nie trzeba nawet znać konkretnych typów ataków, wystarczy googlnąć "SOP workarands" żeby znaleźć sobie liste możliwości :)
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

@Kozy ClientID nie jest tajne! Czyli implicit flow -> po to powstał, żeby w przeglądarce dało się użyć (pytanie czy twój provider to wspiera).
A korzystający z przeglądarki zawsze da radę je sobie token wyciągnąć. Tylko, że dlaczego to niby ma być problem?
Zalogowałem się do Twittera z twojej aplikacji.. i co? Teraz sobie swojego tokena podejrze... to nie jest dramat.

http://oauthlib.readthedocs.io/en/latest/oauth2/grants/implicit.html


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

@jarekr000000 ale jak odejdziesz od przeglądarki i ktoś albo coś innego dostanie się np. do localStorage/sessionStorage (może to nie najlepsze miejsce zapisywania tokena, podałem tak przykładowo) gdzie jest zapisany token to może Ci namieszać w Twoich zasobach.

Providerem jestem ja, tzn. moja aplikacja i tutaj sobie mogę manipulować. Moją pierwszą myślą było użycie grant_type=password ze względu na frontend - nie ma zbędnych przekierowań. Tylko mam problem z trzymaniem tych wszystkich danych (clientId, clientSecret, token, refresh_token) w przeglądarce. Myślałem, żeby zrobić sobie jakieś cienkie proxy, gdzie można byłoby trzymać te dane (lub część danych - tylko clientId i clientSecret), nie wiem czy to jest dobry pomysł.

Jeszcze ogarniam JWT i może to będzie lepsza droga? Tylko tam znowu pojawia się ten sam problem.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
Kozy napisał(a):

@jarekr000000 ale jak odejdziesz od przeglądarki i ktoś albo coś innego dostanie się np. do localStorage/sessionStorage (może to nie najlepsze miejsce zapisywania tokena, podałem tak przykładowo) gdzie jest zapisany token to może Ci namieszać w Twoich zasobach.

@Kozy - jak odejdziesz od przeglądarki to ktoś może Ci zainstalować piękne rezszerzenie, keylogera itp. Trudno Ci się będzie przed wszystkim obronić.

Sam token najlepiej nie przechowuj w localStorage tylko jak var wewnątrz modułu JS - trudno jest się do tego dostać. Do tego jeśli ustawianie tokena zrobisz automatycznie hookiem (podmiana) XMLHttpRequest.prototype.open
to nie tak łatwo będzie się do niego dostać (musisz sprawdzać tylko Czy ktoś jeszcze nie przejął 'open'... (Poprawka: hmm nie wiem czy to może być skuteczne - jak ktoś najpierw podmieni 'open' - to chyba nie dasz rady sprawdzić, że to obcy kod)).
Wtedy na pewno wydostanie tokena będzie trudne nawet jak ktoś Ci zrobi XSS.

Ale jak ktoś ma fizyczny dostęp do przeglądarki to sorry... Nie wiem co wtedy można zrobić i czy jest praktyczny sens?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 3x, ostatnio: jarekr000000
KO
  • Rejestracja:ponad 13 lat
  • Ostatnio:5 miesięcy
  • Postów:135
0

Dobra, faktycznie chyba za dużo chcę zrobić.

several
  • Rejestracja:prawie 16 lat
  • Ostatnio:36 minut
0

@Kozy jak ktoś ma fizyczny dostęp do maszyny to maszyna jest skompromitowana. Pozostaje mieć nadzieję, że kiedyś może przeglądarki będą używać np. SGXa do przechowywania wrażliwych zasobów, ale trochę potrwa zanim to nastąpi, jeśli w ogóle.


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.