안드로이드 기반의 새로운 하드웨어(커스텀 보드)를 설계하고 AOSP 프로젝트에 추가할 때, 가장 먼저 마주하는 거대한 장벽 중 하나가 바로 SELinux(sepolicy) 정책 설정입니다. 기본적으로 안드로이드는 허용되지 않은 모든 접근을 차단하는 '강제 액세스 제어(MAC)' 모델을 따르기 때문에, 새로운 하드웨어나 드라이버를 추가하면 시스템이 이를 거부하여 정상 동작하지 않는 경우가 많습니다.
본 포스팅에서는 커스텀 보드 개발 시 필수적인 sepolicy 디렉터리 구성부터 정책 파일 작성, 그리고 빌드 시스템 적용까지의 전 과정을 단계별로 상세히 다루어 보겠습니다.

📌 핵심 요약 3줄
- 구조적 접근: device/ 제조사/ 보드명/ sepolicy 경로에 정책 파일을 집중 관리하여 유지보수성 확보.
- 필수 파일 구성: .te 파일로 도메인을 정의하고, file_contexts로 물리적 경로와 보안 라벨을 매핑.
- 디버깅 프로세스: avc: denied 로그를 분석하여 최소 권한 원칙에 따른 allow 규칙을 점진적으로 추가.
1. 커스텀 보드의 sepolicy 추가 프로세스
AOSP 빌드 시스템 내에서 새로운 보드에 대한 정책을 수립하는 전체 흐름은 다음과 같습니다.
| 단계 | 프로세스 | 주요 내용 | 비고 |
| 1단계 | 환경 구성 | device/ 경로 내 커스텀 보드 전용 sepolicy 디렉터리 생성 | 정책 관리의 시작점 |
| 2단계 | 정책 정의 | file.te, domain.te 등을 작성하여 새로운 보안 영역 선언 | 타입(Type)과 도메인 정의 |
| 3단계 | 컨텍스트 매핑 | file_contexts 파일로 실제 파일 경로에 보안 타입 부여 | 라벨링(Labeling) 작업 |
| 4단계 | 빌드 시스템 등록 | BoardConfig.mk 내 관련 변수에 정책 경로 추가 | 빌드 시스템 연동 |
| 5단계 | 검증 및 수정 | 부팅 후 avc 로그를 확인하여 미비한 권한 보강 | audit2allow 활용 단계 |
2. 주요 정책 파일 작성 및 역할
커스텀 보드 디렉터리(device/custom/vendor_board/sepolicy) 내에 생성해야 할 핵심 파일들의 예시입니다.
| 파일명 | 역할 | 코드 예시 |
| file.te | 파일 시스템에 할당될 타입(Type) 정의 | type custom_file, file_type; |
| domain.te | 프로세스가 속할 도메인 및 기본 권한 정의 | type custom_domain, domain; |
| file_contexts | 실제 파일 시스템 경로에 보안 라벨(타입) 연결 | /vendor/bin/custom_exec u:object_r:custom_exec:s0 |
| seapp_contexts | **앱(App)**의 서명이나 패키지명에 따른 도메인 설정 | user=_app domain=custom_domain |
3. AOSP 빌드 시스템 반영 (BoardConfig.mk)
작성한 정책이 빌드 과정에 포함되도록 설정 파일을 수정해야 합니다.
(설정 예시) BOARD_SEPOLICY_DIRS += device/custom/vendor_board/sepolicy
이렇게 경로를 추가하면 빌드 시스템이 해당 폴더 내의 모든 .te 파일을 스캔하여 최종 sepolicy 바이너리에 포함시킵니다.
4. 적용 결과 확인 및 실무 로그 분석
정책이 반영된 후에도 권한 부족으로 기능이 동작하지 않을 수 있습니다. 이때는 dmesg 또는 logcat을 통해 거부 로그를 분석해야 합니다.
예제 로그 분석: "avc: denied { read } for pid=1234 scontext=u:r:custom_domain:s0 tcontext=u:object_r:custom_file:s0 tclass=file"
- 분석: custom_domain(프로세스)이 custom_file(타겟)에 대해 read(동작) 권한이 없어 거부됨.
- 해결책: 해당 도메인 정책 파일에 allow custom_domain custom_file:file { read open }; 규칙 추가.
💡 개발 꿀팁 및 흔히 하는 실수
| 구분 | 항목 | 상세 내용 |
| 개발 꿀팁 | 최소 권한 원칙 준수 | 모든 권한을 한꺼번에 허용하기보다, avc: denied 로그를 확인하며 꼭 필요한 권한만 하나씩 추가하세요. 이는 시스템 보안성을 유지하는 가장 확실한 방법입니다. |
| 개발 꿀팁 | audit2allow 활용 | 수많은 거부 로그를 일일이 분석하기 힘들 때는 audit2allow 도구를 사용하세요. 로그를 정책 문법(.te)으로 자동 변환해 주어 개발 시간을 크게 단축할 수 있습니다. |
| 흔한 실수 | 라벨링 누락 | file_contexts에 경로를 등록했음에도 실제 파일에 라벨이 붙지 않을 때가 있습니다. 빌드 후 ls -Z 명령어를 통해 타겟 파일에 의도한 보안 라벨이 정상적으로 적용되었는지 반드시 확인해야 합니다. |
| 흔한 실수 | Neverallow 위반 | 시스템 코어 영역 접근은 Android 기본 보안 규칙(neverallow)에 의해 강제 차단될 수 있습니다. 이를 우회하기 위해 무리하게 정책을 수정하기보다, 설계 단계에서 데이터 전달 방식을 변경하는 것이 바람직합니다. |
5. 마무리 (결론)
커스텀 보드의 sepolicy를 적절하게 설정하는 것은 단순히 에러를 없애는 작업을 넘어, 시스템 전체의 보안성과 안정성을 결정짓는 중요한 과정입니다. 특히 임베디드 환경에서는 외부 장치와의 통신이 잦으므로, 보안 구멍을 만들지 않으면서도 기능을 충실히 수행할 수 있는 정교한 정책 수립이 필요합니다.
본 가이드가 새로운 안드로이드 기기를 개발하는 엔지니어분들에게 실질적인 도움이 되길 바랍니다. 추가적인 질문이나 특정 로그 분석이 필요하다면 언제든 댓글로 남겨주세요!
'Android System & AOSP Engineering > Android Security & SELinux' 카테고리의 다른 글
| 안드로이드 Vendor 바이너리 SELinux 정책 적용 가이드: sepolicy 설정부터 디버깅까지 (0) | 2025.05.08 |
|---|---|
| 안드로이드 시스템 서비스 추가 가이드: SELinux 정책(sepolicy) 완벽 설정법 (0) | 2025.05.08 |
| AOSP SELinux 정책 설정: BOARD_SEPOLICY_DIRS vs PRODUCT_PRIVATE_SEPOLICY_DIRS 차이점 완벽 정리 (0) | 2025.05.05 |
| AOSP SELinux 정책(sepolicy) 빌드 및 적용 가이드: 기초부터 트러블슈팅까지 (0) | 2025.05.04 |
| Android SELinux 완벽 가이드: 서비스, 바이너리, 파일 시스템 정책 정의법 (0) | 2025.05.02 |