Android/Seploicy

Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app)

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

Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app)

Android에서는 보안 강화를 위해 SELinux(SeLinux Enforcing Linux)를 활용하여 앱 및 시스템 컴포넌트의 권한을 제어합니다. 특히, Third-party 앱(서드파티 앱)은 기본적으로 untrusted_app 또는 isolated_app 도메인에 속하며, 이 정책을 적절히 구성해야 보안과 기능을 모두 만족하는 환경을 구축할 수 있습니다.

이번 글에서는 Third-party 앱을 위한 SELinux 정책을 설정하는 방법을 설명하고, untrusted_appisolated_app 도메인의 차이점과 함께 예제 코드를 제공합니다.


1. Android SELinux에서 Third-party 앱의 도메인

Android에서 Third-party 앱은 기본적으로 다음 두 가지 SELinux 도메인 중 하나에 속합니다.

  • untrusted_app: 일반적으로 Google Play 또는 외부 마켓에서 설치된 앱이 속하는 기본 도메인
  • isolated_app: 일부 앱이 isolatedProcess=true 플래그를 설정했을 때 적용되는 도메인

이 두 도메인은 시스템의 보안을 위해 엄격하게 제한되며, 특정 파일 또는 시스템 리소스에 접근이 필요할 경우 추가적인 SELinux 정책을 설정해야 합니다.


2. 기본 SELinux 정책 파일 구조

Third-party 앱의 SELinux 정책은 sepolicy 디렉터리에 정의됩니다. 주요 정책 파일들은 다음과 같습니다.

  • sepolicy/public/untrusted_app.te - untrusted_app 도메인에 대한 정책 정의
  • sepolicy/public/isolated_app.te - isolated_app 도메인에 대한 정책 정의
  • sepolicy/private/app.te - 일반 앱 정책 정의

각 파일에서 type, attribute, allow, neverallow 등의 규칙을 설정하여 앱의 권한을 제한합니다.


3. untrusted_app 도메인에 대한 정책 설정

untrusted_app 도메인에 속한 앱은 기본적으로 /data/data/<패키지명> 디렉터리에 대한 읽기/쓰기 권한을 가지며, 일부 제한된 시스템 리소스에 접근할 수 있습니다. 특정 기능을 사용하기 위해 추가적인 SELinux 정책을 적용해야 할 수도 있습니다.

예를 들어, 앱이 /data/vendor 디렉터리 내 특정 파일을 읽어야 한다고 가정하면, untrusted_app.te 파일에 다음과 같은 정책을 추가할 수 있습니다.

allow untrusted_app vendor_data_file:dir r_dir_perms;
allow untrusted_app vendor_data_file:file r_file_perms;

위 정책은 untrusted_app 도메인의 앱이 vendor_data_file에 대해 디렉터리 조회(r_dir_perms), 파일 읽기(r_file_perms) 권한을 가지도록 허용합니다.

그러나 일반적으로 vendor 영역은 Third-party 앱이 접근할 수 없도록 보호됩니다. 따라서 이러한 정책 추가는 신중히 고려해야 합니다.


4. isolated_app 도메인에 대한 정책 설정

isolated_app 도메인은 보안이 더욱 강화된 앱 환경을 위해 사용됩니다. 이 도메인은 Android 8.0(Oreo) 이후로 더욱 엄격하게 적용되며, 주요 특징은 다음과 같습니다.

  • 기본적으로 파일 시스템에 대한 접근이 거의 불가능함
  • /data/data/<패키지명> 디렉터리에 대한 접근도 제한됨
  • binder IPC 통신이 제한적임

만약 isolated_app 도메인의 앱이 특정 서비스와 통신해야 한다면, 다음과 같은 정책을 추가할 수 있습니다.

allow isolated_app some_service:service_manager find;
allow isolated_app some_service:binder call;

위 정책은 isolated_app 도메인의 앱이 some_servicebinder 통신을 할 수 있도록 허용하는 설정입니다.

또한, 네트워크 접근을 허용하려면 다음과 같은 규칙을 추가할 수 있습니다.

allow isolated_app net_radio_prop:file r_file_perms;
allow isolated_app net_radio_prop:dir r_dir_perms;

5. Third-party 앱의 SELinux 정책 추가 방법

  1. 정책 파일 수정:

    • untrusted_app.te 또는 isolated_app.te에 필요한 정책을 추가합니다.
  2. 파일 컨텍스트 설정:

    • file_contexts 파일을 수정하여 새로운 정책이 적용될 파일 경로를 지정합니다.
    /data/vendor(/.*)?   u:object_r:vendor_data_file:s0
  3. Android.bp 수정:

    • AOSP 빌드 시스템에서 새로 추가한 정책을 적용하도록 Android.bp 파일을 수정합니다.
    sepolicy_private {
        name: "custom_app_policy",
        policy_files: [
            "untrusted_app.te",
            "isolated_app.te",
        ],
    }
  4. sepolicy 빌드 및 테스트:

    • BOARD_SEPOLICY_DIRS에 정책이 포함되었는지 확인한 후, mm 또는 m 명령어를 사용하여 sepolicy를 빌드합니다.
    • 빌드 후 adb shell dmesg | grep avc 명령어를 이용하여 SELinux 오류 로그를 확인하고, 필요한 정책을 추가하거나 수정합니다.

6. SELinux 정책 적용 및 검증

SELinux 정책 적용 후, 정상적으로 동작하는지 확인하려면 다음 명령어를 사용할 수 있습니다.

adb shell getenforce

위 명령어가 Enforcing을 반환하면 SELinux가 강제 적용되고 있는 상태입니다. 추가로 logcatdmesg를 활용하여 정책 충돌 여부를 확인할 수 있습니다.

adb shell dmesg | grep 'avc: denied'
adb logcat | grep 'avc: denied'

만약 특정 액세스가 차단되었다면, 해당 로그를 분석하여 필요한 정책을 추가해야 합니다.


7. 결론

Third-party 앱을 위한 SELinux 정책을 설정할 때는 untrusted_appisolated_app의 차이를 이해하고, 필요한 최소한의 권한만 부여하는 것이 중요합니다. SELinux 정책을 적절히 적용하면 보안성을 유지하면서도 앱이 정상적으로 동작할 수 있도록 설정할 수 있습니다.

Android의 보안 모델이 지속적으로 강화됨에 따라, SELinux 정책을 설정할 때 최신 AOSP 소스를 참고하고, 보안 정책을 신중하게 구성하는 것이 중요합니다.

728x90
반응형