반응형



Android SELinux policy 디렉토리들의 차이점을 설명드리겠습니다.
디렉토리 구조 및 역할
1. system/sepolicy/public/
공개 API 정책 - Vendor가 사용 가능
Vendor/OEM이 참조하고 사용할 수 있는 타입과 속성 정의
System과 Vendor 간의 안정적인 인터페이스 역할
버전 간 호환성 보장 (Treble 요구사항)
읽기 전용으로 vendor가 참조
# 예시 파일들
public/domain.te          # 모든 도메인의 기본 규칙
public/file.te            # 공개 파일 타입들
public/app.te             # 앱 관련 공개 타입
public/attributes         # 공개 속성 정의
특징:
Vendor 이미지가 이 정책들을 의존할 수 있음
Google이 버전 간 호환성 유지 책임
CTS/VTS 테스트로 안정성 검증
2. system/sepolicy/private/
시스템 내부 전용 정책 - Vendor 접근 불가
System partition만 사용하는 내부 구현 정책
Vendor에서 절대 참조하면 안 됨
버전 간 자유롭게 변경 가능
# 예시 파일들
private/system_server.te  # system_server 내부 규칙
private/installd.te       # installd 내부 동작
private/vold.te           # vold 내부 정책
특징:
System 내부 타입 간 상호작용만 정의
Public에서 정의된 타입의 구체적 구현
Vendor가 이걸 쓰면 빌드 에러 발생 (neverallow)
3. system/sepolicy/vendor/ (또는 device/*/sepolicy/)
Vendor/OEM 커스텀 정책
OEM/제조사가 자체 하드웨어/서비스를 위해 추가
Public API만 사용해야 함
Device-specific한 정책
# 예시 위치
device/<제조사 이름>/sepolicy/vendor/
device/google/crosshatch/sepolicy/vendor/
특징:
HAL 서비스, vendor 데몬, 하드웨어 드라이버용
public/ 타입만 참조 가능
private/ 타입 사용 시 정책 위반
4. system/sepolicy/prebuilts/api/
이전 버전 Public API 보관소
prebuilts/api/29.0/public/  # Android 10
prebuilts/api/30.0/public/  # Android 11
prebuilts/api/31.0/public/  # Android 12
Vendor 호환성 검증용
이전 버전 vendor 이미지와 호환되는지 테스트
실제 예시로 이해하기
시나리오: Custom HAL 서비스 추가
# ❌ 잘못된 방법 (private 타입 사용)
# device/mycompany/sepolicy/my_hal.te
type my_hal, domain;
allow my_hal system_data_file:file read;  # system_data_file은 private!

# ✅ 올바른 방법 (public 타입만 사용)
# device/mycompany/sepolicy/my_hal.te
type my_hal, domain;
type my_hal_exec, exec_type, vendor_file_type, file_type;
allow my_hal vendor_configs_file:dir search;  # public 타입
Policy 컴파일 흐름
1. public/ + private/ → system policy 생성
   ↓
2. public/ + vendor/ → vendor policy 생성
   ↓
3. 두 정책 결합 → /vendor/etc/selinux/precompiled_sepolicy
   ↓
4. 커널 로드 → /sys/fs/selinux/policy
Treble과의 관계
Project Treble (Android 8.0+)의 핵심:
System Image (Google)     Vendor Image (OEM)
      ↓                         ↓
  public/ ←---공유 API-------→ vendor/
      +                         ↑
  private/                      |
  (격리됨) -------------------- ✗ 접근 불가
요약 표
디렉토리
용도
Vendor 접근
변경 빈도
예시
public/
공개 API
✅ 읽기만
낮음 (호환성)
untrusted_app, hal_graphics
private/
System 내부
❌ 금지
높음 (자유)
system_server, init
vendor/
OEM 커스텀
✅ 작성
OEM 자유
vendor_camera_hal, custom daemon
prebuilts/api/
이전 버전
참조용
없음 (불변)
호환성 검증
검증 방법
# Treble 호환성 검증
m treble_sepolicy_tests

# Vendor가 private 타입 사용 시 빌드 실패
# Error: type system_data_file is not accessible to vendor
이 구조는 System/Vendor 분리를 통해 Android 업데이트와 OEM 커스터마이징을 독립적으로 가능하게 합니다.

반응형