Główna » Java

Problemy z bezpieczeństwem w Springframework MVC

18 August 2008 Brak komentarzy

Witam,

Sprawa dość świeża (2008-07-07) – i godna uwagi.
Badania jakie przeprowadzili pracownicy Ounce Lab, potwierdzone zresztą przez Spring Source pokazują bardzo niebezpieczną lukę w technologi MVS zastosowanej w frameworku – zgodzę się tu z twórcami technologi – iż nie wynika ona z błędu – ale raczej z sposobu użycia tejże.

Ale do sedna. Niebezpieczeństwo to dotyka implementacji kontrolerów formularzy – zarówno standardowego jak i tzw. wizard’a – AbstractWizardFormController – (formularza wielostronicowego – inaczej też – kreatora). Spring, mówiąc krótko i zwięźle binduje wszystkie znalezione elementy zapytania (request) do obiektu formularza – przy tym używa nazwy elementu zapytania by zidentyfikować odpowiedni atrybut formularza. W czym problem – a no w tym, iż nie koniecznie wszystkie atrybuty obiektu forularza chcemy udostępnić do edycji – tu wcześniej zastanowił bym się – czy to nie błąd w samym użyciu obiektu formularza – kwestia dyskusyjna, jednak – i tu jawi się nawet większe niebezpieczeństwo, w przypadku wizard’a możliwe jest np. obejście walidacji, zmiana wyboru dokonanego na wcześniejszej stronie i.t.p..

Bez paniki – jest na to sposób:

  1. Zawsze nadpisuj domyślną implementację initBinder(HttpServletRequest, ServletRequestDataBinder) i w niej użyj metod setAllowedFields(String[]) oraz ewentualnie setDisallowedFields(String[]) należących do ServletRequestDataBinder – aczkolwiek, w wypadku drugiej metod warto się zastanowić – jak już wcześniej wspomniałem – czy jeśli chcemy zabronić dostępu do danego pola – to czy winno ono wogule znaleźć się w formularzu.
  2. W przypadku wizard’a – w initBinder możesz użyć metody getCurrentPage(HttpServletRequest) i w zależności która strona jest aktualnie przetważana – zazwolić na bindowanie odpowiednich pól. I tu uwaga, w zaleceniach z Spring Source tego nie ma – ale użycie getCurrentPage(HttpServletRequest) spowoduje wyjątek przy pierwszym wyświetleniu formularza – więc należy użyć isFormSubmition – jeśli nie – to znaczy, że formularz jest wyświetlany pierwszy raz.

Drugi problem – prawdopodobnie rzadziej występujący – aczkolwiek bardzo niebezpieczny – to sposób w jaki Springframework w MVS znajduje “widok”.  Jeżeli nasza aplikacja używa danych użytkownika jako nazwy widoku – możliwe jest odgadnięcie wewnętrznej struktury plików – i jeżeli podany widok istnieje jako plik w systemie, klient może do niego uzyskać dostęp. Rozwiązanie jest proste – nigdy nie używaj danych wejściowych użytkownika jako nazwy widoku.

Zostaw odpowiedź!

Musisz się zalogować aby móc komentować.