Biblioteka Better Auth zawiera podatność typu race condition w endpoincie POST /oauth2/token, umożliwiającą wielokrotne wykorzystanie tego samego refresh token. Błąd pozwala atakującemu na tworzenie rozgałęzionych rodzin tokenów odświeżania, co stanowi poważne zagrożenie dla bezpieczeństwa sesji użytkowników.
▸ Pokaż oryginał (EN)
Better Auth is an authentication and authorization library for TypeScript. From 1.4.8-beta.7 until 1.6.11, the @better-auth/oauth-provider POST /oauth2/token endpoint on the refresh_token grant performs a non-atomic read, validate, revoke, and mint sequence on the oauthRefreshToken row, allowing concurrent requests with the same parent refresh token to pass the revoked check and create forked refresh-token families; the vulnerable range also includes embedded better-auth plugin versions before 1.6.0. This issue is fixed in version 1.6.11.
Endpoint obsługujący grant typu refresh_token wykonuje sekwencję operacji odczytu, walidacji, unieważnienia i wydania nowego tokenu w sposób nieatomowy — bez blokady transakcyjnej na rekordzie oauthRefreshToken. Wysyłając równoczesne żądania z tym samym refresh token, atakujący może sprawić, że wiele z nich przejdzie pomyślnie przez sprawdzenie stanu unieważnienia, zanim którekolwiek z nich zdąży zapisać informację o unieważnieniu. W efekcie powstają rozgałęzione rodziny tokenów odświeżania (forked refresh-token families), co łamie założenie jednorazowego użycia refresh token.
Atakujący, który wszedł w posiadanie ważnego refresh token, może wielokrotnie go wykorzystać do uzyskania kolejnych tokenów dostępu, skutecznie utrzymując nieuprawniony dostęp do konta ofiary nawet po tym, gdy pierwotny token powinien zostać unieważniony. Prowadzi to do naruszenia poufności oraz integralności danych chronionych przez OAuth2.
Należy zaktualizować Better Auth do wersji 1.6.11, w której problem został naprawiony. Poprawka dostępna jest w repozytorium projektu (commit c6918ecc9e3a75892169415d7f6c95b591b6a52d) oraz w oficjalnym wydaniu v1.6.11.
Better Auth w wersjach od 1.4.8-beta.7 do 1.6.10 (włącznie), pakiet @better-auth/oauth-provider w tym samym zakresie oraz wbudowany plugin Better Auth przed wersją 1.6.0.
Podatność dotyczy wyłącznie wdrożeń korzystających z funkcjonalności OAuth2 Provider (endpoint /oauth2/token z grantem refresh_token). Aplikacje niewystawiające własnego serwera autoryzacji OAuth2 nie są bezpośrednio narażone.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:NBetter Auth
APPBetter-Auth1.4.81.4.9 – 1.6.11 (bez)Better Auth Better Auth\/oauth Provider
APPBetter-Auth1.6.0 – 1.6.11 (bez)
Powiązane podatności
Better Auth: pominięcie weryfikacji client_secret w endpointach OAuth token
SSRF w Better Auth — niezweryfikowane endpointy OIDC w pluginie SSO
Race condition w Better Auth umożliwia wielokrotne użycie kodu autoryzacyjnego OAuth2
Better Auth: błędna autoryzacja w pluginie deviceAuthorization umożliwia przejęcie sesji urządzenia
Better Auth: Pominięcie weryfikacji e-mail przy akceptacji zaproszeń do organizacji