Ochrana proti ukradení session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Ahoj, zajímalo by mě, z jakého důvodu je na tomto řádku požadováno smazání původního session souboru?

Uvedený řádek generuje nové ID pro toho, kdo používá ID ukradené (to Nette pozná podle některých HTTP hlaviček). Potud je vše správně. Ovšem kámen úrazu přijde v následujícím okamžiku, kdy oprávněný uživatel (kterému bylo jeho ID ukradeno) klikne na odkaz, odešle formulář či se jiným způsobem pokusí vstoupit na přihlášenou stránku – bude bez milosti odhlášen, bez jakékoliv upozornění či možnosti důvod odhlášení zjistit.

A proto se ptám, zda je smazání původního session souboru nutné, a pokud ano, zda by se nedalo nalézt nějaké řešení, které by výše uvedený problém řešilo (například ponechání původního souboru s příznakem, že při příštím oprávněném přístupu je třeba změnit ID)?

onge
Člen | 53
+
0
-

Tohle zas tak uplne neni muj salek caje, ale myslim, ze tenhle vyklad je spatne. Fce session_regenerate_id nevytvori novou session, pouze zmeni id stavajici. Jinymi slovy, pokazde, kdyz si zobrazis nejakou stranku, mas nove ID, svazane porad se stejnou session. Tim padem je tezsi pro utocnika se do tohoto ID trefit. No a aby to fungovalo, tak je potreba stare a tedy uz neplatne ID mazat.

Pokud se mylim, opravte me prosim :)

_Martin_
Generous Backer | 679
+
0
-

Tento výklad jsem si již dvakrát ověřil a fce session_regenerate_id se pokaždé chová následovně:

  1. session_regenerate_id(TRUE) – vygeneruje nové session ID, vytvoří pro toto ID soubor, nakopíruje do něj starou session a její soubor poté smaže → původní session byla nahrazena novou
  2. session_regenerate_id(FALSE) – vygeneruje nové session ID, vytvoří pro toto ID soubor, nakopíruje do něj starou session a její soubor PONECHÁ (je tudíž pod původním ID stále přístupný) → vznikla jedna nová session

Taky v tom občas plavu, takže pro lepší pochopení uvedu příklad:

  • Jakožto oprávněný uživatel se připojíš a po přihlášení budeš mít ID session 00h26qa39i9f04a4ifuehi3r92
  • Útočník toto ID zjistí, nahradí v prohlížeči tedy své původní ID za 00h26qa39i9f04a4ifuehi3r92 a obnoví stránku
  • Aplikace zjistí, že ID je ukradeno (HTTP hlavičky), nastaví útočníkovi nové ID ecper16v8g1himgmhod7qi8r44 a session s ID 00h26qa39i9f04a4ifuehi3r92
    1. smaže
    2. ponechá aktivní
  • Oprávněný uživatel provede další požadavek na stránku a
    1. zobrazí se před ním bez jediného slova přihlašovací formulář
    2. bude pokračovat dále v práci se stále stejným ID

P.S. Vím, že tato ochranna je na nižší úrovni, než autentizace. Přihlašovací formulář zmiňuji jako praktickou ukázku situace, kdy tato ochranna smaže veškerý obsah session.

David Grudl
Nette Core | 8154
+
0
-

Myslíš, že je lepší varianta:

  • Aplikace zjistí, že ID je ukradeno (HTTP hlavičky), nastaví útočníkovi nové ID ecper16v8g1himgmhod7qi8r44 a session s ID 00h26qa39i9f04a4ifuehi3r92 ponechá aktivní
  • Útočník opět nahradí v prohlížeči své původní ID za 00h26qa39i9f04a4ifuehi3r92 a pokusí se s jiným nastavením HTTP hlaviček útok zopakovat
_Martin_
Generous Backer | 679
+
0
-

To rozhodně ne a ani jsem to netvrdil ;) Jen bych rád nějakým způsobem zabránil tomu, aby korektně přihlášený uživatel byl z ničeho nic (bez možnosti zjištění důvodu proč) odhlášen.

Teď vidím, že mnou navrhované řešení výše by nemohlo fungovat, napadá mě jiné: při neoprávněném přístupu by se původní session zablokovala pro konkrétní IP. Šlo by to nebo by to mělo nějaké jiné úskalí?

TFSi
Člen | 23
+
0
-

_Martin_ napsal(a):
Teď vidím, že mnou navrhované řešení výše by nemohlo fungovat, napadá mě jiné: při neoprávněném přístupu by se původní session zablokovala pro konkrétní IP. Šlo by to nebo by to mělo nějaké jiné úskalí?

A co když má útočník stejnou IP jako oprávněný uživatel? Třeba když si nějaký script kiddie hraje na blbě (nebo vůbec) zabezpečené WI-Fi síťi…
… potom blokneš oba :)

_Martin_
Generous Backer | 679
+
0
-

TFSi napsal(a):

A co když má útočník stejnou IP jako oprávněný uživatel? Třeba když si nějaký script kiddie hraje na blbě (nebo vůbec) zabezpečené WI-Fi síťi…
… potom blokneš oba :)

Tak to už je potom tomu uživateli celkem jedno, jestli ho to odhlásí, protože mu ID někdo ukradl, nebo proto, že je považován za útočníka. V obou případech dostane novou session. V ostatních případech se ochranna dotkne jen útočníka. (samozřejmě jsem předpokládál, že místo smazání staré session by se do ní nastavil údaj o IP a následně se generovala nová session pro útočníka)

phx
Člen | 651
+
0
-

Minimalne by bodla hlaska s duvodem odhlaseni!!! Obcas me Nette vyhazovalo bez hlasky, ale po aktualizaci je to OK:)

Jen tak mimo, kdyz je Nette schopne detekovat podvodnika dle hlavicek, tak snad neni problem podvodnika dle hlavicek i blokovat ne?

Navic kdyz se nekdo prihlasi tak jeho session je platna na 1 konkretni prohlizec, ve kterem se prihlasil. Takze by slo detekovat podpis prohlizece, coz utocnikovy zase stizi praci.