Kategoria OWASP: MASVS-NETWORK: komunikacja sieciowa
Omówienie
Zezwalanie na komunikację sieciową w postaci zwykłego tekstu w aplikacji na Androida oznacza, że każdy, kto monitoruje ruch w sieci, może zobaczyć przesyłane dane i zmodyfikować je. Jest to luka, jeśli przesyłane dane obejmują informacje poufne, takie jak hasła, numery kart kredytowych lub inne dane osobowe.
Bez względu na to, czy wysyłasz informacje poufne, czy nie, używanie niezaszyfrowanego tekstu może stanowić lukę w zabezpieczeniach, ponieważ ruch w postaci niezaszyfrowanego tekstu może być również modyfikowany przez ataki sieciowe, takie jak ARP czy zatrucie DNS, co może umożliwić atakującym wpływanie na działanie aplikacji.
Wpływ
Gdy aplikacja na Androida wysyła lub odbiera dane w pełnym tekście przez sieć, każdy, kto monitoruje sieć, może przechwycić i odczytać te dane. Jeśli te dane obejmują informacje poufne, takie jak hasła, numery kart kredytowych czy wiadomości osobiste, może to doprowadzić do kradzieży tożsamości, oszustwa finansowego i innych poważnych problemów.
Na przykład aplikacja przesyłająca hasła w postaci zwykłego tekstu może ujawnić te dane logowania złośliwemu aktorowi przechwytującemu ruch. Te dane mogą zostać wykorzystane do uzyskania nieautoryzowanego dostępu do kont użytkowników.
Zagrożenie: niezaszyfrowane kanały komunikacji
Przesyłanie danych przez niezaszyfrowane kanały komunikacji ujawnia dane udostępniane między urządzeniem a punktami końcowymi aplikacji. Dane te mogą zostać przechwycone i potencjalnie zmodyfikowane przez osobę przeprowadzającą atak.
Środki zaradcze
Dane powinny być przesyłane przez szyfrowane kanały komunikacji. Bezpieczne protokoły powinny być używane jako alternatywa dla protokołów, które nie oferują możliwości szyfrowania.
Konkretne zagrożenia
W tej sekcji zebraliśmy zagrożenia, które wymagają niestandardowych strategii łagodzenia lub zostały złagodzone na określonym poziomie pakietu SDK.
Ryzyko: HTTP
Wskazówki w tej sekcji dotyczą tylko aplikacji kierowanych na Androida 8.1 (poziom interfejsu API 27) lub starszego. Począwszy od Androida 9 (poziom API 28) klienci HTTP, tacy jak URLConnection, Cronet i OkHttp, wymuszają używanie HTTPS, dlatego obsługa w formie zwykłego tekstu jest domyślnie wyłączona. Pamiętaj jednak, że inne biblioteki klienta HTTP, takie jak Ktor, prawdopodobnie nie będą egzekwować tych ograniczeń w formie zwykłego tekstu, dlatego należy z nimi postępować ostrożnie.
Środki zaradcze
Użyj pliku NetworkSecurityConfig.xml, aby zrezygnować z ruchu nieszyfrowanego i wymusić HTTPS w aplikacji z wyjątkami tylko dla określonych domen (zwykle do debugowania):
Xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="false">
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">debug.domain.com</domain>
</domain-config>
</network-security-config>
Ta opcja pomaga zapobiegać przypadkowym regresjom w aplikacjach z powodu zmian adresów URL udostępnianych przez źródła zewnętrzne, takie jak serwery zaplecza.
Ryzyko: FTP
Korzystanie z protokołu FTP do wymiany plików między urządzeniami wiąże się z kilkoma zagrożeniami, z których największym jest brak szyfrowania kanału komunikacyjnego. Należy używać bezpieczniejszych alternatyw, takich jak SFTP lub HTTPS.
Środki zaradcze
Podczas wdrażania w aplikacji mechanizmów wymiany danych przez Internet należy używać bezpiecznego protokołu, takiego jak HTTPS. Android udostępnia zestaw interfejsów API, które umożliwiają programistom tworzenie logiki klient-serwer. Można to zabezpieczyć za pomocą protokołu TLS, który zapewnia szyfrowanie danych przesyłanych między dwoma punktami końcowymi, uniemożliwiając w ten sposób złośliwym użytkownikom podsłuchiwanie komunikacji i pobieranie poufnych danych.
Architektury klient-serwer często korzystają z interfejsów API należących do deweloperów. Jeśli Twoja aplikacja zależy od zestawu punktów końcowych interfejsu API, zadbaj o szczegółowe zabezpieczenia, stosując te sprawdzone metody dotyczące bezpieczeństwa, które chronią komunikację HTTPS:
- uwierzytelniania – użytkownicy powinni się uwierzytelniać za pomocą bezpiecznych mechanizmów, takich jak OAuth 2.0; Nie zalecamy korzystania z uwierzytelniania podstawowego, ponieważ nie zapewnia ono mechanizmów zarządzania sesją, a jeśli dane uwierzytelniające są nieprawidłowo przechowywane, można je odkodować z formatu Base64.
- Autoryzacja – użytkownicy powinni mieć dostęp tylko do zasobów docelowych zgodnie z zasadą najmniejszych uprawnień. Można to zaimplementować, stosując rozwiązania do starannej kontroli dostępu do zasobów aplikacji.
- Upewnij się, że używane są przemyślane i najnowsze zestawy szyfrów zgodnie ze sprawdzonymi metodami dotyczącymi zabezpieczeń. Rozważ na przykład obsługę protokołu TLSv1.3 z kompatybilnością wsteczną (w razie potrzeby) w przypadku komunikacji HTTPS.
Ryzyko: niestandardowe protokoły komunikacji
Wdrażanie niestandardowych protokołów komunikacji lub próba ręcznego wdrażania znanych protokołów może być niebezpieczne.
Chociaż protokoły niestandardowe umożliwiają deweloperom tworzenie niepowtarzalnych rozwiązań dostosowanych do potrzeb, każdy błąd w procesie tworzenia może potencjalnie spowodować luki w zabezpieczeniach. Na przykład błędy w rozwijaniu mechanizmów obsługi sesji mogą sprawić, że atakujący będą mogli podsłuchiwać komunikacji i pozyskiwać poufne informacje w biegu.
Z drugiej strony implementowanie znanych protokołów, takich jak HTTPS, bez używania systemu operacyjnego lub dobrze utrzymanych bibliotek innych firm, zwiększa prawdopodobieństwo wprowadzenia błędów kodowania, które mogą utrudnić, a nawet uniemożliwić aktualizację zaimplementowanego protokołu w razie potrzeby. Może to też spowodować luki w zabezpieczeniach podobne do tych, które występują w przypadku korzystania z protokołów niestandardowych.
Środki zaradcze
Korzystanie z bibliotek z aktualizacjami do implementowania znanych protokołów komunikacyjnych
Aby zaimplementować w aplikacji znane protokoły, takie jak HTTPS, należy użyć bibliotek systemowych lub bibliotek innych firm.
Dzięki temu deweloperzy mogą korzystać z rozwiązań, które zostały dokładnie przetestowane, ulepszone z upływem czasu i stale otrzymują aktualizacje zabezpieczeń w celu naprawiania typowych luk w zabezpieczeniach.
Ponadto wybór dobrze znanych protokołów zapewnia deweloperom szeroką zgodność z różnymi systemami, platformami i IDE, co zmniejsza prawdopodobieństwo popełnienia błędu przez człowieka w trakcie procesu tworzenia.
Używanie SFTP
Ten protokół szyfruje dane podczas przesyłania. Podczas korzystania z tego typu protokołu wymiany plików należy wziąć pod uwagę dodatkowe środki ostrożności:
- SFTP obsługuje różne rodzaje uwierzytelniania. Zamiast uwierzytelniania za pomocą hasła należy użyć metody uwierzytelniania za pomocą klucza publicznego. Takie klucze powinny być tworzone i przechowywane w bezpieczny sposób. W tym celu zalecamy korzystanie z magazynu kluczy Androida.
- Upewnij się, że obsługiwane szyfry są zgodne ze sprawdzonymi metodami zapewniania bezpieczeństwa.
Materiały
- Ktor
- Wykonywanie operacji sieciowych za pomocą Cronet
- OkHttp
- Wycofanie zgody na przetwarzanie danych w ramach konfiguracji bezpieczeństwa sieci
- Łączenie się z siecią
- Bezpieczeństwo w ramach protokołów sieciowych
- OAuth 2.0 dla aplikacji mobilnych i komputerowych
- HTTP Over TLS RFC
- Schematy uwierzytelniania HTTP
- Zalecenia Mozilla dotyczące bezpieczeństwa w internecie
- Generator zalecanej konfiguracji SSL firmy Mozilla
- Rekomendacje Mozilla dotyczące TLS po stronie serwera
- Strona główna instrukcji OpenSSH
- specyfikacja SSH RFC, która zawiera szczegółowe informacje o konfiguracjach i schematach, których można używać w tym protokole;
- Zalecenia dotyczące zabezpieczeń Mozilla OpenSSH
- system Android Keystore,