2013-09-02 15 views
10

Obecny Android Permission System causes the following issue:Programowo zmienić Manifest - Android uprawnienia niestandardowe

App A określa pozwolenie niestandardową:

com.package.permission.READ_APP_DATA 

Kiedy aplikacja B jest zainstalowany deklarowania zgody niestandardową, to jest oczywiste.

Jednakże, jeśli aplikacja zainstalowana A po app B, po czym uprawnienie to nie udzielone app B.

Choć może to nie być częstym zjawiskiem, z powodu aplikacja B często jest plugin aplikacji A, to oczywiście może wystąpić i robi dla mojej aplikacji.

Z aplikacjami SuperUser wyrażającymi zgodę na wprowadzenie ogólnego niestandardowego pozwolenia android.permission.ACCESS_SUPERUSER może to być duży problem, jeśli użytkownik zdecyduje się na zmianę aplikacji SuperUser.

W celu obsługi tego problemu, mam zamiar użyć następującego kodu w moim wniosku o pozwolenie niestandardowego Mam zamiar rozpocząć oświadczając:

checkPermissions(this, getCallingActivity().getPackageName()); // get the package name from the sender first 

private boolean checkPermissions(Context context, String callingPackage) { 

    final List<PackageInfo> apps = context.getPackageManager().getInstalledPackages(PackageManager.GET_PERMISSIONS); 

    for (PackageInfo pi : apps) { 

     if (pi.packageName.equals(callingPackage)) { 

      String[] permissions = pi.requestedPermissions; 

      if (permissions != null) { 
       for (String permission : permissions) { 
        if (permission.equals("com.package.permission.READ_APP_DATA")) { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 

Jak w tytule tego pytania: Czy ta metoda 'bezpieczny'? Czy istnieje sposób/root-hack, że manifest aplikacji może zostać zmieniony po zainstalowaniu, a uprawnienia programowo "dodane" do aplikacji B?

+1

"Jeśli jednak aplikacja A jest zainstalowana po aplikacji B, to uprawnienie nie zostanie przyznane aplikacji B." - mają ten sam element '' w obu aplikacjach, szczególnie jeśli jest to uprawnienie "sygnatury". – CommonsWare

+0

@CommonsWare - Dzięki. Czy mogłabyś ewentualnie rozwinąć? Uważam, że to już robię, ale uprawnienia aplikacji B nadal nie są wykrywane/przyznawane. Zauważyłem, że połączony raport o błędzie został ostatecznie przypisany jako defekt. – brandall

+1

"Wierzę, że już to robię" - twoje pytanie wskazuje, że tylko App A ma element '', a aplikacja B ma tylko element ''. Mówię, żebym dodał element '' do App B, więc kolejność instalacji nie ma już znaczenia. – CommonsWare

Odpowiedz

9

Nie jestem pewien, czy otrzymuję właściwe pytanie, ponieważ nie wiem, jak zhakowanie pozwolenia do manifestu po instalacji łączy się z kodem, który napisałeś powyżej. Ale żeby odpowiedzieć na twój ostatni akapit:

Nie w łatwy sposób. Użytkownik musi mieć zainstalowany na swoim urządzeniu mod, który może udzielać dowolnych uprawnień w locie, gdy aplikacja ich żąda. IIRC sam plik manifestu jest parsowany w momencie instalacji.

To, czego użyliśmy w modzie, zmienia metodę grantPermissionsLPw w klasie com.android.server.pm.PackageManagerService.

Służy do przyznania launcherowi zezwolenia, które nie zostało zadeklarowane w manifeście.

Nie jestem jednak pewien, czy kiedykolwiek użyłbyś tej aplikacji. Ale podsumowując: Jeśli użytkownik chce nadać aplikacji arbitraż, niestandardowe pozwolenie: Tak, jest to możliwe.

UPDATE

mogę opracować nieco więcej, oczywiście. Widzę dwa scenariusze dzieje

1. Statyczny mod

Powyższa klasa rezyduje w services.jar. Jak wiemy, pliki takie jak ten można dekompilować, zmieniać i rekompilować. W rzeczywistości jest to dość łatwa edycja tego pliku. Nie wiem, jak to zrobić bezpośrednio przez telefon, ale uważam, że jest to możliwe. Po prostu nie jest to możliwe, że dostępne są szerokie rozwiązania, ponieważ wymaga to dużej mocy obliczeniowej. Osoba atakująca nie może po prostu dostarczyć uniwersalnego pliku. Te pliki zmieniają się z urządzenia na urządzenie, a także między wersjami oprogramowania układowego.Albo osoba atakująca będzie musiała dostarczyć ogromną ilość łatanych plików, albo łatać transmisje na żywo, przesyłając je na serwer, załatając, pobierając ponownie i instalując. Ten scenariusz jest mało prawdopodobny, jeśli mnie zapytasz.

2. dynamiczny mod

Istnieje więcej niż jeden ramy dostępne, które umożliwiają procesy przebudowie, podczas gdy opertae. Najpopularniejszym z nich jest Xposed Framework. Zasadniczo jest to łatany app_process i odpowiedni interfejs API, który wykorzystuje Reflection do zmiany działających procesów. Teraz osoba atakująca może wysłać swoją aplikację z tą strukturą i mając uprawnienia administratora, zainstaluj ją po cichu. Z dostępem do roota może on nawet włączyć moduł samodzielnie, co zwykle wymaga interakcji użytkownika. Gdy moduł taki jak ten jest włączony, atakujący może podłączyć się do wyżej wymienionej metody i zmienić żądane uprawnienia. Robiłby to, pobierając pole obiektu, które zawiera żądane uprawnienia, dodając to, czego wymaga, Następnie uruchom oryginalną metodę, która dodaje pierwotnie zdefiniowane uprawnienia.

Należy pamiętać, że oba scenariusze wymagają samodzielnego zainstalowania szkodliwej aplikacji. Nie wspomniałeś o tym, do czego służy Twoja aplikacja, więc nie mogę ci bardziej pomóc w ocenie ryzyka. Wszystko, co mogę powiedzieć, to to, że atakujący MOŻE robić takie rzeczy.

+0

Dziękuję za odpowiedź - Czy byłbyś w stanie opracować, w jaki sposób mod działa proszę? Pomoże mi zrozumieć "ryzyko". – brandall

+0

Patrz aktualizacja powyżej. Poprawiono również nazwę klasy. Jeśli masz więcej pytań, nie wahaj się zapytać. – langerhans

+1

Dzięki za aktualizację, jest to naprawdę pomocne i dobre czytanie. Powrócę, aby oznaczyć twoją odpowiedź jako poprawną i przyznaję nagrodę za twoje wysiłki. – brandall

0

Widzę problem polegający na tym, że jeśli aplikacja A jest instalowana przed aplikacją B, a element <permission> nie jest zadeklarowany w aplikacji A, użytkownik nigdy nie zobaczy żądania pozwolenia. Jeśli jednak wymaga się użycia elementu <permission> w aplikacji A, można zastosować podobne podejście w celu sprawdzenia, czy etykieta i opis wyświetlane użytkownikowi były poprawne.

Powiązane problemy