Android 사용자 정의 Framework Service의 권한 및 보안 설정
Android에서 사용자 정의 Framework Service를 개발할 때, 보안과 권한 관리는 필수적인 요소입니다. 특히, system_server에서 실행되는 서비스는 높은 권한을 가지므로 잘못된 보안 설정이 시스템 전체의 취약점을 초래할 수 있습니다. 본 포스팅에서는 Framework Service의 보안 설정을 다루며, AndroidManifest.xml에서의 권한 정의, SELinux 정책 적용, PermissionController를 활용한 동적 권한 관리, 그리고 system_server에서 실행되는 서비스의 보안 정책 적용 방법을 설명하겠습니다.
1. AndroidManifest.xml에서 권한 정의
사용자 정의 Framework Service가 특정 기능을 사용하기 위해서는 권한이 필요합니다. Android에서는 권한을 AndroidManifest.xml
에서 정의할 수 있으며, 아래와 같은 방식으로 권한을 선언합니다.
1.1 권한 정의 예제
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.frameworkservice">
<permission android:name="com.example.frameworkservice.PERMISSION"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.frameworkservice.PERMISSION" />
<application>
<service android:name=".MyFrameworkService"
android:permission="com.example.frameworkservice.PERMISSION" />
</application>
</manifest>
위 예제에서는 com.example.frameworkservice.PERMISSION
이라는 권한을 정의하고, 이를 특정 서비스에 적용하였습니다.
1.2 protectionLevel 속성
normal
: 기본적으로 부여되는 권한.dangerous
: 사용자 동의가 필요한 권한.signature
: 동일한 서명을 가진 앱만 접근 가능.signatureOrSystem
: 시스템 또는 동일 서명 앱에서만 접근 가능.
Framework Service의 경우 일반적으로 signature
또는 signatureOrSystem
수준으로 보호하는 것이 일반적입니다.
2. SELinux 정책 적용 (sepolicy 디렉터리 설정)
Android에서는 SELinux(보안 강화 리눅스)를 활용하여 프로세스와 리소스 간의 보안 정책을 적용합니다. 사용자 정의 Framework Service를 추가할 때, sepolicy
를 설정해야 합니다.
2.1 Service에 대한 SELinux 도메인 추가
새로운 Framework Service를 위해 sepolicy
디렉터리에 정책을 추가해야 합니다.
service.te
파일 수정
# 새로운 서비스 도메인 정의
type my_framework_service, domain;
type my_framework_service_exec, exec_type, file_type;
# system_server에서 실행되도록 허용
allow system_server my_framework_service:process { transition sigchld };
allow my_framework_service self:capability { dac_override sys_admin };
file_contexts
설정
/system/bin/my_framework_service u:object_r:my_framework_service_exec:s0
이러한 설정을 통해, my_framework_service
가 system_server
내에서 실행되도록 보안 정책을 적용할 수 있습니다.
3. PermissionController를 활용한 동적 권한 관리
Android 10 이후부터 권한 관리는 더욱 강화되었으며, PermissionController
를 활용하면 특정 권한을 동적으로 관리할 수 있습니다.
3.1 PermissionController 활용 예제
public void requestPermission(Context context) {
String permission = "com.example.frameworkservice.PERMISSION";
if (context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions((Activity) context, new String[]{permission}, 100);
}
}
위 코드는 특정 권한이 부여되지 않았을 경우, 런타임에 권한 요청을 수행하는 예제입니다.
4. system_server에서 실행되는 서비스의 보안 정책 적용
Framework Service는 system_server
에서 실행되므로, 보안 정책을 철저하게 적용해야 합니다.
4.1 system_server 내 서비스 등록
SystemServer.java
에서 사용자 정의 서비스를 등록하려면, SystemService
클래스를 확장하여 구현해야 합니다.
public class MyFrameworkService extends SystemService {
public MyFrameworkService(Context context) {
super(context);
}
@Override
public void onStart() {
publishBinderService("my_framework_service", new MyFrameworkServiceImpl());
}
}
publishBinderService
를 사용하여 서비스가 system_server에 바인딩되도록 설정합니다.
4.2 Android.bp
파일 설정
AOSP 빌드 시스템에서 서비스가 빌드되도록 Android.bp
파일을 설정해야 합니다.
cc_binary {
name: "my_framework_service",
srcs: ["MyFrameworkService.cpp"],
shared_libs: ["libbinder", "libutils"],
init_rc: ["my_framework_service.rc"],
}
이와 같이 설정하면 my_framework_service
가 system_server 내에서 실행되도록 빌드됩니다.
4.3 system_server에서 서비스 보안 적용
System Service는 불필요한 API 접근을 제한하고, 입력값 검증을 철저히 해야 합니다.
@Override
public void onStart() {
enforceCallingPermission("com.example.frameworkservice.PERMISSION", "Permission denied");
publishBinderService("my_framework_service", new MyFrameworkServiceImpl());
}
위 코드에서 enforceCallingPermission()
을 통해 호출자가 특정 권한을 가지고 있는지 검사하여, 보안성을 강화할 수 있습니다.
결론
사용자 정의 Framework Service를 만들 때는 권한 설정, SELinux 정책 적용, PermissionController 활용, system_server 보안 설정 등을 철저하게 관리해야 합니다. 이를 통해 보안 취약점을 최소화하고, 안정적인 서비스를 제공할 수 있습니다. AOSP를 커스텀하여 개발하는 경우에는 SELinux 정책과 AOSP 빌드 시스템에 대한 충분한 이해가 필요하므로, 단계별로 적용하면서 테스트하는 것이 중요합니다.
'Android > Custom Framework' 카테고리의 다른 글
Android 사용자 정의 Framework Service 디버깅 및 문제 해결 (0) | 2025.05.30 |
---|---|
애플리케이션에서 사용자 정의 Framework Service 활용하기 (0) | 2025.05.29 |
Android 사용자 정의 Framework Service 만들기 - AOSP 빌드 및 테스트 (1) | 2025.05.27 |
Android 사용자 정의 Framework Service 만들기 (0) | 2025.05.26 |
Android 사용자 정의 Framework Service 만들기 (0) | 2025.05.24 |