본문

170411(화) - System permission

System permission


Android는 권한으로 구분되는 운영체제.

- 각 App은 고유한 System ID (Linux user ID, Group ID)를 사용

- System의 각 부분도 고유 ID로 구분


App 과 App, System 간 서로 격리



보안 아키텍쳐

App을 사용하는 사용자에게 안좋은 영향을 미칠 수 있는 작업을 수행할 권한이 없다는 것이 바탕


Android app은 각각 하나의 process sandbox에서 작업하기 때문에 리소스 및 데이터를 명시적으로 공유해야 한다.

- 권한을 얻기위해 사용자에게 동의를 구함


Dalvik VM

- 보안 대상이 아님

- 모든앱이 Native code 실행 가능



App signing

APK는 인증서로 서명

개인키는 개발자가 유지


인증서

App 작성자 구분


- 서명 레벨 권한에 대한 액세스 부여, 거부

- 다른 App과 동일한 Linux ID 부여 요청 수락, 거부


User ID 및 File Access

설치시 각각의 패키지에 고유 Linux ID 제공

ID는 패키지 수명과 동일


다른기기에서는 동일한 패키지가 다른 UID를 가질 수 있음

즉, 각각의 패키지는 특정 기기에서 고유한 UID를 가진다.


보안은 process level에서 적용

- 패키지는 각각 다른 Linux 사용자로 실행

- 두개의 패키지는 각각 다른 프로세스에서 실행

- AdroidManifest.xml 의 manifest - sharedUserId 를 통해서 동일한 user ID가 할당되도록 가능

두 개의 패키지는 동일한 app으로 취급


 MODE_WORLD_READABLE 및/또는 MODE_WORLD_WRITEABLE 플래그

위의 플래그를 사용하면 다른 패키지가 파일을 읽고 쓸 수 있도록 허용 가능


getSharedPreferences(String, int)openFileOutput(String, int) 또는 openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory)



Permission 사용


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.android.app.myapp" >
   
<uses-permission android:name="android.permission.RECEIVE_SMS" />
    ...
</manifest>

- normal permission

시스템이 자동으로 이러한 권한 부여


- dangerous permission

사용자에게 권한을 부여받도록 명시


M 이상은 사용자로부터 런타임에 권한 요청

M 미만은 설치시에 권한 요청



Normal permission & Dangerous permission

normal permission

sandbox 외부에 있는 데이터 또는 리소스에 접근시

개인정보나 다른앱의 위험 영역에 접근하지 않음


시스템이 자동으로 권한 부여


dangerous permission

사용자의 데이터나 다른 앱의 작업에 영향을 미침

사용자가 명시적으로 부여해야 사용가능.



Permission group

이전에 그룹내의 권한을 획득했다면, 그룹내의 다른 permission에 대해서도 자동으로 권한 획득


표 1. 위험한 권한 및 권한 그룹.

권한 그룹권한
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE


Permission 정의 및 적용

custom permission 적용 방법


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.myapp" >
   
<permission android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
       
android:label="@string/permlab_deadlyActivity"
       
android:description="@string/permdesc_deadlyActivity"
       
android:permissionGroup="android.permission-group.COST_MONEY"
       
android:protectionLevel="dangerous" />
    ...
</manifest>

같은 이름은 허용하지 않는다.

(권장 : com.example.myapp.ENGAGE_HYPERSPACE)


protectionLevel : 필수

permissionGroup : 선택


- 권한에 대한 레이블 및 설명


<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the application to call
    phone numbers without your intervention. Malicious applications may
    cause unexpected calls on your phone bill. Note that this does not
    allow the application to call emergency numbers.
</string>


- 권한 확인 : shell로 확인 가능


$ adb shell pm list permissions -s
All Permissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
Internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...



AndroidManifest.xml 권한 적용

- Activity

액티비티 시작 사용자 제한

startActivity(), startActivityForResult() 가 실행되는 동안 검사


- Service 

서비스를 시작하거나 바인딩할 수 있는 사용자 제한

startService(), stopService(), bindService() 가 실행되는 동안 검사


- BroadcastRecever

전송할 수 있는 사용자 제한


- sendBroadcast() 반환후에 검사

오류는 나지 않으며 intent 만 제공되지 않음


- registerReceiver()로 broadcast할 수 있는 사용자 제한 가능


- contentProvider

데이터에 액세스 할 수 있는 사용자 제한


- readPermission

데이터 읽기 제한


query()


- writePermission

데이터 쓰기 제한


insert(), update(), delete()



URI permission

부분적으로 permission을 부여하여 URI 에 대한 보안 강화


Intent.FLAG_GRANT_READ_URI_PERMISSION 및/또는 Intent.FLAG_GRANT_WRITE_URI_PERMISSION











'Mobile > Android API' 카테고리의 다른 글

170424(월) - Android 7.0 <Multi-window>  (0) 2017.04.24
170418(화) - Java 8 언어 기능 사용  (0) 2017.04.18
170411(화) - Device Compatibility  (0) 2017.04.11
170328(화) - App 기본 항목  (0) 2017.03.28
170328(화) - ART & Dalvik  (0) 2017.03.28

공유

댓글