Android 사용자 정의 System Service를 위한 SELinux 정책 작성
개요
Android에서 새로운 System Service를 추가할 때, 해당 서비스가 정상적으로 동작하기 위해서는 SELinux 정책을 적절히 설정해야 합니다. SELinux는 Android 보안 모델의 핵심 요소로, 서비스가 접근할 수 있는 리소스를 엄격히 제한합니다. 본 포스팅에서는 새로 추가한 System Service에 대한 SELinux 정책을 작성하고 적용하는 방법을 설명하겠습니다.
1. SELinux 정책 개요
SELinux(Security-Enhanced Linux)는 보안 컨텍스트를 기반으로 액세스를 제어하는 강제 접근 제어(MAC) 시스템입니다. Android는 SELinux를 Enforcing 모드로 실행하며, 적절한 정책이 없으면 서비스 실행이 차단될 수 있습니다.
새로운 System Service를 추가하면, 서비스가 실행될 때 SELinux로 인해 avc: denied
로그가 발생할 가능성이 큽니다. 이를 해결하기 위해 적절한 SELinux 정책을 작성해야 합니다.
2. 새로운 System Service 추가
SELinux 정책을 작성하기 전에 먼저 새로운 System Service를 추가해야 합니다. 예를 들어, MySystemService
라는 서비스를 추가했다고 가정하겠습니다.
서비스 구현은 다음과 같이 이루어질 수 있습니다.
public class MySystemService extends SystemService {
public MySystemService(Context context) {
super(context);
}
@Override
public void onStart() {
// 서비스 초기화 코드
Slog.i("MySystemService", "MySystemService started");
}
}
이제 SELinux 정책을 추가하여 해당 서비스가 정상적으로 동작할 수 있도록 설정하겠습니다.
3. SELinux 정책 작성
SELinux 정책은 AOSP 내 sepolicy
디렉터리에 위치하며, 주요 파일들은 다음과 같습니다.
file_contexts
→ 파일에 대한 보안 컨텍스트 정의service_contexts
→ 서비스에 대한 보안 컨텍스트 정의te
파일 → 타입 및 규칙 정의genfs_contexts
→ 가상 파일 시스템에 대한 정책 설정
3.1. 서비스 보안 컨텍스트 정의
먼저, 새롭게 추가한 서비스에 대한 보안 컨텍스트를 service_contexts
파일에 추가합니다.
service_contexts
수정
my_system_service u:object_r:system_service:s0
이 설정은 MySystemService
가 system_service
도메인을 사용하도록 합니다.
3.2. 타입 정의 및 정책 추가
다음으로, 새로운 서비스의 SELinux 도메인을 정의해야 합니다.
my_system_service.te
파일 추가
type my_system_service, system_server_service;
여기서 system_server_service
속성을 부여하여 시스템 서버 내에서 실행될 수 있도록 합니다.
my_system_service.te
에 허용 규칙 추가
다음으로, 서비스가 특정 리소스에 접근할 수 있도록 허용 규칙을 정의합니다.
allow my_system_service system_server:process { getattr };
allow my_system_service system_server_service:service_manager { add find };
allow my_system_service binder:ipc { call transfer };
allow my_system_service system_data_file:file { read write open getattr };
이 규칙들은 다음을 허용합니다:
system_server
에서MySystemService
정보를 가져올 수 있도록 허용 (getattr
)system_server_service
의add
,find
권한을 부여하여 서비스 매니저와 연동 가능하도록 설정binder
IPC 호출과 전송을 허용- 시스템 데이터 파일에 대한 읽기/쓰기 권한 허용
3.3. file_contexts
파일 수정
파일 컨텍스트를 정의하여 정책을 적용할 경로를 설정해야 합니다.
/system/bin/my_system_service u:object_r:my_system_service_exec:s0
이 규칙을 통해 /system/bin/my_system_service
바이너리가 my_system_service_exec
타입을 가지도록 설정합니다.
4. 정책 적용 및 빌드
정책을 작성한 후, SELinux 정책을 빌드하고 적용해야 합니다.
4.1. 정책 빌드
AOSP 루트 디렉터리에서 다음 명령어를 실행하여 정책을 빌드합니다.
mmma system/sepolicy
4.2. 빌드한 정책 적용
정책 빌드 후, 새로운 SELinux 정책을 디바이스에 적용하려면 AOSP를 빌드하고 플래싱해야 합니다.
source build/envsetup.sh
lunch aosp_arm64-eng
make -j8
adb reboot
정책이 정상적으로 적용되었는지 확인하려면 dmesg
또는 logcat
에서 avc: denied
로그가 더 이상 발생하지 않는지 확인해야 합니다.
dmesg | grep 'avc: denied'
logcat | grep 'SELinux'
5. SELinux 정책 검증
SELinux 정책이 정상적으로 적용되었는지 확인하기 위해 audit2allow
명령어를 사용할 수 있습니다.
dmesg | grep 'avc: denied' | audit2allow
출력된 정책을 참고하여 필요한 추가 규칙을 적용하면 됩니다.
결론
Android에서 새로운 System Service를 추가할 때 SELinux 정책을 적절히 설정하지 않으면 서비스가 정상적으로 동작하지 않을 수 있습니다. 본 포스팅에서는 새로운 서비스에 대한 SELinux 정책을 작성하는 방법을 설명하였으며, service_contexts
, te
파일, file_contexts
등을 수정하여 정책을 적용하는 과정을 다루었습니다. SELinux 정책을 철저히 검토하여 보안성을 유지하면서도 서비스가 정상적으로 동작하도록 설정하는 것이 중요합니다.
'Android > Seploicy' 카테고리의 다른 글
Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app) (0) | 2025.05.09 |
---|---|
Vendor 영역에서 추가한 바이너리에 대한 정책 적용 (vendor_sepolicy) (0) | 2025.05.08 |
Android sepolicy: 커스텀 보드(sepolicy) 추가 및 적용 방법 (0) | 2025.05.06 |
BOARD_SEPOLICY_DIRS와 PRODUCT_PRIVATE_SEPOLICY_DIRS 차이 (0) | 2025.05.05 |
AOSP에서 sepolicy 빌드 과정 (0) | 2025.05.04 |