Android/Seploicy

Vendor 영역에서 추가한 바이너리에 대한 정책 적용 (vendor_sepolicy)

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

Vendor 영역에서 추가한 바이너리에 대한 정책 적용 (vendor_sepolicy)

Android의 보안 모델에서 SELinux(보안 강화 리눅스)는 중요한 역할을 담당합니다. 특히, AOSP(Android Open Source Project) 기반으로 커스텀 빌드를 진행하는 경우, Vendor 영역에서 추가된 바이너리에 대한 적절한 SELinux 정책을 적용하는 것은 필수적인 작업입니다. 이 글에서는 Vendor 영역에 추가한 바이너리에 대한 SELinux 정책을 적용하는 방법을 자세히 설명하겠습니다.

1. Vendor 영역에서 실행되는 바이너리란?

AOSP에서 system 영역과 vendor 영역은 분리된 보안 경계를 가집니다. 일반적으로 vendor 영역에는 SoC 벤더가 제공하는 드라이버, HAL(Hardware Abstraction Layer), 그리고 특정 제조사가 추가하는 바이너리가 포함됩니다.

예를 들어, 다음과 같은 바이너리가 vendor 파티션에 포함될 수 있습니다.

  • /vendor/bin/vendor_service
  • /vendor/bin/hw/vendor_driver
  • /vendor/bin/custom_daemon

이러한 바이너리는 vendor 영역에서 실행되므로, SELinux 정책을 vendor_sepolicy 내에서 정의해야 합니다.

2. Vendor sepolicy 적용 위치

Vendor 바이너리에 대한 SELinux 정책은 AOSP의 vendor sepolicy 디렉터리에 정의됩니다. 주요 설정 경로는 다음과 같습니다.

  • Vendor 정책 디렉터리:

    • device/<vendor_name>/<device_name>/sepolicy
    • vendor/<vendor_name>/sepolicy
    • BOARD_SEPOLICY_DIRS 내의 추가 경로
  • 주요 SELinux 파일:

    • file_contexts
    • init.vendor.te
    • vendor.te
    • vendor_file.te
    • genfs_contexts

3. Vendor 바이너리 실행을 위한 SELinux 정책 작성

(1) 도메인 생성

먼저, vendor/bin/vendor_service 바이너리를 위한 SELinux 도메인을 생성해야 합니다. 이를 위해 vendor.te 파일을 작성합니다.

# vendor.te

# vendor_service 도메인 정의
type vendor_service, domain;

# vendor_service가 기본적인 실행 권한을 갖도록 허용
allow vendor_service self:process { fork execmem execstack execmod };

# vendor_service가 /vendor/bin 에서 실행될 수 있도록 허용
allow vendor_service vendor_file:dir search;
allow vendor_service vendor_file:file { read execute open getattr };

(2) 바이너리의 파일 컨텍스트 설정

SELinux는 파일에 컨텍스트를 부여하여 적절한 도메인에서 실행될 수 있도록 설정해야 합니다. 이를 위해 file_contexts 파일을 수정합니다.

# file_contexts

/vendor/bin/vendor_service  u:object_r:vendor_exec:s0

여기서 vendor_exec는 실행 가능한 파일에 부여하는 컨텍스트이며, 필요에 따라 새로운 컨텍스트를 정의할 수도 있습니다.

(3) 서비스 정의 및 init 설정

vendor_serviceinit에서 실행될 경우, init.vendor.te에 다음 규칙을 추가해야 합니다.

# init.vendor.te

allow init vendor_service:process { transition sigchld }; 
allow init vendor_file:file execute;

또한, init.rc 파일에서 서비스 실행을 정의해야 합니다.

# init.vendor.rc

service vendor_service /vendor/bin/vendor_service
    class late_start
    user root
    group root
    seclabel u:r:vendor_service:s0

4. AOSP 빌드 시 Vendor sepolicy 적용

위에서 작성한 SELinux 정책을 적용하려면, BOARD_SEPOLICY_DIRS를 수정하여 해당 경로를 추가해야 합니다.

# BoardConfig.mk

BOARD_SEPOLICY_DIRS += device/<vendor_name>/<device_name>/sepolicy

이후, AOSP 빌드를 수행하면 변경된 SELinux 정책이 적용됩니다.

$ source build/envsetup.sh
$ lunch <device_name>-userdebug
$ mmm vendor/sepolicy
$ make -j8

빌드 후 sepolicy를 확인하여 적용 여부를 검사할 수 있습니다.

$ adb shell dmesg | grep 'avc: denied'

5. SELinux 로그 분석 및 문제 해결

SELinux 정책이 올바르게 적용되지 않으면 avc: denied 로그가 출력됩니다. 예를 들어, 다음과 같은 로그가 발생할 수 있습니다.

avc: denied { execute } for pid=1234 comm="vendor_service" name="vendor_service" dev="/dev/block/vendor" ino=67890 scontext=u:r:init:s0 tcontext=u:object_r:vendor_exec:s0 tclass=file permissive=0

이러한 로그를 분석하여 필요한 allow 규칙을 추가하거나, permissive 모드에서 정책을 조정하는 방식으로 문제를 해결할 수 있습니다.

# 임시적으로 permissive 모드 설정 (디버깅용)
$ adb shell setenforce 0

최종적으로 필요한 정책을 vendor.te에 추가한 후, setenforce 1을 실행하여 강제 모드로 다시 전환할 수 있습니다.

6. 결론

Vendor 영역에서 실행되는 바이너리는 system 영역과는 다른 SELinux 정책을 필요로 합니다. 따라서 vendor_sepolicy를 올바르게 구성하지 않으면 바이너리가 실행되지 않거나 SELinux 오류가 발생할 수 있습니다. 본 포스팅에서는 다음과 같은 주요 작업을 수행하였습니다.

  1. Vendor 바이너리를 위한 SELinux 도메인 정의
  2. 파일 컨텍스트 적용
  3. init 서비스 등록
  4. 빌드 및 SELinux 로그 분석을 통한 검증

실제 AOSP 개발 환경에서 Vendor 바이너리를 추가할 경우, 반드시 SELinux 정책을 함께 정의하여 보안성을 유지하는 것이 중요합니다. 이를 통해 보다 안전한 Android 시스템을 구축할 수 있습니다.

728x90
반응형