Android에서 Daemon의 보안 및 SELinux 정책
1. 개요
Android에서 Daemon을 실행하려면 단순히 프로세스를 백그라운드에서 실행하는 것뿐만 아니라 보안 정책과 SELinux 설정을 신중하게 고려해야 합니다. Android는 SELinux(기본적으로 Enforcing 모드) 정책을 강제 적용하여 보안성을 높이고 있으며, Daemon이 시스템에서 정상적으로 실행되려면 적절한 권한과 보안 정책이 필요합니다.
이 글에서는 Android에서 Daemon을 안전하게 실행하는 방법과 SELinux 정책을 설정하는 방법을 설명하고, Android 10 이상에서 보안이 강화된 부분에 대해 다룹니다.
2. SELinux 개요 및 Android에서의 보안 정책
2.1 SELinux란?
SELinux(Security-Enhanced Linux)는 리눅스 커널에서 제공하는 Mandatory Access Control(MAC) 시스템으로, 보안 정책을 기반으로 프로세스 및 파일에 대한 접근을 엄격하게 관리합니다. Android는 4.3부터 SELinux를 도입했으며, 5.0부터는 기본적으로 Enforcing 모드에서 실행됩니다.
SELinux는 다음과 같은 요소로 구성됩니다.
- 도메인(Types): 각 프로세스와 파일에 적용되는 보안 컨텍스트 유형
- 정책(Policy): 특정 유형이 어떤 리소스에 접근할 수 있는지를 정의
- 허용(Allow) 규칙: 특정 작업이 허용되도록 명시적으로 지정
2.2 Android에서 SELinux의 역할
Android에서는 SELinux 정책을 통해 시스템과 앱의 권한을 제한하며, 악성 코드나 루트 권한 상승 공격을 방지하는 데 중요한 역할을 합니다. Android에서 Daemon을 실행하려면 반드시 SELinux 정책을 이해하고, 적절한 설정을 적용해야 합니다.
3. Daemon 실행을 위한 권한 설정
3.1 기본적인 실행 방식
Android에서 Daemon을 실행하는 일반적인 방법은 다음과 같습니다.
/system/bin
또는/vendor/bin
디렉터리에 바이너리를 배치init.rc
스크립트를 작성하여 Daemon을 시작- SELinux 정책을 설정하여 권한을 부여
3.2 init.rc를 통한 Daemon 등록
service mydaemon /system/bin/mydaemon
class main
user system
group system
seclabel u:r:mydaemon:s0
oneshot
위 설정에서 중요한 부분은 다음과 같습니다.
user system
및group system
: Daemon이 실행될 사용자 및 그룹을 지정합니다.seclabel u:r:mydaemon:s0
: SELinux 보안 컨텍스트를 설정합니다.oneshot
: Daemon이 한 번 실행 후 종료됨을 의미합니다.
3.3 SELinux 정책 추가
Android에서 새로운 Daemon을 실행하기 위해서는 해당 프로세스가 적절한 SELinux 정책을 가져야 합니다. 예제 정책을 작성하면 다음과 같습니다.
mydaemon.te
파일 생성:
type mydaemon, domain;
type mydaemon_exec, exec_type, file_type;
init_daemon_domain(mydaemon)
allow mydaemon self:capability { net_bind_service sys_time };
allow mydaemon system_data_file:dir { search read write };
file_contexts
파일에 추가:
/system/bin/mydaemon u:object_r:mydaemon_exec:s0
- SELinux 정책 빌드 및 적용:
SELinux 정책을 적용하려면 sepolicy
빌드 후 새 이미지에 포함시켜야 합니다. AOSP 빌드 환경에서 sepolicy
를 빌드하고 새로운 정책을 적용하면 됩니다.
4. Android 10+ 버전에서의 보안 강화 사항
Android 10 이상에서는 보안이 더욱 강화되어, Daemon을 실행할 때 추가적인 고려사항이 필요합니다.
4.1 Scoped Storage 적용
Android 10부터는 Scoped Storage가 적용되어, 앱이 직접 /data
디렉터리에 접근하는 것이 제한됩니다. 따라서 Daemon이 파일을 다룰 때 MANAGE_EXTERNAL_STORAGE
권한이 필요할 수 있습니다.
4.2 SELinux 정책 강화
Android 10+에서는 기본적으로 untrusted_app
도메인이 강화되었으며, 앱이 system
도메인에서 실행되지 않도록 제한이 추가되었습니다. 따라서 Daemon이 system
권한을 필요로 한다면 적절한 정책을 추가해야 합니다.
예제 정책:
neverallow { untrusted_app domain } system_file:dir write;
이 정책은 일반 앱이 system_file
을 수정하지 못하도록 제한하는 역할을 합니다.
4.3 execmem 및 execstack 제한 강화
Android 10 이상에서는 execmem
및 execstack
권한을 가진 바이너리 실행이 제한됩니다. 이를 해결하려면 바이너리를 컴파일할 때 -fPIC
플래그를 사용하여 Position Independent Code(PIC) 형식으로 빌드해야 합니다.
4.4 seccomp 필터 적용
Android 10부터 seccomp
필터가 더욱 강화되었습니다. 따라서 Daemon이 특정 시스템 콜을 사용할 경우 필터링될 수 있으므로, 필요한 시스템 콜이 허용되는지 확인해야 합니다.
5. 결론
Android에서 Daemon을 실행하려면 SELinux 정책과 보안 정책을 반드시 고려해야 합니다. 특히 Android 10 이상에서는 보안이 강화되었기 때문에 기존 방식으로 실행이 어려울 수 있습니다.
- Daemon 실행 시 반드시
init.rc
에서 적절한 설정을 추가해야 합니다. - SELinux 정책을 직접 작성하여 Daemon이 정상적으로 실행될 수 있도록 설정해야 합니다.
- Android 10 이상에서는 Scoped Storage, seccomp 필터, execmem 제한 등의 보안 강화 사항을 고려해야 합니다.
이 가이드를 참고하여 Android에서 안전하게 Daemon을 실행하고 SELinux 정책을 구성해 보시기 바랍니다.
'Android > User Daemon' 카테고리의 다른 글
실전 프로젝트: 간단한 Android Daemon 구현 (0) | 2025.06.25 |
---|---|
Android Daemon을 배포하고 유지보수하는 방법 (0) | 2025.06.24 |
Android NDK를 활용한 사용자 정의 Daemon 개발 (0) | 2025.06.22 |
Android Daemon의 IPC (Inter-Process Communication) (0) | 2025.06.21 |
Android Daemon과 Java/Kotlin 인터페이스 연결 (0) | 2025.06.19 |