Tym razem problem, znaleziony przez Andreasa Bogka, dotyczy generatora liczb pseudolosowych. Ze względu na tematykę, wydaje się być błahy, jednak może mieć on głębsze znaczenie dla bezpieczeństwa wielu aplikacji.Generowanie losowych wartości dla komputerów zawsze było problemem praktycznie niemożliwym do rozwiązania. Jedynym prawdziwym źródłem wartości losowej może być świat zewnętrzny. Jednak w większości przypadków wystarczą nam tzw. liczby pseudolosowe – wartości nie w pełni losowe, jednak wystarczająco przypadkowe, by nie dało się na ich podstawie odgadnąć wartości uzyskanych w kolejnych losowaniach.
Haker Samy Kamkar udowodnił, że generator liczb pseudolosowych w PHP, oparty na najpopularniejszym algorytmie Liniowego Generatora Kongruentnego nie jest bezpieczny. Udowodnił on, że w prosty sposób jest w stanie przewidzieć przyszłe wygenerowane wartości. Warto przy tym wspomnieć, że w aplikacjach on-line, tego generatora używa się do tworzenie identyfikatora sesji – „losowego” ciągu znaków identyfikującego dane połączenie użytkownika z aplikacją. Przechwycenie tego numeru może umożliwić podłączenie się do aplikacji jako dany użytkownik.
Wróćmy do naszego hackera. Jego skrypt nie daje stuprocentowej pewności przewidzenia kolejnego identyfikatora, jednak wypróbowanie pozostałych możliwości stało się wykonalne. W związku z tym, w PHP od wersji 5.3.2 oraz 5.2.1.13 wprowadzono zmiany mające uniemożliwić przewidywanie wartości wyników generatora liczb pseudolosowych.
Jak zauważył Andreas Bogk, rozwiązanie zastosowane przez programistów daje naprawdę niewiele. W pewnym momencie wykonywania skryptu, do wartości obliczeń dodaje się kolejną wartość uzyskaną na podstawie liczby mikrosekund w aktualnym czasie. W związku z tym złamanie tak „poprawionego” generatora wcale nie stało się dużo trudniejsze. Pełna analiza eksperta w poście Advisory na http://seclist.org/.
Dokument ukazał się dopiero dwa dni temu, więc na dzień dzisiejszy nie powstało żadne uaktualnienie PHP rozwiązujące ten drażliwy problem. Bezpieczni są użytkownicy serwerów z zainstalowanym PHP z dodatkiem Suhosin – zaawansowanym systemem zabezpieczeń PHP. Jeżeli nie mamy możliwości wdrożenia tego na naszym serwerze, dobrym pomysłem jest wprowadzenie sprawdzania adresu IP użytkownika podczas walidacji identyfikatora sesji. Utrudni to życie znikomej liczbie użytkowników o stale zmiennym IP, lecz sprawi, że nasza aplikacja będzie znacznie bezpieczniejsza.
Leave a Reply