Kategoria OWASP: MASVS-CODE: Jakość kodu
Omówienie
Wydawanie wersji produkcyjnych, które zawierają funkcje testowania lub debugowania, może negatywnie wpłynąć na bezpieczeństwo aplikacji. Te funkcje pomagają deweloperom wykrywać i identyfikować błędy w zamierzonych przypadkach użycia aplikacji przed opublikowaniem nowej wersji lub po jej opublikowaniu. Nie powinny być one publicznie dostępne.
Przykłady funkcji testowania i debugowania:
- Ukryte menu
- Opcje włączania dzienników debugowania
- Opcje zmiany przepływu aplikacji
- Opcje obejścia procesów płatności lub subskrypcji
- Opcje obejścia uwierzytelniania
- Testy czynności specyficznych dla aplikacji
Wszystkie te elementy mogą być wykorzystywane przez złośliwego użytkownika do zmiany zamierzonego działania aplikacji lub pobierania informacji o systemie w celu dostosowania dalszych ataków.
Ryzyko związane z pozostawieniem odsłoniętych funkcji testowych lub debugowania może się różnić w zależności od działania powiązanego z samymi możliwościami debugowania.
Kolejnym obszarem ryzyka dla aplikacji jest atrybut android:debuggable
ustawiony w elemencie <application>
pliku AndroidManifest.xml. Jak podano w artykule android:debuggable, wdrożenie aplikacji produkcyjnej z ustawioną powyższą wartością umożliwia złośliwym użytkownikom dostęp do zasobów administracyjnych, które w innych okolicznościach są niedostępne.
Wpływ
Złośliwy użytkownik korzystający z funkcji testowania lub debugowania w wersji produkcyjnej może spowodować nieoczekiwane wyniki. Wpływ każdego działania jest bezpośrednio związany z uprawnieniami przypisanymi do funkcji. Im wyższe uprawnienia, tym większy wpływ może mieć aktywne wykorzystanie. Takie funkcje w aplikacji mogą być używane do omijania różnych zabezpieczeń, pomijania paywalli, pobierania informacji o systemie lub użytkowniku albo wywoływania działań testowych.
Środki ograniczające ryzyko
Unikaj używania komponentów debugowania
Funkcji testowych lub debugowania nie należy nigdy implementować w komponentach aplikacji produkcyjnej, takich jak aktywności, odbiorniki transmisji, usługi czy dostawcy treści, ponieważ jeśli zostaną wyeksportowane, mogą być uruchamiane przez dowolny inny proces na urządzeniu. Ustawienie komponentu debugowania jako nieeksportowanego (android:exported="false") nie stanowi skutecznej ochrony funkcji, ponieważ każde urządzenie z dostępem do roota może nadal wykonywać go za pomocą narzędzia Android Debug Bridge (ADB), jeśli opcja debugowania jest włączona.
Ograniczanie funkcji debugowania lub testowania do wersji testowych
Wykonywanie funkcji testowych lub debugowania w aplikacjach powinno być ograniczone tylko do zestawu wersji testowych, aby tylko deweloperzy mogli debugować lub testować funkcje aplikacji w kontrolowanym środowisku. Można to osiągnąć, tworząc specjalną wersję testową lub debugowania aplikacji i zaawansowane testy z instrumentacją, aby mieć pewność, że każda funkcja testowa lub debugowania jest uruchamiana w izolowanej wersji.
Wdrażanie zautomatyzowanych testów interfejsu
Podczas testowania aplikacji wybieraj automatyczne testy interfejsu, ponieważ można je powtarzać, przeprowadzać w oddzielnym środowisku i nie są podatne na błędy ludzkie.
Materiały
- Wskazówki dla deweloperów dotyczące zaawansowanych konfiguracji testów
- Wskazówki dla programistów dotyczące automatyzacji testów interfejsu
- android:debuggable
- android:exported
- Aplikacje z możliwością debugowania w Android Market
- Czy kod debugowania może powodować luki w zabezpieczeniach?