Pytanie:
Czy informowanie użytkownika, jakie znaki wejściowe są prawidłowe / nieprawidłowe, jest luką w zabezpieczeniach?
csrowell
2020-01-15 02:41:57 UTC
view on stackexchange narkive permalink

Czy podczas sprawdzania poprawności danych wejściowych w witrynie internetowej są jakieś obawy dotyczące bezpieczeństwa związane z ujawnieniem użytkownikowi dokładnie, jakie znaki są prawidłowe lub nieprawidłowe w danym polu?

CWE-200: Ujawnianie informacji mówi, że należy starać się nie ujawniać informacji, „które mogą być przydatne podczas ataku, ale normalnie nie są dostępne dla atakującego”. Konkretnym przykładem może być zapobieganie ujawnianiu przez system śladów stosu (rozwiązane w CWE-209: ujawnianie informacji poprzez komunikat o błędzie).

Czy należy upewnić się, że komunikaty o błędach są niejasne, np. „Wprowadzony tekst zawiera nieprawidłowe znaki”?

Czy uwzględnienie wyrażeń regularnych używanych do sprawdzania poprawności danych wejściowych w kodzie po stronie klienta, takich jak JavaScript, które byłyby widoczne dla atakujących, stanowi lukę w zabezpieczeniach? Alternatywa, sprawdzanie poprawności danych wejściowych po stronie serwera, zmniejszyłaby nieco użyteczność, ponieważ wymagałaby większej komunikacji wewnętrznej (np. Mogłaby spowodować, że witryna będzie odpowiadać i wyświetlać błędy wolniej).

A może jest to forma „zabezpieczenia przez zaciemnienie”, ponieważ użytkownik / atakujący może wywnioskować, jakie znaki są prawidłowe, wielokrotnie przesyłając różne znaki, aby sprawdzić, czy powodują błędy?

Czy warto skorzystać z wrażeń użytkownika, aby potencjalnie spowolnić atak?

O ile wiem, powinienem zwrócić uwagę na Arkusz weryfikacji danych wejściowych OWASP i Przewodnik po programach sprawdzania poprawności danych nie zawierają wskazówek na ten temat.

Edytuj 17.01.2020:

Było kilka pytań (w tym odpowiedzi, na które podjąłem wysiłek pisania komentarzy, które od tego czasu usunięte), aby dowiedzieć się, dlaczego należy wykonywać walidację danych wejściowych.

Po pierwsze, dziękuję @Loek za komentarz wskazujący na standard weryfikacji bezpieczeństwa aplikacji OWASP, który zawiera wskazówki dotyczące haseł na stronach 21 i 22: „Sprawdź, czy nie ma reguł tworzenia haseł ograniczających rodzaj dozwolonych znaków. Nie powinno być wymagań dotyczących wielkich lub małych liter, cyfr ani znaków specjalnych. ”.

Myślę, że wszyscy możemy się zgodzić, że ograniczanie znaków w haśle jest ogólnie złym pomysłem (patrz odpowiedź @ Merchako). Jak wskazuje @emory, prawdopodobnie nie może to być trudna i szybka reguła (np. Widziałem wiele aplikacji mobilnych, które używają łatwiejszego w użyciu dodatkowego „kodu PIN” do zabezpieczenia aplikacji, nawet jeśli ktoś inny ma do nich dostęp aby zalogować się do urządzenia). Kiedy zadawałem to pytanie, nie miałem na myśli haseł, ale w tym kierunku poszły komentarze i odpowiedzi. Więc na potrzeby tego pytania rozważmy, że dotyczy ono pól innych niż hasła.

Walidacja danych wejściowych jest częścią „głębokiej obrony” dla witryny internetowe, usługi internetowe i aplikacje, aby zapobiegać atakom polegającym na wstrzykiwaniu. Ataki typu „wstrzykiwanie”, jak stwierdza OWASP, „mogą skutkować utratą danych, uszkodzeniem lub ujawnieniem danych nieupoważnionym stronom, utratą odpowiedzialności lub odmową dostępu. Iniekcja może czasami prowadzić do całkowitego przejęcia hosta. Wpływ na biznes zależy od potrzeb aplikacji i danych ”.

Zobacz lukę nr 1 w OWASP, A1-Injection i CWE-20: Niewłaściwa weryfikacja danych wejściowych, aby uzyskać bardziej szczegółowe informacje. Zauważ, że obaj twierdzą, że sprawdzanie poprawności danych wejściowych nie jest pełną obroną, ale raczej jedną warstwą tej „głębokiej obrony” dla oprogramowania.

Komentarze nie służą do rozszerzonej dyskusji;ta rozmowa została [przeniesiona do czatu] (https://chat.stackexchange.com/rooms/103507/discussion-on-question-by-csrowell-is-it-a-security-vulnerability-to-tell-a-użytkownik).
@RoryAlsop Naprawdę nie rozumiem, dlaczego przeniesiono to do czatu - to nie jest tak, że toczyła się tutaj szybka rozmowa tam iz powrotem ... To również psuje moje linki do konkretnych komentarzy ... To takżestraszna użyteczność, ponieważ większość ludzi nie kliknie linku, aby przeczytać rozmowę ....
Ponad 20 komentarzy źle wpływa na czytelność, a komentarze wyraźnie nie podlegają dyskusji.Czat jest do tego odpowiednim miejscem.Wszystko, co jest istotne z tej dyskusji, można w razie potrzeby zamieścić w postach.
Pomyślałem, że dlatego ukrywają komentarze z niską liczbą głosów / brakiem głosów.To nie tak, że domyślnie pokazywał każdy komentarz.Teraz nie masz pojęcia, które komentarze były ważne lub ludzie się z nimi zgodzili (były komentarze, na które oddano ponad 40 głosów).Nie widzę sposobu, aby wyświetlić liczbę głosów na czacie.O ile wiem, zostali zniszczeni.
to jest zgodne z projektem.Komentarze mają charakter tymczasowy, aby poprosić lub zasugerować ulepszenia postu lub uzyskać jasność.
Siedem odpowiedzi:
Steffen Ullrich
2020-01-15 03:02:15 UTC
view on stackexchange narkive permalink

... które mogą być przydatne w ataku, ale zwykle nie są dostępne dla atakującego

Znajomość nieprawidłowych znaków wejściowych jest przydatna, ale atakujący może je łatwo znaleźć wystarczy kilka prób. Dlatego te informacje nie są tak naprawdę tajne, a nieświadomość wszystkim użytkownikom, co poszło nie tak, w rzeczywistości nie odstrasza napastników, a jedynie odstrasza niewinnych użytkowników, ponieważ nie mogą kontynuować.

IMO o to właśnie chodzi w pytaniu.Zgadzam się z odpowiedzią, ale to samo dzieje się z wersją serwerową, jeśli zostanie ujawniona przez nagłówki HTTP.Ta ostatnia jednak wchodzi w zakres CWE, ponieważ 1) ujawnianie znaków wejściowych jest * przydatne * dla użytkownika i łatwe do wykrycia oraz 2) wersja oprogramowania serwera * nie ma wpływu na użyteczność / kompatybilność *, jednocześnie zwiększając powierzchnię ataku
@usr-local-ΕΨΗΕΛΩΝ: W przypadku nieprawidłowych znaków atakujący może szybko dowiedzieć się, które z nich są nieważne, wypróbowując kilka.W przypadku wersji serwerowej atakujący nie może jednak łatwo określić wersji, chyba że serwer wyraźnie ją poda (w nagłówku).W związku z tym podanie wersji serwera jest problemem, gdy podaje się, które znaki są nieprawidłowe, a nie.
Chociaż sama w sobie nie jest to luka w zabezpieczeniach, gdy witryna informuje mnie, żebym nie używał w haśle znaków „'',` "`, ukośnika odwrotnego i `--`, co natychmiast stawia pod znakiem zapytania, czy występują problemy z iniekcją SQL i / lub przechowywanie zwykłego tekstudla wprowadzonych informacji.
@SeinopSys Może to być również podejście do dogłębnego bezpieczeństwa.Możesz używać sparametryzowanych zapytań wszędzie, ale także nie zezwalać na typowe znaki iniekcji SQL, jeśli można ich uniknąć w niektórych danych wejściowych.Więc jeśli ktoś wstawi możliwą lukę podczas programowania, masz szansę, że jest trochę trudniejsza do wykorzystania.
„Wersja oprogramowania serwera nie ma wpływu na użyteczność / zgodność, ale zwiększa powierzchnię ataku” ** to jest zabezpieczenie przez zaciemnienie, które niczego nie zapobiega **.Zamiast ukrywać wersję serwera, należy zaktualizować ją do bezpiecznej wersji.Leżenie / ukrywanie nie robi nic, aby zapobiec problemowi, a tylko nieco utrudnia atak.
@Vinz243: Byłoby to tylko zabezpieczenie przez zaciemnienie, gdyby serwer uruchomił niezabezpieczoną wersję oprogramowania, a administrator wiedziałby o tym i nie załatałby jej.W przeciwnym razie ukrywanie takich informacji jest tylko częścią dogłębnej obrony, tj. Utrudnia atakującemu uzyskanie informacji o infrastrukturze.
Security.SE ma już wiele dedykowanych pytań na temat ukrywania wersji serwera: [Ukrywanie wersji - wartościowe czy tylko zabezpieczenie przez zaciemnienie?] (Https://security.stackexchange.com/q/14709/10843), [Czy wyświetlaniejaki serwer używam na stronach błędów, stanowi zagrożenie dla bezpieczeństwa?] (https://security.stackexchange.com/q/4940/10843) i bardziej ogólnie [The valid role of obscurity] (https: //security.stackexchange.com / q / 2430/10843).
Merchako
2020-01-15 19:42:36 UTC
view on stackexchange narkive permalink

Stworzenie użytkownikom frustrującej psychicznie sytuacji może skłonić ich do podejmowania mniej bezpiecznych decyzji. Na przykład, próbują napisać hasło po szwedzku, ale wprowadzone dane odrzucają znak å bez wyjaśnienia. Zamiast wybierać inne dobre hasło bez å , rzucają ręce i używają password123 - takiego, które łatwo pokonać atakiem słownikowym.

W ten sposób , próbowałeś stworzyć „bezpieczniejszy” system poprzez zaciemnienie, ale kiedy weźmiemy pod uwagę zachowania użytkowników, jest on w rzeczywistości mniej bezpieczny.

Ostatecznie prawidłowe znaki można wykryć za pomocą systematycznych środków. Ukrywanie ich nie jest warte szkód, jakie możesz wyrządzić zachowaniom użytkowników.


Więcej informacji można znaleźć w artykułach „ Bezpieczeństwo i uprzedzenia poznawcze: badanie roli umysłu” i „ Pomiar wpływu polityki haseł na bezpieczeństwo przy użyciu funkcji poznawczo-behawioralnych Modelowanie oparte na agentach ”autorstwa Seana Smitha i wsp.

Słuszna uwaga.Ktoś tutaj powiedział: „Bezpieczeństwo kosztem wygody kosztuje bezpieczeństwo”.
mentallurg
2020-01-15 03:32:36 UTC
view on stackexchange narkive permalink

To zależy.

Jeśli komunikat opisuje błąd z punktu widzenia zwykłego użytkownika, np. „Trzeci znak musi być cyfrą”, nie jest to luka w zabezpieczeniach. Jednak wyświetlenie wyrażenia regularnego używanego do walidacji oznacza ujawnienie szczegółów implementacji , które mogą być słabością, np. niektóre biblioteki intensywnie używają wywołań rekurencyjnych, a niektóre wyrażenia mogą powodować przepełnienie stosu lub duże zużycie pamięci i procesora, co może prowadzić do DoS.

CWE-200 definiuje ujawnianie informacji jako słabość tylko wtedy, gdy użytkownik nie ma wyraźnego upoważnienia do dostępu do tych informacji . Rozważasz wejście użytkownika. Oznacza to, że użytkownik pozwala wprowadzić te informacje, a tym samym może zobaczyć te informacje i oczywiście może zobaczyć wszelkie komunikaty o błędach walidacji związane z tym wejściem.

inne komunikaty techniczne mogą zawierać informacje o technologiach zastosowanych w aplikacji (np. jaka wersja jakich bibliotek są używane), o środowisku (np. układ katalogu i uprawnienia, typ i wersja systemu operacyjnego) itp. Atakujący może wykorzystać te informacje do skutecznego wybieraj exploity dla tych konkretnych technologii, bibliotek, systemu operacyjnego itp. Dlatego ujawnienie takich informacji użytkownikowi jest potencjalnie słabym punktem.

Brak wyjaśnienia użytkownikowi, co jest nie tak w jego danych wejściowych, to zdecydowanie zły UX, ale nie bezpieczeństwo poprawa.

Nie myl tego z podobnymi przypadkami, gdy dane są poufne i każda związana z nimi walidacja może być poufna. Na przykład, jeśli użytkownik wprowadził litery w polu, w którym spodziewasz się roku, wyjaśnienie tego błędu użytkownikowi jest bezpieczne. Jeśli jednak użytkownik poda adres e-mail, a Ty sprawdzisz, czy jest on zarejestrowany w Twoim systemie, to każda informacja (adres jest znany, adres nieznany) może być słabym punktem. Dlatego jeśli zamierzasz wdrożyć komunikaty walidacyjne lub inne informacje zwrotne dotyczące danych wejściowych użytkownika, oceń konsekwencje. Ale domyślny zakaz przesyłania opinii dla wszystkich pól może być słabym UX z fałszywym poczuciem bezpieczeństwa.

Przepraszamy, nie było moim zamiarem sugerowanie użytkownikowi wyświetlania wyrażenia regularnego.To było bardziej podobne do zastanawiania się, czy wyrażenie regularne nie powinno być osadzone w kodzie po stronie klienta.Poprawię moje pytanie, aby było jaśniejsze.
@csrowell Nie zapominaj, że WSZYSTKO po stronie klienta jest „pokazane”.Nawet jeśli nie pokazujesz go na ekranie, jest on pokazywany szkodliwemu typowi użytkownika (który z pewnością przegląda cały kod klienta, który dostaje).
@Thomas: tak i myślę, że o to chodziło OP.Czy można bezpiecznie używać wyrażeń regularnych w języku JS po stronie klienta w kodzie, który pomaga użytkownikowi dowiedzieć się, dlaczego jego dane wejściowe były nieprawidłowe?(Ponieważ to ujawni zasady atakującym).
@PeterCordes Nie widzę, jakie to ma znaczenie, ponieważ sprawdzenie musi nadal zostać zduplikowane na serwerze (w przeciwnym razie złośliwy użytkownik mógłby stworzyć niedopuszczalne hasło i przesłać je, omijając kontrolę po stronie klienta).Jeśli sprawdzasz już po stronie klienta, a nie po stronie serwera (na przykład w celu zmniejszenia obciążenia serwera w przypadku nieprawidłowych prób), nie ma sensu ukrywać niedopuszczalnych znaków,
@DanM .: Tak, odpowiedź na pytanie jest taka, że utrzymywanie tego w ukryciu bardziej szkodzi użyteczności niż pomaga cokolwiek bronić.Próbuję tylko określić, o co pytał OP, a nie zadawać tego sam.
Filipe dos Santos
2020-01-15 02:56:49 UTC
view on stackexchange narkive permalink

To tylko jeden z wielu scenariuszy, w których oczekuje się kompromisów między bezpieczeństwem a użytecznością systemu.

Istnieje jednak ogromna różnica między wyświetlaniem śladów stosu (słaba obsługa błędów) a zrzeczenie się, które znaki są oczekiwane lub zabronione w polu wejściowym.

W większości scenariuszy można argumentować, że zrzeczenie się, które znaki są oczekiwane lub zabronione w polu wejściowym, nie jest luką w zabezpieczeniach w ogóle, jeśli istnieją inne mechanizmy bezpieczeństwa, takie jak ograniczanie prób podania hasła.

Na podstawie modelu modelowania zagrożeń można stwierdzić, że jest to akceptowane ryzyko systemowe.

dandavis
2020-01-15 03:57:37 UTC
view on stackexchange narkive permalink

Niewidzialność to nie bezpieczeństwo. Dobry system jest bezpieczny nawet wtedy, gdy atakujący wie o nim wszystko. W twoim przypadku zredukowanie zmarnowanych przypuszczeń dotyczących pęknięć o pewien procent, powiedzmy 25%, nie powinno osłabić praktyczności pękania: 1 bilion lat jest tak samo praktyczny jak 0,75 biliona lat. Niezamknięte szczegóły implementacji pomagają również nowym dobrym ludziom w obronie.

Są też kwestie społeczne. Znak „UWAŻAJ NA DOG” może spowodować ujawnienie szczegółów implementacji zabezpieczeń, ale także zniechęca do przeprowadzania pewnej skali typowych ataków. Pies pomaga, znany lub nieznany, ale znak może obniżyć koszty utrzymania ogrodzenia, co uwalnia zasoby do toczenia innych bitew.

„Dobry system jest bezpieczny, nawet jeśli osoba atakująca wie o nim wszystko”.Ta konwencjonalna mądrość jest oczywiście prawdziwa.Ale jeśli nie odniesiesz żadnej korzyści z ujawnienia informacji użytkownikowi, nie rób tego.Dzieje się tak, ponieważ skomplikowane systemy w zasadzie nigdy nie są w 100% bezpieczne.W tym konkretnym przypadku istnieje oczywiście ogromna korzyść z użyteczności i zdecydowanie nie jest to problem z bezpieczeństwem, ale musisz zachować ostrożność, stosując tę logikę do ogólnego przypadku
bolov
2020-01-17 20:49:45 UTC
view on stackexchange narkive permalink

Inne odpowiedzi pokazują, że ujawnienie tego nie jest kwestią bezpieczeństwa.

Będę spierał się z prawdziwą anegdotą, że nieujawnianie może prowadzić nie tylko do frustracji użytkowników, ale nawet do obniżenia bezpieczeństwa.

Zdarzyło mi się to więcej niż raz w witrynach, w których nie było jasne, jakie znaki są dozwolone. W tamtym czasie nie korzystałem z generatora haseł, więc miałem mentalny schemat zapamiętywania haseł. Wymagało to użycia kilku znaków specjalnych, takich jak $ @. & . Kilka sfrustrowanych prób, w których otrzymałem tylko „nieprawidłowe znaki w haśle” i stopniowo zacząłem eliminować znaki specjalne. Potem pojawiło się „Twoje hasło nie jest wystarczająco bezpieczne, spróbuj dodać kilka cyfr i symboli” ... tak ... w tym momencie jestem zdecydowanie zrelaksowany.

W końcu udało mi się zaakceptować moje hasło. Który nie tylko zawierał tylko jeden znak specjalny, ale także nie pasował do żadnego z moich schematów zapamiętywania haseł, więc musiałem ... hmm ... przechowywać go gdzie indziej (to było zanim jeszcze wiedziałem o menedżerach haseł, więc pozwolę wyobrażasz sobie, jak go zabezpieczyłem. Powiem ci, że był jak helikopter i jak sznurek).

Sango
2020-01-15 18:45:33 UTC
view on stackexchange narkive permalink

Nie widzę problemu w ujawnieniu zestawu znaków, z których użytkownik może wybierać, o ile te zasady są z jednej strony również egzekwowane i sprawdzane. To znaczy, jeśli użytkownik nie może używać \ w polu, nie wystarczy to sprawdzić w wejściu JS, ale także przed wpisaniem tego, tj. W DB i kiedy dane są używane. Tak więc zasady muszą obowiązywać przez cały czas (TOCTOU). Druga część jest taka, że ​​nie ma problemu ze zmniejszeniem zestawu znaków, o ile nadal jest podana entropia. Możesz zredukować znaki hasła do „a” i „b”, ale wtedy musisz odpowiednio zwiększyć minimalną długość PW (i sprawdzić, czy nie tylko przytrzymują klawisz „a”, dopóki nie będzie wystarczająco długi). Przy wystarczająco długim (losowym) haśle byłoby to również bezpieczne hasło W końcu wszystko, co jest do znaku, to bity, a każdy wie, że to 0 & 1, więc (prawdziwy) alfabet jest zawsze znany, jak jest wiele możliwych ustaleń, które musisz określić (i sprawdzić).



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...