2012-01-11 18 views
52

Mam dwie aplikacje.Jak używać niestandardowych uprawnień w systemie Android?

Jeden deklaruje zgodę i mający pojedynczy Activity:

części AndroidManifest.xml

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:permission="your.namespace.permission.TEST" > 
    <activity 
     android:name=".DeclaringPermissionActivity" 
     android:label="@string/app_name" > 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="myapp" 
      android:host="myapp.mycompany.com" /> 
     </intent-filter> 
    </activity> 
</application> 

Drugi deklaruje, że używa się pozwolenie

Część AndroidManifest.xml

<uses-sdk android:minSdkVersion="10" /> 
<uses-permission android:name="your.namespace.permission.TEST" /> 

<application 

Część Activity:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("myapp://myapp.mycompany.com/index"))); 
} 

mam instalowania aplikacji stwierdzającej uprawnienie, a następnie uruchomić drugą aplikację.

W rezultacie otrzymuję wyjątek zabezpieczeń:

01-11 09:46:55.249: E/AndroidRuntime(347): java.lang.RuntimeException: Unable to start activity ComponentInfo{your.namespace2/your.namespace2.UsingPErmissionActivity}: java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.VIEW dat=myapp://myapp.mycompany.com/index cmp=your.namespace/.DeclaringPermissionActivity } from ProcessRecord{407842c0 347:your.namespace2/10082} (pid=347, uid=10082) requires your.namespace.permission.TEST 
+0

Chcę tylko podkreślić tę lukę: http://commonsware.com/blog/2014/02/12/vulnerabilities-custom-permissions.html – Tobrun

+0

Jeśli chodzi o powyższy komentarz dotyczący luki w zabezpieczeniach, zanotuj zmiany w Androidzie 5.0, który to adres ten problem: http://developer.android.com/about/versions/android-5.0-changes.html#custom_permissions – Nonos

Odpowiedz

98

utworzonego kodu testowego można go używać i testować swoje uprawnienia . Istnieją dwie aplikacje PermissionTestClient, które deklarują zezwolenie i chronią jego aktywność za pomocą tego uprawnienia. Oto jego plik manifestu:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.testpackage.permissiontestclient" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="10" /> 
    <permission android:name="com.testpackage.mypermission" android:label="my_permission" android:protectionLevel="dangerous"></permission> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:permission="com.testpackage.mypermission" 
      android:name=".PermissionTestClientActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <intent-filter > 
       <action android:name="com.testpackage.permissiontestclient.MyAction" /> 
       <category android:name="android.intent.category.DEFAULT" />     
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

W pliku aktywacyjnym nie ma nic specjalnego, więc nie będę go tutaj pokazywał.

Aplikacja serwera uprawnień PermissionTestServer od użytkownika PermissionTestClient.Oto jego manifest file:

<?xml version="1.0" encoding="utf-8"?> 

<uses-sdk android:minSdkVersion="10" /> 
<uses-permission android:name="com.testpackage.mypermission"/> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".PermissionTestServerActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

i aktywność:

package com.testpackage.permissiontestserver; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

public class PermissionTestServerActivity extends Activity { 
    private static final String TAG = "PermissionTestServerActivity"; 

    /** Called when the activity is first created. */ 
    Button btnTest; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btnTest = (Button) findViewById(R.id.btnTest); 
     btnTest.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.d(TAG, "Button pressed!"); 
       Intent in = new Intent(); 
       in.setAction("com.testpackage.permissiontestclient.MyAction"); 
       in.addCategory("android.intent.category.DEFAULT"); 
       startActivity(in); 
      } 
     }); 
    } 
} 

Aby przetestować go po prostu usunąć uses-pozwolenie od Application Server. Otrzymasz komunikat o błędzie naruszenia zabezpieczeń.

+2

Dzięki, moim błędem było nadanie atrybutowi 'permission' tylko elementu' '. – pixel

+0

To nie działa dla mnie, gdy używam Androida: protectionLevel = "signature" w PermissionTestClient, używam uprawnień do tego launchera aplikacji i otrzymuję: Permission Denial: starting Intent {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10000000 cmp = my.package.foobar/.DashboardActivity} od null (pid = 4070, uid = 2000) wymaga my.custom.permission.ACCESS_ACTIVITY - więc aplikacja nie uruchamia własnej aktywności 0_o – fr1550n

+2

Podpis poziomu uprawnień oznacza, że ​​twój klient i serwer powinien być podpisany tym samym certyfikatem. Spróbuj uruchomić kod przy użyciu niebezpiecznego poziomu i jeśli wszystko jest w porządku, spróbuj uruchomić z podpisem. Jeszcze jedno, jeśli używasz podpisu, myślę, że musisz wyeksportować podpisane pliki APK, a następnie je zainstalować. – Yury

29

Musisz utworzyć pozwolenie na swoją bazę aplikacji manifeście przez uznającej go wyłącznie. Na przykład:

<permission android:name="your.namespace.permission.TEST" 
    android:protectionLevel="normal" android:label="This is my custom permission" /> 

a później z niego skorzystać w żądanej aplikacji jak:

<uses-permission android:name="your.namespace.permission.TEST" /> 

Uwaga:Ważne jest, aby utrzymać kolejność instalowania aplikacji z uprawnieniami niestandardowymi . Trzeba zainstalować tę aplikację najpierw, która deklaruje uprawnienie, a następnie instaluje tę, która z niej korzysta. Wszelkie zakłócenia w tej kolejności mogą przerwać użycie niestandardowych. uprawnienia.

+0

Zwięzły i krótki i działa. Najlepsza głosowana odpowiedź jest lepsza, ale właśnie to zostało zadane w pytaniu. Jedna uwaga, to WSZYSTKO, czego potrzebujesz, aby użyć niestandardowych uprawnień, ponieważ menedżer bezpieczeństwa zajmie się resztą. – PSIXO

+0

Nie mogę tego uruchomić, nawet jeśli deklaruję uprawnienia do używania w aplikacji, która utworzyła pozwolenie. Zgłasza wyjątek bezpieczeństwa na początku – Anshu

+1

Dopóki dobrze pamiętam, kolejność, w której instalujesz aplikacje, ma również znaczenie. Najpierw zainstaluj aplikację, która deklaruje niestandardowe uprawnienia, a następnie zainstaluj aplikację, która korzysta z tego uprawnienia niestandardowego. – waqaslam

0

Definiowanie niestandardowego zgody odbywa się za pomocą <Permission> tag .. proszę wykonać poniższe łącze, aby wykorzystać uprawnienia zdefiniowane przez użytkownika w aplikacji:

Declaring and Enforcing Permissions

1

Jak wspomniano w odpowiedziach, należy również wziąć pod uwagę kolejność instalacji aplikacji.

to jest ważne, ponieważ:

Jeśli aplikacja, która żąda pozwolenia (App B) jest zainstalowany przed aplikacja, która określa uprawnienia (app), wówczas nie będzie tak zdefiniowanych zgody w konkretnym urządzeniu więc system operacyjny w ogóle nie poprosi o zezwolenie.

później, po zainstalowaniu aplikacji A i próbie uruchomienia aplikacji B, ta ostatnia nie uzyska dostępu do bezpiecznego komponentu.

Jednym z obejść byłoby zdefiniowanie tego samego uprawnienia niestandardowego w aplikacjach, A i B, aby upewnić się, że uprawnienia istnieją w urządzeniu, niezależnie od tego, która aplikacja jest instalowana jako pierwsza, więc po zainstalowaniu aplikacji A pozwolenie będzie już udzielone App B.

w tym przypadku jednak, należy upewnić się, że poziom ochrony jest taka sama w obu deklaracji, ponieważ może to prowadzić do zagrożenia bezpieczeństwa .

(należy pamiętać, że z wersji Android 5.0 i nie można zdefiniować tych samych uprawnień w więcej niż jednej aplikacji, z wyjątkiem sytuacji, gdy aplikacje są podpisane tym samym kluczem podpisu).

Powiązane problemy