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_service
가 init
에서 실행될 경우, 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 오류가 발생할 수 있습니다. 본 포스팅에서는 다음과 같은 주요 작업을 수행하였습니다.
- Vendor 바이너리를 위한 SELinux 도메인 정의
- 파일 컨텍스트 적용
- init 서비스 등록
- 빌드 및 SELinux 로그 분석을 통한 검증
실제 AOSP 개발 환경에서 Vendor 바이너리를 추가할 경우, 반드시 SELinux 정책을 함께 정의하여 보안성을 유지하는 것이 중요합니다. 이를 통해 보다 안전한 Android 시스템을 구축할 수 있습니다.
'Android > Seploicy' 카테고리의 다른 글
adb logcat에서 avc: denied 로그 분석 및 해결 방법 (0) | 2025.05.10 |
---|---|
Third-party 앱을 위한 SELinux 정책 설정 (untrusted_app, isolated_app) (0) | 2025.05.09 |
Android 사용자 정의 System Service를 위한 SELinux 정책 작성 (0) | 2025.05.08 |
Android sepolicy: 커스텀 보드(sepolicy) 추가 및 적용 방법 (0) | 2025.05.06 |
BOARD_SEPOLICY_DIRS와 PRODUCT_PRIVATE_SEPOLICY_DIRS 차이 (0) | 2025.05.05 |