Na początek odsyłam do postu na BugTraq: Hacking CSRF Tokens using CSS History Hack. W szczególności do sekcji Some of the prerequisites for this attack to work (...). Sam atak jest ciekawy, ale te wymagania...
Jak NIE należy implementować ochrony przed CSRF
Szczerze mówiąc w żadnej z testowanych aplikacji nie spotkałem się z aż tak zepsutym mechanizmem ochrony przed CSRF. Raczej mogę powiedzieć, że z ochroną przed CSRF nie spotykam się wcale (niestety wciąż zbyt częsta sytuacja) LUB jest ona dobrze zrobiona, choć nie zawsze świadomie. Jest jeszcze stan pośredni, gdy ochrona przed CSRF występuje poniekąd "przy okazji" przykładowo z uwagi na występowanie numeru sekwencyjnego (przy mocno obleganych serwisach trafienie we właściwą wartość wcale nie jest tak trywialne, jak mogłoby się to wydawać, zwłaszcza jeśli istnieją dodatkowe ograniczenia) lub innych parametrów, których wartości nie są łatwe do przewidzenia.
Jeśli wykorzystywany jest token, to wygląda on jak wyjście funkcji SHA1 (przynajmniej pod względem długości), jest losowy (w próbce 20 000 elementów losowość jest szacowana na > 100 bitów) i jest unikalny dla każdego żądania. Jeśli token jest jednorazowy, to typ żądania w zasadzie nie ma większego znaczenia, ale zwykle jest to jednak POST.
Czy ktoś z Was spotkał się z aplikacją, która spełnia "wymagania" tego ataku?
$key = sha512($random_seed)
hmac_sha1($i++, $key)
...z dokładnością do długości oraz sposobu pozyskania $random_seed i sensownością wykonywania dodatkowych funkcji na potencjalnie wystarczająco (cokolwiek to znaczy) losowym $random_seed.
A poważniej - rzeczywiście czasami czuję pewien dyskomfort wynikający z faktu, że pewna wartość to hash($cos). To jaki hash jest używany można w pewien sposób domniemywać choćby po długości danych, natomiast ustalenie czym jest $cos jest dość problematyczne, w zasadzie często nie ma żadnych przesłanek, czy to jest warotść typu "$seq|$data" albo "$seq$data", albo "$data$seq", albo (...), a ustalenie tego $cos może być kluczowe dla bezpieczeństwa całości (np. przypadek $cos = time()).
...i tak przy okazji cała ta kwestia może być przykładem "wartości dodanej" usługi przeglądu kodu nad testem penetracyjnym (że o przewadze takiej usługi nad testem skanerami automatycznymi nie wspomnę).