본문
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에 대해서도 자동으로 권한 획득
권한 그룹 | 권한 |
---|---|
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 |
댓글