Ujawnianie identyfikatorów baz danych - zagrożenie bezpieczeństwa?

140

Słyszałem, że ujawnianie identyfikatorów baz danych (na przykład w adresach URL) jest zagrożeniem dla bezpieczeństwa, ale nie rozumiem, dlaczego.

Jakieś opinie lub linki na temat tego, dlaczego jest to ryzyko lub dlaczego tak nie jest?

EDYCJA: oczywiście dostęp jest ograniczony, np. Jeśli nie widzisz zasobu foo?id=123, pojawi się strona błędu. W przeciwnym razie sam adres URL powinien być tajny.

EDYTUJ: jeśli adres URL jest tajny, prawdopodobnie będzie zawierał wygenerowany token, który ma ograniczony czas życia, np. Ważny przez 1 godzinę i może być użyty tylko raz.

EDYTUJ (miesiące później): moją obecną preferowaną praktyką jest używanie UUIDS do identyfikatorów i ujawnianie ich. Jeśli używam numerów sekwencyjnych (zwykle dla wydajności na niektórych bazach danych) jako identyfikatorów, lubię generować token UUID dla każdego wpisu jako klucz alternatywny i ujawniać to.

orip
źródło

Odpowiedzi:

117

Istnieje ryzyko związane z ujawnianiem identyfikatorów baz danych. Z drugiej strony projektowanie aplikacji internetowych bez ich ujawniania byłoby niezwykle uciążliwe. Dlatego ważne jest, aby rozumieć ryzyko i uważać, aby im zaradzić.

Pierwszym zagrożeniem jest to, co OWASP nazwał „niezabezpieczonymi bezpośrednimi odniesieniami do obiektów”. Jeśli ktoś odkryje identyfikator jednostki, a Twoja aplikacja nie ma wystarczających mechanizmów kontroli autoryzacji, aby temu zapobiec, może zrobić rzeczy, których nie zamierzałeś.

Oto kilka dobrych zasad, których należy przestrzegać:

  1. Użyj zabezpieczeń opartych na rolach, aby kontrolować dostęp do operacji. Sposób, w jaki to się robi, zależy od wybranej platformy i struktury, ale wiele z nich obsługuje deklaratywny model zabezpieczeń, który automatycznie przekierowuje przeglądarki do etapu uwierzytelniania, gdy działanie wymaga pewnych uprawnień.
  2. Użyj zabezpieczeń programistycznych, aby kontrolować dostęp do obiektu. Jest to trudniejsze do zrobienia na poziomie struktury. Częściej jest to coś, co musisz wpisać do swojego kodu i dlatego jest bardziej podatne na błędy. To sprawdzenie wykracza poza sprawdzanie oparte na rolach, zapewniając nie tylko, że użytkownik ma uprawnienia do operacji, ale także ma niezbędne uprawnienia do konkretnego modyfikowanego obiektu. W systemie opartym na rolach łatwo jest sprawdzić, czy tylko menedżerowie mogą dawać podwyżki, ale poza tym należy upewnić się, że pracownik należy do działu konkretnego menedżera.

Istnieją schematy ukrywania prawdziwego identyfikatora przed użytkownikiem końcowym (np. Mapowanie między rzeczywistym identyfikatorem a tymczasowym, specyficznym dla użytkownika identyfikatorem na serwerze), ale argumentowałbym, że jest to forma zabezpieczenia przez zaciemnienie. Chcę skupić się na zachowaniu prawdziwych tajemnic kryptograficznych, a nie na próbach ukrycia danych aplikacji. W kontekście sieciowym jest to również sprzeczne z szeroko stosowanym projektem REST, w którym identyfikatory często pojawiają się w adresach URL w celu adresowania zasobu, który podlega kontroli dostępu.

Kolejnym wyzwaniem jest przewidywanie lub odkrycie identyfikatorów. Najłatwiejszym sposobem dla atakującego na wykrycie nieautoryzowanego obiektu jest odgadnięcie go na podstawie sekwencji numeracji. Poniższe wskazówki mogą pomóc złagodzić ten problem:

  1. Ujawnij tylko nieprzewidywalne identyfikatory. Ze względu na wydajność możesz użyć numerów sekwencyjnych w relacjach klucza obcego w bazie danych, ale każda jednostka, do której chcesz się odwoływać z aplikacji internetowej, powinna również mieć nieprzewidywalny identyfikator zastępczy. To jedyne, które powinno być kiedykolwiek ujawnione klientowi. Używanie do tego losowych identyfikatorów UUID jest praktycznym rozwiązaniem do przypisywania tych kluczy zastępczych, nawet jeśli nie są one bezpieczne kryptograficznie.

  2. Jednak jednym z miejsc, w których kryptograficznie nieprzewidywalne identyfikatory są konieczne, są identyfikatory sesji lub inne tokeny uwierzytelniające, w których sam identyfikator uwierzytelnia żądanie. Powinny one zostać wygenerowane przez kryptograficzną RNG.

erickson
źródło
29
IMO, dodawanie nieprzewidywalnych identyfikatorów jest podejściem „zabezpieczenia przez zaciemnienie” i może prowadzić do fałszywego poczucia bezpieczeństwa. Lepiej jest skupić się na (1) i (2) i upewnić się, że kontrola dostępu jest solidna.
stucampbell
4
Korzystanie z kryptograficznego RNG zdecydowanie nie jest „zabezpieczeniem poprzez zaciemnienie”. Atakujący nie jest bliżej odgadnięcia identyfikatorów obiektów, nawet jeśli wie, w jaki sposób je generujesz. Bezpieczeństwo dzięki niejasności oznacza, że ​​jeśli algorytm, z którego korzystasz, zostanie wykryty, można go wykorzystać. Nie odnosi się do zachowania tajemnic, takich jak klucze czy stan wewnętrzny RNG.
erickson
1
@stucampbell Być może, ale to nie znaczy, że w ogóle nie powinieneś używać nieprzewidywalnych identyfikatorów. Zdarzają się błędy, więc nieprzewidywalne identyfikatory są dodatkowym mechanizmem bezpieczeństwa. Poza tym kontrola dostępu nie jest jedynym powodem ich stosowania: przewidywalne identyfikatory mogą ujawnić poufne informacje, takie jak liczba nowych klientów w określonych ramach czasowych. Naprawdę nie chcesz ujawniać takich informacji.
user247702
1
@Stijn, naprawdę nie można powiedzieć, że „naprawdę nie chcę” ujawniać, ilu mam klientów. Mam na myśli to, że McDonald's ma ogromny znak mówiący, że podali 10 miliardów hamburgerów. To wcale nie jest zagrożenie bezpieczeństwa, to preferencja. Ponadto musisz się zalogować, zanim zobaczysz adresy URL w większości aplikacji, w których i tak byśmy się tym martwili. Dlatego wiedzielibyśmy, kto skrobał dane.
Wayne Bloss
1
Jedną rzeczą, o której nie wspomniałem w tej rozmowie, jest to, że z punktu widzenia rozwiązywania problemów i łatwości użytkowania, ujawnienie identyfikatorów w adresie URL może być bardzo przydatne, aby pomóc kierować użytkowników do określonego zasobu lub umożliwić im aby dokładnie powiedzieć, jakie zasoby przeglądają. W większości przypadków można uniknąć obaw związanych z analizą biznesową, rozpoczynając automatyczne zwiększanie wartości, aby zaoferować tylko jeden pomysł.
Chockomonkey,
54

Chociaż nie jest to zagrożenie dla bezpieczeństwa danych, jest to absolutnie zagrożenie bezpieczeństwa analityki biznesowej, ponieważ ujawnia zarówno rozmiar danych, jak i prędkość. Widziałem, jak szkodzi to firmom i szczegółowo opisałem ten anty-wzorzec. Chyba że budujesz eksperyment, a nie biznes, zdecydowanie sugeruję, aby Twoje prywatne identyfikatory nie były widoczne dla opinii publicznej. https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e

Piotr
źródło
5
Wreszcie rozsądna odpowiedź, która zawiera inne aspekty niż zagrożenie bezpieczeństwa.
peceps
2
To powinna być akceptowana odpowiedź. Jeśli zakładasz, że atakujący może ominąć Twoje zabezpieczenia (co zawsze powinieneś robić), nie chcesz po prostu przekazywać tego rodzaju informacji.
Kriil
@Kriil Nie muszą nawet omijać Twojego bezpieczeństwa. Wystarczy, że utworzą konto!
Peter
33

To zależy od tego, co oznaczają identyfikatory.

Rozważ witrynę, która ze względu na konkurencję nie chce ujawniać liczby członków, których ma, ale używając identyfikatorów sekwencyjnych i tak ujawnia to w adresie URL: http://some.domain.name/user?id=3933

Z drugiej strony, jeśli zamiast tego użyli nazwy logowania użytkownika: http://some.domain.name/user?id=some , nie ujawnili niczego, czego użytkownik jeszcze nie znał.

trochę
źródło
2
jeśli używasz identyfikatorów sekwencyjnych, masz rację, ale jeśli nie, to nic nie ujawnia
zamknij
@orip: Jak powiedziałem, zależy to od tego, co ktoś może odkryć, sprawdzając kilka identyfikatorów. Czy jest jakiś wzór? Czy mogą wykorzystać te informacje do uzyskania informacji, których nie zamierzają mieć?
około
@John: Dzięki za edycję. Angielski nie jest moim językiem ojczystym :)
jakieś
6
Zrobiłem dokładnie to: użyłem kolejnych numerów identyfikacyjnych, aby określić wielkość bazy użytkowników konkurenta.
Micah
3
Są wszędzie. Wiele witryn zakupowych używa kolejnego numeru identyfikatora zamówienia. Złóż jedno zamówienie w jednym terminie, a drugie w innym, a wiesz, ile zamówień otrzymali w tym okresie. Nawet jeśli nie wiesz, ile pieniędzy warte są zamówienia, nadal otrzymujesz wskazówkę, jak dobrze idzie biznes.
jakiś
27

Ogólna myśl jest następująca: „Ujawniaj każdemu jak najmniej informacji o wewnętrznym działaniu aplikacji”.

Ujawnienie identyfikatora bazy danych liczy się jako ujawnienie niektórych informacji.

Powodem tego jest to, że hakerzy mogą wykorzystać dowolne informacje o wewnętrznych działaniach aplikacji, aby Cię zaatakować, lub użytkownik może zmienić adres URL, aby dostać się do bazy danych, której nie powinien widzieć?

Arjan Einbu
źródło
1
Dostęp do zasobów, których nie powinni widzieć - tylko wtedy, gdy nie sprawdzam uprawnień (co robię, w przeciwnym razie mam inny problem z bezpieczeństwem). Ujawnianie informacji o „wewnętrznych działaniach” - to jest dokładnie moje pytanie. Dlaczego jest to problem?
orip
8
@orip: Chodzi o jak największe bezpieczeństwo. Jeśli jesteś programistą, który nie popełnia błędów, to nie jest to problem. W przeciwnym razie ujawnienie mniejszej liczby szczegółów utrudni wykorzystanie kodu, jeśli (kiedy) popełnisz błędy. Sam w sobie masz rację, to nie zwiększa bezpieczeństwa.
Adam Bellaire
@Adam: powierzchowne bezpieczeństwo może być gorsze niż brak bezpieczeństwa. Bez zabezpieczenia jesteś jawny, z powierzchownym zabezpieczeniem możesz pomyśleć, że dodaje coś, czego nie można pominąć.
orip
17

Używamy identyfikatorów GUID do identyfikatorów baz danych. Wyciekanie ich jest o wiele mniej niebezpieczne.

Joshua
źródło
To właśnie proponuję. Znacznie mniej prawdopodobne jest odgadnięcie identyfikatorów GUID w bazie danych.
Jon Erickson,
7
Dzieje się to ze spadkiem wydajności. Zobacz tutaj
Jeshurun
2
Interesującą rzeczą 1 dotyczącą używania guidów jest to, że możesz pozwolić klientom generować identyfikatory bazy danych. Ciekawostką 2 jest to, że nie mają problemu z bazami danych podzielonymi na fragmenty, tak jak robią to identyfikatory z automatyczną inkrementacją.
Brian White
Czy używasz tych identyfikatorów GUID również w kodzie html jako atrybutów id do identyfikacji użytkowników, komentarzy, postów? Aby wskazać, który link kliknął użytkownik lub który post chce skomentować?
trzczy
7

Jeśli używasz identyfikatorów całkowitych w swojej bazie danych, możesz ułatwić użytkownikom zobaczenie danych, których nie powinni, zmieniając zmienne qs.

Np. Użytkownik może łatwo zmienić parametr id w tych pytaniach i zobaczyć / zmodyfikować dane, których nie powinien http: // someurl? Id = 1

Jason
źródło
7
Jeśli nie sprawdzę uprawnień, mam inny problem z bezpieczeństwem.
orip
ale odpowiedź jest trafna: „może”
Seun Osewa
1
Pytanie nie brzmi, czy sprawdzisz uprawnienia. Dzieje się tak, jeśli nowy pracownik, którego nie znasz, sprawdzi uprawnienia.
Brian White,
@BrianWhite - dlatego chcesz mieć proces przeglądu kodu, abyś mógł ich edukować, zanim trafi do produkcji.
candu
2
To, co robimy, to szyfrowanie identyfikatorów całkowitych, gdy są one używane w adresach URL lub zmiennych formularza.
Brian White
6

Kiedy wysyłasz identyfikatory bazy danych do swojego klienta, jesteś zmuszony sprawdzić bezpieczeństwo w obu przypadkach. Jeśli zachowasz identyfikator w swojej sesji internetowej, możesz wybrać, czy chcesz / musisz to zrobić, co oznacza potencjalnie mniejsze przetwarzanie.

Ciągle próbujesz delegować pewne rzeczy do swojej kontroli dostępu;) To może być w Twojej aplikacji, ale nigdy w całej mojej karierze nie widziałem tak spójnego systemu zaplecza. Większość z nich ma modele bezpieczeństwa, które zostały zaprojektowane do użytku poza siecią, a do niektórych dodano pośmiertnie dodatkowe role, a niektóre z nich zostały przykręcone poza podstawowym modelem zabezpieczeń (ponieważ rola została dodana w innym kontekście operacyjnym, powiedzmy przed siecią).

Używamy więc syntetycznych identyfikatorów lokalnych sesji, ponieważ ukrywają one tyle, ile tylko możemy.

Istnieje również kwestia pól kluczy innych niż całkowite, co może mieć miejsce w przypadku wartości wyliczanych i podobnych. Możesz spróbować oczyścić te dane, ale jest szansa, że ​​skończysz jak małe stoły upuszczające bobby .

krosenvold
źródło
4
Ciekawe, chociaż myślę, że sprawdzanie wszystkich danych wejściowych (w tym parametrów adresu URL) dla każdego żądania jest bardzo odpowiednie dla sieci.
orip