L OS부터 안드로이드 어플리케이션은 퍼미션을 protectionLevel에 따라 4가지로 구분하고 있다. 앱 개발자 입장에서는 얼마나 쉽게 권한을 얻을 수 있느냐가 중요한데, 이를 순서대로 정리하면 아래와 같다.
- normal : <use-permission/> 선언 후, 사용자 동의 없이 사용 가능
- dangerous : <use-permission/> 선언 후, 사용자 동의 하에 사용 가능
- signatureOrSystem : 아래 signature에 해당하거나, 단말 출시 시 미리 내장되어 출시된 앱인 경우 사용 가능
- signature : <permission/> 선언한 앱(여기서는 플랫폼)과 <use-permission/> 선언한 앱이 동일한 인증서로 사인된 경우 사용 가능
위 4가지 중에서 일반 개발자(이하, 서드파티 개발자)는 normal이나 dangerous의 protectionLevel을 가진 권한은 얻을 수 있으나, signature나 signatureOrSystem의 protectionLevel을 가진 권한은 얻을 수 없다. 보통 단말 제조사에서 출시시 단말에 포함하는 앱(이하, 프리로드 앱)들이 이런 권한을 사용할 수 있다. 위에 언급된 것처럼, 단말 출시 시 특정 폴더에 앱을 포함하거나, 플랫폼을 사인하는데 사용한 인증서를 사용해 앱을 사인해야 하기 때문이다. 다만, 이 글을 보면 개발 단계에서 우회적인 방법을 통해 인증서를 확보하여 signature 레벨의 권한을 테스트 해볼 수 있다.
안드로이드 개발자사이트에는 안드로이드에서 지원하는 퍼미션 목록이 정리된 페이지가 없다. 대신, 안드로이드 프레임워크 내의 AndroidManifest.xml 소스코드를 통해 각 protectionLevel 별 권한(permission) 목록을 확인할 수 있다. 참고로, normal과 dangerous, signature는 그대로, System 앱은 privileged로 표시되어 있다. 예를 들면, signatureOrSystem 앱이라면 아래와 같이 protectionLevel이 표시된다.
<permission android:name="[퍼미션이름]" android:protectionLevel="signature|privileged" />
그 밖에
- system의 protectionLevel은 특정 폴더(/data/priv-app/*)에 앱이 자리잡고 있어야 올바르게 동작한다. 이 위치는 보통 핸드폰의 바이너리를 만들 때 결정되므로, 서드파티가 임의로 넣을 수는 없다. (물론, 루팅은 예외)
- protectionLevel이 system 인 퍼미션은 업데이트를 통해 신규 획득할 수 없다. 이에 대한 설명은 이 글을 참조하자.
- 단말 제조 과정에서 앱이 들어가는 프로세스를 이해하는데 도움이 될만한 인포그라픽을 HTC에서 공개했다.
참조
- https://developer.android.com/studio/publish/app-signing.html
- https://developer.android.com/guide/topics/manifest/permission-element.html
- http://www.htc.com/us/go/htc-software-updates-process/
- https://android.googlesource.com/platform/frameworks/base/+/master/core/res/AndroidManifest.xml
- http://mobileandlife.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CApplication-%EA%B0%9C%EB%B0%9C-%EC%8B%9C-Platform-key-signing%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%9C-%EA%B2%BD%EC%9A%B0
- https://sunphiz.me/wp/archives/3332
핑백: 안드로이드 package dump 분석 – Dog발자
핑백: System 앱의 퍼미션 획득 – Dog발자