안드로이드 오픈 소스 프로젝트(AOSP) 개발 과정에서 가장 까다로우면서도 중요한 부분이 바로 SELinux(sepolicy) 설정입니다. SELinux는 안드로이드 보안 모델의 중추 역할을 하며, 시스템의 각 프로세스가 허용된 자원에만 접근할 수 있도록 강제합니다. 새로운 서비스나 드라이버를 추가할 때 반드시 마주하게 되는 sepolicy 빌드와 적용 과정을 실무 관점에서 상세히 정리해 보고자 합니다.

📌 핵심 요약 3줄
- SELinux의 역할: 강제 액세스 제어(MAC)를 통해 안드로이드 시스템 전반의 보안 강화.
- 정책 반영 프로세스: .te 파일 수정 후 file_contexts 매핑, 그리고 증분 빌드를 통한 이미지 플래싱.
- 디버깅 핵심: avc: denied 로그 분석을 통한 정책 최적화 및 audit2allow 도구 활용.
1. AOSP 환경 설정 및 빌드 준비
SELinux 정책을 빌드하기 위해서는 먼저 타겟 디바이스에 맞는 AOSP 소스 코드와 환경 설정이 선행되어야 합니다.
1.1 소스 코드 다운로드 및 환경 변수 설정 Google의 공식 저장소에서 코드를 동기화하고 빌드 도구를 불러옵니다.
(명령어 시작) repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r1 repo sync -j$(nproc)
source build/envsetup.sh lunch aosp_arm64-userdebug (명령어 끝)
2. sepolicy 빌드 과정 이해
AOSP 내에서 SELinux 정책이 컴파일되는 과정은 크게 4단계로 나뉩니다.
| 단계 | 주요 작업 | 관련 파일 / 도구 | 비고 |
| 정책 결합 | 시스템의 공용(public) 및 비공개(private) 정책을 하나로 통합 | policy.conf | 영역 간 정책 충돌 여부 검사 |
| 정책 컴파일 | 텍스트 설정 파일을 커널용 바이너리 포맷으로 변환 | checkpolicy, secilc | CIL(Common Intermediate Language) 변환 포함 |
| 컨텍스트 매핑 | 파일 시스템 경로와 보안 라벨(Label)을 연결 | file_contexts | 실제 파일 생성 시 라벨링의 기준 |
| 이미지 패키징 | 최종 바이너리를 각 파티션 이미지에 포함 | make bootimage, vendor.img | 부팅 시 init 프로세스에 의해 로드됨 |
3. AOSP에서 sepolicy 수정 및 빌드 실전
실제 새로운 도메인(mydomain)을 생성하고 적용하는 예시입니다.
3.1 새로운 도메인 및 컨텍스트 정의 보통 제조사나 기기별 특화 정책은 device/제조사/SOC/sepolicy 또는 system/sepolicy/private 등에 추가합니다.
- mydomain.te 파일 내용 예시: type mydomain, domain; type mydomain_exec, exec_type, file_type; init_daemon_domain(mydomain)
- file_contexts 파일 내용 예시: /vendor/bin/mydomain u:object_r:mydomain_exec:s0
3.2 증분 빌드 수행 전체 빌드 대신 sepolicy 관련 변경 사항만 빠르게 빌드할 수 있습니다.
(명령어 시작) mmm system/sepolicy (명령어 끝)
결과물은 보통 out/target/product/디바이스명/vendor/etc/selinux/ 경로 등에 생성됩니다.
4. 정책 적용 및 실기기 테스트
빌드된 정책을 기기에 올리고 제대로 동작하는지 확인합니다.
- 부팅 이미지 생성: make bootimage 명령어를 실행합니다.
- 이미지 플래싱: fastboot flash boot boot.img 명령어로 기기에 기록합니다.
- 상태 확인: adb shell getenforce 명령어를 통해 결과가 Enforcing인지 확인합니다.
💡 개발 꿀팁 및 흔히 하는 실수
- 요청하신 개발 가이드 요약 내용을 한눈에 보기 편하도록 표로 정리해 드립니다. 블로그 포스팅 시 "개발을 위한 팁"과 "흔히 하는 실수" 섹션에 활용하기 좋은 구성입니다.
💡 SELinux 개발 가이드 요약구분 항목 상세 내용 꿀팁 (Tips) Permissive 모드 활용 개발 초기 단계에서 setenforce 0 명령어를 사용하면, 실제 차단 없이 로그(avc: denied)만 수집할 수 있어 전체적인 정책 설계를 빠르게 진행할 수 있습니다. 꿀팁 (Tips) audit2allow 도구 사용 adb logcat에 찍힌 복잡한 거부 로그를 SELinux 정책 문법(.te)으로 자동 변환해 줍니다. 수동 작성 시간을 획기적으로 단축해 주는 필수 도구입니다. 흔한 실수 (Mistakes) Neverallow 위반 Google AOSP에 정의된 기본 보안 규칙(neverallow)을 위반하면 빌드 단계에서 에러가 발생합니다. 무조건적인 권한 허용보다는 도메인 분리를 먼저 검토해야 합니다. 흔한 실수 (Mistakes) 이미지 불일치 system 파티션과 vendor 파티션의 정책 버전이 서로 맞지 않을 경우, 보안 컨텍스트 불일치로 인해 무한 재부팅(Bootloop) 현상이 발생할 수 있으니 주의가 필요합니다.
5. 마무리 (결론)
AOSP에서 SELinux 정책을 빌드하고 적용하는 것은 단순한 설정 변경 이상의 의미를 갖습니다. 안드로이드 보안 아키텍처를 깊이 있게 이해하고, '최소 권한 원칙'을 실천하는 과정이기 때문입니다. 정책 적용 중 발생하는 avc: denied 로그를 꼼꼼히 분석하여 보안과 기능성 사이의 균형을 맞추는 것이 핵심입니다.
본 가이드가 AOSP 개발 환경에서 안전하고 효율적인 보안 정책을 수립하는 데 도움이 되기를 바랍니다. 궁금한 점은 댓글로 공유해 주세요!
'Android System & AOSP Engineering > Android Security & SELinux' 카테고리의 다른 글
| AOSP 커스텀 보드 sepolicy 추가 및 적용 가이드: 단계별 실전 예제 (0) | 2025.05.06 |
|---|---|
| AOSP SELinux 정책 설정: BOARD_SEPOLICY_DIRS vs PRODUCT_PRIVATE_SEPOLICY_DIRS 차이점 완벽 정리 (0) | 2025.05.05 |
| Android SELinux 완벽 가이드: 서비스, 바이너리, 파일 시스템 정책 정의법 (0) | 2025.05.02 |
| Android SELinux 설정 가이드: domain 정의부터 file_contexts 적용까지 (0) | 2025.05.01 |
| Android SELinux 정책 문법 완벽 정리: type, allow, neverallow 예제 가이드 (0) | 2025.04.30 |