Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
Adminie… Czy znamy Twoje grzechy? ;-) Sprawdź!
W pierwszej połowie marca 2021 u wszystkich użytkowników GitHuba wymuszono ponowne zalogowanie się, po tym jak część użytkowników zostawała nieoczekiwanie zalogowana na cudze konta. Wczoraj GitHub opublikował szczegóły tego błędu.
Okazało się, że przyczyną błędu był race condition w zarządzaniu sesjami.
W skrócie: interfejs GitHuba jest napisany w oparciu o framework Ruby on Rails, który z kolei jest uruchomiony na serwerze Unicorn Rack. Aplikacja ta jest wielowątkowa, a zadaniem jednego z wątków jest obsługa wyjątków. Jak informuje GitHub, zespół miał świadomość, że pewne komponenty tego kodu nie są przystosowane do działania na wielu wątkach (nie są więc thread-safe), choć nie sądzono, że będzie to miało wpływ na tę część, którą widzą użytkownicy. Ryzykiem, jakiego się spodziewano, były co najwyżej błędne informacje zostawione w wewnętrznych logach.
Gdy serwera Rack obsługuje żądania http, wykorzystuje obiekt env zawierający odpowiednik zmiennych środowiskowych, choć de facto mogą tam być przechowywane dowolne obiekty. Okazało się, że nowa instancja obiektu nie jest tworzona dla każdego żądania http, tylko obiekt ten jest czyszczony na końcu, a następnie wykorzystywany jeszcze raz. Okazało się więc, że wątek odpowiadający za raportowanie wyjątków mógł pobrać env w momencie, gdy przetwarzane było jedno żądanie, a zapisać coś do env, gdy przetwarzane było już inne żądanie. Stąd nagle użytkownik otrzymywał ciasteczka należące do kogoś innego.
Dobrze obrazuje to poniższy diagram:

Przeanalizujmy zatem co się dzieje:
env.env, który w tym momencie zawiera już dane z innego zapytania, niż to, w którym oryginalnie wystąpił wyjątek!env. Ale w tym momencie env powiązane jest z zapytaniem #3!Błąd jest więc bardzo poważny, ale jak widać – musiały wystąpić specyficzne zapytania w specyficznej kolejności, by mógł wystąpić. Tak czy owak, ciekawa analiza ze strony GitHuba i brawa za otwartość!
Po więcej szczegółów odsyłamy do oficjalnej notki z blogu GitHuba.
— Michał Bentkowski