안드로이드 에코시스템의 보안을 지탱하는 핵심 기둥은 SELinux(Security-Enhanced Linux)입니다. 시스템 서비스뿐만 아니라 일반 사용자가 설치하는 Third-party 앱(서드파티 앱) 역시 이 SEL인터넷 정책의 엄격한 통제 아래 놓여 있습니다. 개발 과정에서 특정 하드웨어나 벤더 리소스에 앱이 접근해야 할 때, 이 보안 정책을 이해하지 못하면 기능 구현 자체가 불가능해질 수 있습니다.
본 포스팅에서는 서드파티 앱이 할당받는 주요 도메인인 untrusted_app과 isolated_app의 특성을 비교하고, 실제 개발 환경에서 필요한 권한을 안전하게 추가하는 방법을 정리해 보겠습니다.

📌 핵심 요약 3줄
- 도메인 구분: 일반 앱은 untrusted_app, 높은 보안이 필요한 격리 프로세스는 isolated_app 도메인에 할당됩니다.
- 최소 권한 원칙: 서드파티 앱은 시스템 핵심 영역 접근이 차단되어 있으므로, 필요한 리소스에 대해서만 좁은 범위의 allow 규칙을 적용해야 합니다.
- 검증 프로세스: dmesg와 logcat의 avc: denied 로그를 기반으로 실제 차단 내역을 분석하고 정책을 보강합니다.
1. 서드파티 앱의 주요 SELinux 도메인 비교
안드로이드는 앱의 신뢰도와 실행 방식에 따라 서로 다른 보안 도메인을 부여합니다.
| 항목 | 특징 | 보안 수준 | 비고 |
| untrusted_app | Google Play 등 외부에서 설치된 일반적인 앱의 기본 도메인 | 보통 | 사용자 데이터 영역 접근 가능 |
| isolated_app | 서비스 실행 시 isolatedProcess=true 설정된 격리 프로세스 | 매우 높음 | 대부분의 IPC 및 파일 접근 차단 |
| ephemeral_app | 인스턴트 앱(Instant Apps) 등 설치 없이 실행되는 임시 앱 | 높음 | 제한된 런타임 권한 및 저장소 접근 |
2. 도메인별 정책 설정 실전
앱이 정상적으로 동작하기 위해 필요한 추가 권한을 설정하는 예시입니다.
2.1. untrusted_app: 벤더 데이터 접근 일반 앱이 특정 벤더 파티션의 파일을 읽어야 하는 경우, untrusted_app.te에 아래와 같이 정의합니다.
(설정 예시) allow untrusted_app vendor_data_file:dir r_dir_perms; allow untrusted_app vendor_data_file:file r_file_perms;
2.2. isolated_app: 서비스 바인더 통신 격리된 프로세스는 보안상 바인더 통신도 제한됩니다. 특정 서비스와 통신이 필요할 경우 아래 규칙이 필요합니다.
(설정 예시) allow isolated_app some_service:service_manager find; allow isolated_app some_service:binder call;
3. SELinux 정책 추가 및 적용 단계
AOSP 빌드 시스템에서 새로운 정책을 반영하는 표준 절차는 다음과 같습니다.
| 단계 | 단계명 | 주요 내용 |
| 1 | 파일 수정 | untrusted_app.te 또는 isolated_app.te에 필요한 allow 규칙 추가 |
| 2 | 컨텍스트 지정 | file_contexts 파일에 대상 리소스의 보안 라벨(u:object_r:...) 명시 |
| 3 | 빌드 시스템 등록 | Android.bp 또는 BoardConfig.mk에 sepolicy 경로 포함 여부 확인 |
| 4 | 빌드 및 테스트 | mmm system/sepolicy 실행 후 생성된 이미지를 디바이스에 플래싱 |
4. 정책 적용 여부 검증
정책이 제대로 반영되었는지 확인하려면 adb 명령어를 통해 로그를 실시간으로 모니터링해야 합니다.
- 강제 모드 확인: adb shell getenforce (결과가 Enforcing이어야 함)
- 거부 로그 확인: adb shell dmesg | grep avc 또는 adb logcat | grep denied
로그 예시: "avc: denied { read } for scontext=u:r:untrusted_app:s0:c123 tcontext=u:object_r:vendor_data_file:s0 tclass=file" -> 분석: untrusted_app이 vendor_data_file 라벨이 붙은 파일을 읽으려다 거부됨.
💡 개발 꿀팁 및 흔히 하는 실수
| 구분 | 주요 항목 | 상세 내용 및 권장 사항 |
| 개발 꿀팁 | 최소 권한 부여 | untrusted_app 전체에 권한을 주는 것은 보안에 취약합니다. 앱의 **서명(Signature)**을 기준으로 도메인을 세분화하여 관리하세요. |
| 개발 꿀팁 | audit2allow 활용 | 거부(denied) 로그가 방대할 경우, audit2allow 도구를 사용하여 필요한 allow 규칙을 자동 추출한 뒤 검토하여 적용하세요. |
| 흔한 실수 | neverallow 위반 | 서드파티 앱이 /data/system 등 시스템 민감 파일에 접근하면 Google의 기본 보안 정책(neverallow)과 충돌하여 빌드가 실패합니다. |
| 흔한 실수 | 카테고리 이해 부족 | scontext 뒤의 :c123,c456 같은 카테고리 값은 데이터 격리를 위한 것입니다. 이를 무시하고 정책을 넓게 설정하지 않도록 주의하세요. |
결론
서드파티 앱을 위한 SELinux 정책 설정은 안드로이드 보안의 정수입니다. 사용자의 개인정보를 보호하면서도 앱의 기능을 온전히 수행할 수 있도록 하려면, untrusted_app과 isolated_app의 차이를 명확히 인지하고 최소 권한 원칙을 철저히 지켜야 합니다.
새로운 정책을 추가할 때는 항상 최신 AOSP 보안 가이드라인을 참고하고, 빌드 시 발생하는 에러 로그를 꼼꼼히 분석하시기 바랍니다. 관련하여 궁금한 점이나 해결되지 않는 avc 로그가 있다면 댓글로 편하게 질문 남겨주세요!
'Android System & AOSP Engineering > Android Security & SELinux' 카테고리의 다른 글
| 안드로이드 SELinux 정책 생성 가이드: audit2allow 활용법 및 검증 정리 (0) | 2025.05.11 |
|---|---|
| 안드로이드 SELinux avc: denied 로그 분석 및 해결 완벽 가이드 (0) | 2025.05.10 |
| 안드로이드 Vendor 바이너리 SELinux 정책 적용 가이드: sepolicy 설정부터 디버깅까지 (0) | 2025.05.08 |
| 안드로이드 시스템 서비스 추가 가이드: SELinux 정책(sepolicy) 완벽 설정법 (0) | 2025.05.08 |
| AOSP 커스텀 보드 sepolicy 추가 및 적용 가이드: 단계별 실전 예제 (0) | 2025.05.06 |