Dlaczego klucze warto mieć na karcie, a nie "w sofcie" (czyli na dysku w postaci pliku)? To proste, z karty klucz nie może zostać "wyciągnięty" (pomijając te przypadki, kiedy może, ale to już specyfika implementacji), a i użytkownik ma lepszą kontrolę nad tym, kiedy klucze na karcie są używane, bo musi podać kod PIN w celu ich "odblokowania".
PIN Cache bywa ZŁY!
Na początek by było jasne. Piszę o środowisku Windows i mechanizmie CSP.
Zwykle jest tak, że bezpieczeństwo i wygoda użytkownika są ze sobą celami antagonistycznymi. Dla przykładu korzystanie z programu pocztowego, podpisów cyfrowych i certyfikatów (z kluczami) na karcie, może być uciążliwe. Wymaganie podania kodu PIN przy każdym wysyłanym mailu (albo i odebranym, jeśli wykorzystywane jest szyfrowanie) może być uciążliwe. Dlatego istnieje mechanizm PIN Cache, który z założenia ma zrobić, by było akceptowalnie bezpiecznie i wystarczająco wygodnie. Jak to działa? PIN jest zapamiętywany i przy kolejnych zdarzeniach wymagających podania kodu PIN, wykorzystywana jest wcześniej zapamiętana wartość. Oczywiście są ograniczenia. Dwa podstawowe:
- cache jest dla poszczególnych procesów,
- cache jest czyszczone po wyjęciu karty,
Tutaj małe zboczenie z głównego tematu. Właściwie powinienem napisać, że PIN powinien być skutecznie czyszczony, a jak się okazuje, nie jest to tak łatwe, jak się wydaje.
Mnie osobiście podoba się implementacja, która pozwala użytkownikowi podczas podawania PIN wybrać, czy:
- ma być użyty PIN cache (oczywiście w obrębie tej jednej aplikacji),
- jak długo PIN ma być pamiętany,
Jest to wygodne i pozwala użytkownikowi zachować kontrolę nad tym, co się dzieje z jego kluczami. Jeśli zdecyduje się on na korzystanie z ułatwienia (zapamiętanie PIN), to jest to jego świadoma(?) decyzja.
Dlaczego to piszę? Dlatego, że ostatnio natknąłem się na implementację, w której producent uszczęśliwił mnie omawianym ułatwieniem. Co więcej ani w dokumentacji, ani w Internecie nie znalazłem żadnej informacji jak to dobrodziejstwo wyłączyć...
Teraz zróbmy mały eksperyment myślowy. Do czego może prowadzić to "ułatwienie", jeśli karty te zostaną wykorzystane w bankowości internetowej? Tak, do automatycznego podpisania przez wrogi kod działający w kontekście przeglądarki internetowej (może to być nawet skrypt wrzucony przez XSS, może być atak CSRF, a i kilka innych pomysłów też mam). Oczywiście warunek jest taki, by użytkownik najpierw podał kod PIN, ale mając na uwadze fakt, że zwykle przy operacji uwierzytelnienia będzie wcześniej wykorzystany podpis cyfrowy (mówię o implementacji bankowości internetowej, która wykorzystuje podpis cyfrowy do autoryzacji transakcji), to można założyć, że po uwierzytelnieniu PIN będzie grzecznie już czekał w pamięci i użytkownik nie zostanie poproszony o jego podanie przy kolejnej operacji podpisu.
Nie podam tutaj szczegółów, ale po krótkiej zabawie debuggerem (a jestem w tym naprawdę słaby), znalazłem trzy miejsca w pamięci procesu, gdzie PIN zostaje zapisany. Są one stałe i relatywne do adresu, pod którym została załadowana biblioteka CSP obsługująca te karty).
Chyba wygoda wygrała z bezpieczeństwem...