Como impedir que outros aplicativos definam o mesmo nome de permissão

9

Meu aplicativo define uma permissão com android: protectionLevel="signature".

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="signature" />

Minha intenção é criar módulos de aplicativos que possam ser lançados somente pelo meu aplicativo assinado. Estes módulos de aplicação têm android: permissão em suas atividades. Isso funciona bem. mas... Um aplicativo de terceiros pode usar o mesmo nome de permissão e alterar o nível de proteção para normal, como este

<permission android:name="my.app.permission.EXAMPLE" android:protectionLevel="normal" />

Se meu aplicativo for instalado primeiro, posso impedir que outros aplicativos substituam a permissão. No entanto, se um desinstalar o meu aplicativo e, em seguida, instalar seu aplicativo, ele redefinirá a permissão.

É possível impedir que outro aplicativo use o mesmo nome de permissão, por exemplo, dando à permissão um id único como o pacote de aplicativos?

Embora o manifesto seja criptografado, qualquer pessoa pode ler o nome da permissão no log cat quando tentar iniciar a atividade que requer essa permissão (uma exceção é lançada com o nome da permissão necessária).

    
por Dennix 12.07.2012 в 20:39

2 respostas

5

Não há aplicação, apenas convenção. Como o resto do mundo Java, ele depende da infraestrutura de registro de nomes de domínio. A idéia é que você prefixar seu nome de permissão com seu nome de domínio público da Internet (por exemplo, com.myawesomecompany.myapp.MYPERMISSION ) que você possui.

A exclusividade dos nomes de domínio é reforçada pela comunidade de registradores, naturalmente.

Sim, o sistema está aberto a abuso.

EDIT: se você está garantindo um canal baseado em transmissão, você pode adicionar uma verificação de assinatura bidirecional, se quiser. Chame Context.sendBroadcast () com o nome da permissão como um segundo parâmetro.

EDIT2: Sinto que você está pensando demais nisso enquanto fecha os olhos para a foto maior de segurança do aplicativo para Android. O que não é impressionante. Abusar da infraestrutura de privilégios não é como alguém invade um aplicativo Android. Se eu me proponho a interceptar suas intenções, não vou estar montando um receptor de intenção falso (atividade, serviço). Em vez disso, eu me conectaria com um depurador ao receptor genuíno em seu aplicativo, assinatura e tudo mais.

Com ferramentas disponíveis publicamente, leva alguns minutos para colocar um projeto Eclipse em um determinado APK. Carregue-o no Eclipse, conecte-se a um processo em execução, defina pontos de interrupção em APIs do sistema relevantes (o Android é código aberto, lembre-se), voila. Com um pouco de esforço extra, você pode obter fontes Java descompiladas para um APK e depurar em termos de seus métodos, ao contrário dos do sistema.

    
por Seva Alekseyev 12.07.2012 / 20:49
0

Se você quiser impedir que outros aplicativos alterem seu nível de permissão, você pode usar as permissões predefinidas do sistema, que têm nível de "assinatura". Nenhum outro aplicativo regular pode definir permissão antes do sistema.

Usar a permissão do sistema para proteger seu recurso não significa que seu aplicativo tenha que assinar com a chave da plataforma.

exemplo:

<service
        android:name="xxx.xxx.xxx.exservice"
        android:permission="android.permission.BROADCAST_PACKAGE_REMOVED" >

O único problema é que a AppStore mostraria qual permissão você usa se o código abaixo for exibido no manifest.xml do aplicativo

<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED" />

Neste exemplo, você pode acessar seu recurso pela mesma chave de sinal, mas definitivamente não pode transmitir a remoção de pacote.

    
por Kislingk 06.10.2014 / 22:01