Preorder drugiego tomu książki sekuraka: Wprowadzenie do bezpieczeństwa IT. -15% z kodem: sekurak-book
Jak przy włączonym 2FA można się zalogować na dowolnego użytkownika i to bez znajomości jego hasła!? (podatność w popularnym pluginie do WordPressa).
„Really Simple Security – Simple and Performant Security” to dość popularny plugin do WordPressa (~4000000 instalacji). Jak można się domyśleć, służy on do dodatkowego zabezpieczenia instalacji WordPressa….
Przechodząc do szczegółów – podatność CVE-2024-10924 występuje w API REST pluginu (można ją wykorzystać kiedy 2FA zostało aktywowane w pluginie; „na szczęście” jest to domyślnie wyłączone).
Atakujący może bez żadnego hasła ani nawet loginu zalogować się jako dowolny user w WordPress (również jako administrator). Od strony technicznej, wystarczy w odpowiednim żądaniu HTTP podać id użytkownika, na którego chcemy się zalogować (np. id=1) i … w zasadzie tyle. Badacze opisują to tak:
This means that even in the case of an invalid nonce, the function processing continues and invokes authenticate_and_redirect(), which authenticates the user based on the user id passed in the request, even when that user’s identity hasn’t been verified.
Od strony kodu – funkcja check_login_and_get_user() powinna sprawdzić czy użytkownik jest zalogowany. No i sprawdza, ale programiści nic z tym wynikiem nie robią, tylko uruchamiają funkcję authenticate_and_redirect() – która loguje użytkownika o identyfikatorze user_id:
~ms
Chciałbym, żeby to wyglądało jakby ktoś liczył, że ta funkcja check login wywali jakiegoś exceptiona i nie dojdzie do linijki z returnem, chociaż… gdyby tak było, to powinniśmy być try/catch.
Prędzej wygląda to tak, jakby ktoś debugowo sobie ustawił łatwe logowanie i zapomniał…
A gdzie art o APT?
Nazwa tego pluginu brzmiałaby dla mnie bardzo podejrzanie ;)
Nie ma czegoś takiego jak simple security. Jeśli jest, to tylko przez chwilę, bo opiera się na jakimś triku. A triki łatwo obejść.
Jak widzę metody z nazwami „get_user_by” to przypomona mi się jak się kodowało 20 lat temu bez żadnych standardów :) Za takie coś dzisiaj seniorzy obcinają łapki.
Ale ten get_user_by to standardowa funkcja WordPress, sprawdź dokumentację, może i rączki ucinają, ale ona zapewne istnieje od zarania wordpressa
Adrian, nie czepiaj się. Przyszedł junior i chciał poszpanować.
Z ciekawości pytam – dlaczego? Co złego jest w takiej nazwie i jak powinno być „zgodnie ze standardem”?