CVE-2026-77561
ŚrednieCVSS 5.3Streszczenie
Tinyauth przed wersją 5.1.0 pozwala nieuwierzytelnionemu zdalnemu atakującemu wysłać żądania POST /api/user/login z 257 różnymi nieistniejącymi nazwami użytkowników, aby wypełnić MaxLoginAttemptRecords i aktywować globalną blokadę logowania. Funkcja IsAccountLocked sprawdza ten globalny stan przed walidacją niepowiązanych kont, powodując, że prawidłowi użytkownicy otrzymują HTTP 429 przez około 300 sekund.
Ocena ryzyka
Atakujący może wywołać globalną blokadę logowania i uniemożliwić prawidłowym użytkownikom dostęp do usługi. Atak można powtarzać, choć istniejące sesje uwierzytelnione nie są unieważniane.
Rekomendacja
Zaktualizuj Tinyauth do wersji 5.1.0 lub nowszej, która naprawia globalną blokadę logowania. Rozważ ograniczenie liczby prób logowania na podstawie adresu IP i monitorowanie nietypowych wzorców.
Inne podatności w Tinyauth
Zobacz wszystkie- CVE-2026-77582Średnie
Tinyauth przed wersją 5.1.0 ujawnia zdalnie obserwowalną różnicę czasową między próbami uwierzytelnienia dla istniejących i nieistniejących lokalnych nazw użytkowników. Funkcje loginHandler i basicAuth zwracają szybko po zgłoszeniu brakującego użytkownika, podczas gdy istniejący użytkownik powoduje wykonanie kosztownej weryfikacji hasła bcrypt.
- CVE-2026-77560Wysokie
W Tinyauth przed wersją 5.1.2 porównywanie przekazywanych nazw hostów odbywa się z rozróżnianiem wielkości liter, podczas gdy reverse proxy routuje równoważne nazwy hostów bez rozróżniania wielkości liter. Uwierzytelniony użytkownik o niskich uprawnieniach może obejść kontrolę dostępu do aplikacji, używając nazwy hosta o innej wielkości liter, ponieważ wyszukiwanie może nie znaleźć skonfigurowanej aplikacji i zwrócić pusty obiekt kontroli dostępu, który jest traktowany jako zezwalający.
Oryginalny opis (angielski, źródło NVD)
Tinyauth is an authentication and authorization server. Prior to 5.1.0, an unauthenticated remote attacker can send POST /api/user/login requests with 257 distinct nonexistent usernames to fill MaxLoginAttemptRecords and activate a global login lockdown. internal/controller/user_controller.go loginHandler passes each attacker-controlled identifier to internal/service/auth_service.go RecordLoginAttempt, which invokes lockdownMode after the map reaches its cap. IsAccountLocked checks that global state before validating unrelated accounts, causing valid users to receive HTTP 429 until auth.loginTimeout expires, approximately 300 seconds by default. The attack can be repeated, but existing authenticated sessions are not invalidated. This issue is fixed in version 5.1.0.

