Bezpieczna aplikacja – 6 aspektów, na które należy zwrócić uwagę

Wymagania bezpieczeństwa

Pracując nad różnymi aplikacjami zazwyczaj najbardziej skupiamy się na wymaganiach funkcjonalnych: klient ma mieć możliwość włożenia produktu do koszyka, klient ma mieć możliwość wybrania opcji dostawy, itp. W momencie, kiedy wymagania funkcjonalne dla aplikacji są opracowane przez analityka, deweloperzy najczęściej zastanawiają się od razu nad tym, w jaki sposób wykonać daną funkcjonalność w systemie. Ci bardziej doświadczeni dodatkowo przemyślą swoje rozwiązanie, żeby było jak najbardziej przyszłościowe i łatwe w późniejszym utrzymaniu. Niektórzy dodatkowo pomyślą o wpływie na wydajność całego systemu. Na przykład, czy swobodne wyszukiwanie produktów po kawałku nazwy nie będzie trwało kilku minut zamiast kilku sekund. Jednak jak często zespół deweloperski zastanawia się nad bezpieczeństwem tworzonych funkcjonalności jeszcze przed ich stworzeniem?

Wyobraźmy sobie, że tworzymy sklep internetowy. Wiem, że jest wiele gotowych silników dla sklepów online, jednak nasz klient zdecydował się, że jego biznes jest tak wyjątkowy, że potrzebuje narzędzia uszytego na wymiar.

Jako zespół ciężko pracowaliśmy, żeby dopracować aplikację pod względem wizualnym i funkcjonalnym. Jest przemyślana i zoptymalizowana. Być może ta część naszej historii brzmi znajomo. 

Spróbujmy więc przyjrzeć się temu, jak może wyglądać bezpieczeństwo aplikacji internetowych ze strony użytkownika.

Poufność

Jacek znalazł nasz sklep w przeglądarce. Punkt dla nas, bo to oznacza, że sklep jest dobrze wypozycjonowany. Niedługo razem z żoną będą obchodzili 5 rocznicę ślubu. Dlatego właśnie Jacek już dziś poszukuje dla niej wyjątkowego prezentu. Po długich poszukiwaniach i przeglądaniu wielu zdjęć zdecydował się na konkretny prezent. Kupuje jej wymarzony zegarek. Rocznica dopiero za miesiąc, więc prezent bez problemu zdąży dojść. Jacek zamawia. Jest tylko trochę zdezorientowany, że sklep nie wymagał od niego rejestracji, ani zakładania konta. No nic, tak jest nawet łatwiej i szybciej.

Kilka dni później jego żona Kinga też poszukuje inspiracji na prezent dla męża. Siada przy tym samym komputerze i również trafia do naszego sklepu (ach, to dobre pozycjonowanie). Jednak nie może skupić się na poszukiwaniu prezentu, gdyż jej uwagę przykuwa migająca ikona zmiany statusu zamówienia. Klika więc na nią i widzi, że na adres pracy jej męża jest zamówiony zegarek. Woła więc Jacka, żeby wyjaśnić, czy to nie jest jakaś pomyłka lub wyłudzenie. Jacek gdy tylko widzi to na ekranie, jest załamany. Cała niespodzianka zepsuta, a tak mu zależało na efekcie zaskoczenia. Już by wolał założyć konto w tym sklepie i się wylogować, żeby nikt nie był w stanie podejrzeć jego zakupów. Nie ma ochoty więcej tam kupować. Co więcej, pisze maila do właściciela z zażaleniem.

To, czego brakowało Jackowi w naszym sklepie, to prywatność. Jest to jedna z podstawowych własności bezpiecznych systemów. Użytkownik nigdy by nie chciał, żeby jego dane osobowe, numer telefonu lub lista zakupów (choćby zakupów spożywczych) była swobodnie dostępna dla innych ludzi. Nie mówiąc już o tak wrażliwych danych jak numer karty płatniczej.

Integralność danych

Tym razem towarzyszymy Jackowi w zakupie kwiatów do ogrodu. Oczywiście sklep ogrodniczy znalazł przez internet. Dodał już wszystkie rośliny, które mu się podobały, do koszyka i ma zapłacić 200 zł (już z wysyłką). Przechodzi do strony płatności. Jednak w momencie, gdy ma już podać numer swojej karty kredytowej widzi, że w pasku adresu strony znajduje się tekst amount=200. Jacek zna się na działaniu stron internetowych, więc pierwsze co mu przychodzi do głowy, to zmiana wartości w adresie strony z 200 na inną wartość. Niesamowicie zaskoczył go fakt, że po wpisaniu amount=100 na stronie płatności zobaczył informację, że ma do zapłacenia tylko 100 zł. Postanowił wykorzystać swoje znalezisko i zapłacić tylko 100 zł. Po dokonaniu płatności zajrzał na swoje konto bankowe i zobaczył potwierdzenie, że sklep pobrał od niego tylko 100 zł.

Jednak Jacek jest uczciwy, więc postanowił napisać do obsługi sklepu, że udało mu się zrobić coś takiego. W nagrodę właściciel zwrócił mu cała sumę za zakupy.

W tworzeniu aplikacji internetowych niezwykle ważne jest utrzymywanie integralności danych. Zarówno ze względu na jakość danych, na których później chcemy operować, jak i przede wszystkim na bezpieczeństwo tego systemu. Ma to szczególne znaczenie w przypadku integracji z innymi usługami. W tego typu komunikacji należy zadbać o to, żeby dane, które przesyłamy, były traktowane jako integralna całość i nie było możliwości ich modyfikacji. Tego zabrakło w naszym przykładowym sklepie ogrodniczym, gdzie użytkownik był w stanie bezpośrednio zmodyfikować kwotę transakcji.

Autentykacja

W wolnych chwilach Jacek gra w różne gry online w przeglądarce. Na jednej ze stron zobaczył, że logowanie nie odbywa się, tak jak w innych miejscach, za pomocą loginu i hasła, tylko za pomocą numeru telefonu i daty urodzenia. Dziwny pomysł, ale działa. Dzięki temu nie trzeba pamiętać swojego hasła i zawsze łatwo się zalogować. 

Pewnego dnia przyszło mu do głowy, że korzystając ze swojej wiedzy, jest w stanie zalogować się na konto Marka – znajomego, z którym najczęściej gra. I rzeczywiście, po kilku próbach (bo Jacek nie był do końca pewien, ile Marek ma lat) udało mu się zalogować na jego konto. “Mógłbym skasować mu konto razem z całym dorobkiem punktowym” – pomyślał, ale po chwili stwierdził, że bardziej interesują go czaty Marka z innymi użytkownikami serwisu. Odkrył, że kolega jest dość agresywny podczas rozgrywek z innymi ludźmi.

Jeszcze tego samego popołudnia Jacek postanowił skasować swoje konto na tym serwisie, bo nie chce, żeby dowolna osoba miała dostęp do jego rozgrywek i prywatnych rozmów.

Opisany przykład pokazuje, jak ważna w aplikacjach jest autentykacja. Jest to właściwość, polegająca na tym, że system jest w stanie jednoznacznie zidentyfikować osobę, która używa danej aplikacji. Ważne przy tym jest uzyskanie pewności, że dany użytkownik jest tym, za kogo się podaje. Dlatego właśnie tak popularne są tu sekretne hasła, które zna tylko ich właściciel. Znajomość hasła jest niejako potwierdzeniem, że jestem tą osobą, za którą się podaję.

Autoryzacja

Jacek regularnie loguje się do swojej poczty mailowej. Zazwyczaj jego konto mailowe działa bez żadnych problemów. Jednak pewnej niedzieli, gdy po śniadaniu postanowił zalogować się i sprawdzić, czy znajomy wreszcie przesłał mu zdjęcia z wczorajszego spotkania, bardzo się zdziwił. Zazwyczaj jego skrzynka pocztowa jest dość pusta, bo stara się na bieżąco kasować niepotrzebne wiadomości. Jednak tym razem zobaczył u siebie dziesiątki różnych wiadomości. Niektóre należały do niego, jednak większości z nich nie poznawał. Zaczął je po kolei otwierać, ale żadna nie była skierowana do niego. Wszystkie były zaadresowane do jakiegoś Bartłomieja K. Nigdy o nim nie słyszał. Gdy przejrzał jeszcze kilka nudnych maili na temat sportu i najnowszych filmów (generalnie, nic ciekawego), zaniepokoił się o swoje maile. Gdzie one są? Czy odzyska do nich dostęp? A przede wszystkim, czy ktoś inny miał do nich dostęp? Szybko więc zadzwonił do obsługi klienta swojej skrzynki pocztowej, żeby wyjaśnić sytuację. Na szczęście z pomocą konsultanta dość szybko odzyskał dostęp do swoich maili. Nikt jednak nie potrafił mu powiedzieć, czy ktoś miał dostęp do jego wiadomości. Przypuszczał że tak, ale nie wiedział, co może z tym zrobić.

Opisany problem ewidentnie dotyczy nieprawidłowej autoryzacji użytkownika. Autoryzacja jest to proces, w którym na podstawie mojej tożsamości, system daje mi dostęp do określonego zbioru danych. Zgodnie z regułami zaprogramowanymi w systemie. System powinien też zapewniać, że mam dostęp tylko do tych danych i do żadnych innych. Nawet, gdy na przykład użytkownik postanowi ręcznie pozmieniać numery id w adresie strony.

Dostępność systemu

Tym razem Jacek znalazł w internecie świetną promocję na telefon, na który czekał już bardzo długo. Tak więc czym prędzej  swój egzemplarz i dostał informację, że ma godzinę na zapłacenie. Szybko więc wypełnił dane do faktury, adres wysyłki i kliknął guzik “Zapłać”. Jednak zamiast panelu płatności zobaczył tylko błąd przeglądarki – strona nie dostępna i komunikat: „ERR_CONNECTION_TIMED_OUT”. Nie zraziło go to, przecież nie od dziś korzysta z internetu i takie rzeczy już mu się zdarzały. Odświeżył stronę, żeby spróbować jeszcze raz, ale tym razem strona przez długi czas próbowała się ładować, żeby wreszcie pokazać dokładnie ten sam błąd. Jacek przypomniał sobie, że podobną sytuację miał niedawno, gdy próbował ostatniego możliwego dnia wysłać do Urzędu Skarbowego swoją deklarację podatkową. Wtedy też wszystko wyglądało w porządku, ale jak dochodził do momentu wysyłki, to strona długo to przetwarzała i w końcu zwracała identyczny komunikat. Wtedy zadziałało sukcesywne odświeżanie strony, żeby spróbować ponownie wysłać deklarację. Udało mu się to zrobić już po 20 minutach. Teraz w sklepie próbuje już 20 minut i nadal nic. Postanowił więc, że spróbuje ponownie na kilka minut przed końcem limitu czasu na dokonanie płatności. 

Jednak nawet to nie pomogło. Jacek jest smutny, że nie udało mi się załapać na świetną promocję. Pomyślał sobie, że być może to celowe działanie właścicieli sklepu, żeby przyciągnąć do siebie klientów promocją, ale mimo to nie pozwolić im dokonać zakupu ze względu na “dziwny” błąd techniczny. Jacek postanowił już nigdy nie korzystać z tego sklepu.

Sytuacja, która spotkała Jacka, to niedostępność systemu. Może być zaplanowana (jak w bankach podczas prac konserwacyjnych), przypadkowa (w wyniku jakiegoś problemu w aplikacji lub infrastrukturze) lub spowodowana przez atakującego (wskutek wygenerowania dużego, sztucznego ruchu w naszej aplikacji). Tylko pierwsza z nich jest dopuszczalna! Przed resztą powinniśmy się jak najmocniej zabezpieczać, bo podkopuje ona zaufanie do naszych usług lub w ogóle uniemożliwia ich świadczenie.

Posiadanie dowodów zmian

Kolega Jacka – Andrzej pracuje w sklepie internetowym. Odkrył on, że ma swobodny dostęp do panelu definiowania kodów rabatowych. Na jednym ze spotkań opowiedział Jackowi, że może dać mu zniżkę w sklepie na 50%.

  • Jesteś pewien, że możesz to zrobić? Pracujesz jako pomoc techniczna, a nie jako sprzedawca – zapytał Jacek
  • Uwierz mi. Mogę to robić. Sprawdzałem to już – zapewnił Andrzej.

Tak więc kolejnego dnia Jacek za namową znajomego zamówił telewizor za pół ceny.

Jednak pod koniec miesiąca Andrzej został wezwany do kierownika. Okazało się, że księgowy zauważył fakturę na telewizor w niezwykle niskiej cenie. Sam też miał ochotę sobie taki kupić, więc poszedł do działu sprzedaży dowiedzieć się, czy też mógłby dostać tak wysoką zniżkę (co szkodzi spróbować). Tam mocno się zdziwili i postanowili sprawdzić, kto wygenerował ten kod rabatowy. Ten trop doprowadził ich do Andrzeja.

Tak sprawne odkrycie, kto przekroczył swoje uprawnienia, jest zasługą posiadania dowodów zmian w systemie. Jest to bardzo ważna, choć niedoceniana właściwość systemów IT. Jest ona przydatna stosunkowo rzadko, ale bez przechowywania tego typu dowodów, niemożliwe byłoby dowiedzenie się na przykład, kto zmienił numer konta, na które mają wpływać pieniądze od klientów. Czyli nie można by było nikomu udowodnić jego winy.

Czy to wszystko?

Jak dotąd opowiedzieliśmy sobie o następujących właściwościach bezpiecznego systemu:

  • poufność
  • integralność danych
  • autentykacja
  • autoryzacja
  • dostępność 
  • posiadanie dowodów zmian

To podstawowe aspekty, ale oczywiście nie wszystkie. Jednak większość ataków na aplikacje internetowe ma na celu skompromitowanie tych właśnie obszarów.

W kolejnych postach omówimy zagrożenia związane z każdym z aspektów bezpiecznego systemu komputerowego oraz narzędzia dla deweloperów do zadbania o nie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *