Android System & AOSP Engineering/Android Security & SELinux

Android Third-party 앱 SELinux 정책 가이드: untrusted_app과 isolated_app 차이점

임베디드 친구 2025. 5. 9. 21:53
반응형

안드로이드 에코시스템의 보안을 지탱하는 핵심 기둥은 SELinux(Security-Enhanced Linux)입니다. 시스템 서비스뿐만 아니라 일반 사용자가 설치하는 Third-party 앱(서드파티 앱) 역시 이 SEL인터넷 정책의 엄격한 통제 아래 놓여 있습니다. 개발 과정에서 특정 하드웨어나 벤더 리소스에 앱이 접근해야 할 때, 이 보안 정책을 이해하지 못하면 기능 구현 자체가 불가능해질 수 있습니다.

본 포스팅에서는 서드파티 앱이 할당받는 주요 도메인인 untrusted_app과 isolated_app의 특성을 비교하고, 실제 개발 환경에서 필요한 권한을 안전하게 추가하는 방법을 정리해 보겠습니다.

Generated by Gemini AI.

📌 핵심 요약 3줄

  1. 도메인 구분: 일반 앱은 untrusted_app, 높은 보안이 필요한 격리 프로세스는 isolated_app 도메인에 할당됩니다.
  2. 최소 권한 원칙: 서드파티 앱은 시스템 핵심 영역 접근이 차단되어 있으므로, 필요한 리소스에 대해서만 좁은 범위의 allow 규칙을 적용해야 합니다.
  3. 검증 프로세스: 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 로그가 있다면 댓글로 편하게 질문 남겨주세요!

반응형