Podatność w FreeScout (aplikacja help desk oparta na Laravel) umożliwia anonimowemu atakującemu przejęcie kontroli nad kontem aktywowanego użytkownika bez żadnego uwierzytelnienia. Błąd jest krytyczny, ponieważ pozwala na pełne przejęcie konta administratora lub agenta wsparcia.
▸ Pokaż oryginał (EN)
FreeScout is a free help desk and shared inbox built with PHP's Laravel framework. Prior to version 1.8.224, the public endpoint `POST /user-setup/{hash}/{invite_sent_at}` (`OpenController@userSetupSave`) selects the target account solely by its `invite_hash` column, then overwrites that account's email and password and logs in as it. No authentication, cookie, or prior session is required. After a user activates, FreeScout sets `invite_hash` to the empty string. On MySQL and MariaDB, `VARCHAR` equality ignores trailing spaces, so a single URL-encoded space (`%20`) matches the stored empty string and selects the lowest-id activated user. The expiry guard decrypts `invite_sent_at` with the target's password hash, but `Helper::decrypt` returns its raw input unchanged when decryption fails. A plaintext numeric value such as `9999999999` therefore passes the time-to-live check without any secret. The result is that an anonymous attacker sets the email and password of the lowest-id activated FreeScout account (a support agent, or an administrator if one was added by invitation) and authenticates as that account. Version 1.8.224 contains a fix.
Publiczny endpoint `POST /user-setup/{hash}/{invite_sent_at}` wyszukuje konto wyłącznie na podstawie kolumny `invite_hash`. Po aktywacji konta FreeScout ustawia `invite_hash` na pusty ciąg znaków, jednak MySQL i MariaDB ignorują spacje końcowe przy porównywaniu wartości `VARCHAR`, co oznacza, że pojedyncza spacja zakodowana jako `%20` dopasowuje pusty ciąg i wskazuje na konto o najniższym identyfikatorze. Mechanizm sprawdzania ważności zaproszenia (`invite_sent_at`) opiera się na odszyfrowaniu wartości hashem hasła, ale funkcja `Helper::decrypt` zwraca dane wejściowe bez zmian, gdy odszyfrowywanie się nie powiedzie — tym samym dowolna wartość liczbowa (np. `9999999999`) przechodzi weryfikację. W efekcie atakujący nadpisuje adres e-mail i hasło wybranego konta, a następnie loguje się na nie bez znajomości żadnego sekretu.
Anonimowy atakujący może przejąć kontrolę nad kontem agenta wsparcia lub administratora (jeśli administrator był dodany przez zaproszenie), zmieniając jego adres e-mail i hasło, a następnie logując się jako ten użytkownik z pełnymi uprawnieniami.
Należy zaktualizować FreeScout do wersji 1.8.224, która zawiera poprawkę eliminującą opisaną podatność. Brak możliwości natychmiastowej aktualizacji powinien skutkować ograniczeniem dostępu do endpointu `/user-setup/` na poziomie firewall lub serwera WWW.
FreeScout w wersjach wcześniejszych niż 1.8.224, działający na bazie danych MySQL lub MariaDB
Podatność wymaga bazy danych MySQL lub MariaDB — jej wystąpienie jest uzależnione od specyficznego zachowania tych silników przy porównywaniu wartości VARCHAR z pustym ciągiem znaków. Szczegóły opublikowano w ramach GitHub Security Advisory GHSA-jqj5-r72v-v29g.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L