[Android] te 파일에 대해 (Sepolicy)
2026. 1. 21. 01:03
Android는 SELinux(Security-Enhanced Linux)를 사용하여 MAC(Mandatory Access Control)를 구현한다. 그리고 Android Sepolicy는 시스템의 모든 프로세스, 파일, 소켓 등에 대한 접근 권한을 정의하는 보안 정책을 말한다. Android Sepolicy 그리고 te 파일에 대해서 알아보자
.te 파일 기본 구조
.te (Type Enforcement) 파일은 SELinux 정책의 핵심 파일이다. 기본 작성법은 다음과 같다.
1. 타입선언
type myapp, domain;
type myapp_exec, exec_type, file_type;
type myapp_data_file, file_type, data_file_type;
여기서 각 줄은 서로 다른 타입을 선언하는 것이다.
(1) type myapp, domain;
myapp은 프로세스가 실행될 수 있는 도메인이다라는 뜻
myapp은 새로운 타입의 이름, domain은 myapp이 속하는 attribute(속성)을 말한다.
이 구문은 프로세스(실행 중인 프로그램)의 보안 컨텍스트를 나타낸다.
(2) type myapp_exec, exec_type, file_type;
myapp_exec은 실행 가능한 바이너리 파일이다라는 뜻
- myapp_exec: 실행 파일의 타입 이름
- exec_type: 실행 가능한 파일임을 나타내는 속성
- file_type: 파일 시스템 객체임을 나타내는 속성
/system/bin/myapp 같은 실행파일에 부여되는 레이블이다.
(3) type myapp_data_file, file_type, data_file_type;
myapp_data_file은 데이터를 저장하는 파일이다라는 뜻
- myapp_data_file: 데이터 파일의 타입 이름
- file_type: 파일 시스템 객체임을 나타내는 속성
- data_file_type: 데이터 파일임을 나타내는 속성
/data/myapp/ 디렉토리의 파일들에 부여되는 레이블이다.
Q. 왜 이렇게 여러개 선언하나요?
SELinux는 프로세스와 파일을 구분하기 때문입니다.

실제 동작 흐름
1. init 프로세스가 /system/bin/myapp 실행
↓
2. /system/bin/myapp의 레이블: myapp_exec
↓
3. 도메인 전환 규칙에 따라 프로세스가 myapp 도메인으로 전환
↓
4. myapp 도메인의 프로세스가 /data/myapp/config 파일 접근 시도
↓
5. /data/myapp/config의 레이블: myapp_data_file
↓
6. SELinux 정책 검사:
allow myapp myapp_data_file:file read;
이 규칙이 있으면 허용, 없으면 거부
Attribute의 역할
domain, exec_type, file_type 등은 attribute(속성)입니다. 이를 사용하면 여러 타입에 대해 한번에 규칙을 적용할 수 있습니다:
(예시)
# 모든 domain(프로세스)이 자기 자신에게 시그널 보내기 허용
allow domain self:process signal;
# 모든 exec_type 파일은 실행 가능
allow init exec_type:file execute;
- myapp (domain) = 프로세스가 실행되는 보안 컨텍스트
- myapp_exec = 실행 바이너리 파일의 레이블
- myapp_data_file = 앱 데이터 파일의 레이블
각각은 독립적인 타입이며, allow 규칙으로 상호작용을 정의합니다
2. 도메인 전환
# init이 myapp을 실행할 때 myapp 도메인으로 전환
init_daemon_domain(myapp)
# 또는 수동으로:
domain_auto_trans(init, myapp_exec, myapp)
3. 접근 권한 규칙 (Allow Rules)
기본 문법: allow source_type target_type:class permissions;
# myapp이 myapp_data_file에 읽기/쓰기 허용
allow myapp myapp_data_file:file { read write open getattr };
# myapp이 디렉토리 조작 허용
allow myapp myapp_data_file:dir { search write add_name remove_name };
# 소켓 사용 허용
allow myapp self:tcp_socket { create connect };
4. 주요 Permission Classes
- file: 일반 파일
- dir: 디렉토리
- lnk_file: 심볼릭 링크
- chr_file: 캐릭터 디바이스
- blk_file: 블록 디바이스
- socket, tcp_socket, udp_socket: 네트워크 소켓
- process: 프로세스 제어
5. 매크로 사용
Android는 일반적인 패턴을 위한 매크로를 제공합니다.
# Binder IPC 사용
binder_use(myapp)
binder_call(myapp, system_server)
# 네트워크 접근
net_domain(myapp)
# Unix 도메인 소켓
unix_socket_connect(myapp, property, init)
6. 파일 컨텍스트 레이블링
file_contexts 파일에서 파일 경로와 타입(type)을 매핑합니다.
- file_contexts
/system/bin/myapp u:object_r:myapp_exec:s0
/data/myapp(/.*)? u:object_r:myapp_data_file:s0
실제 예제
# myapp.te 파일 예제
# 타입 정의
type myapp, domain;
type myapp_exec, exec_type, file_type, vendor_file_type;
type myapp_data_file, file_type, data_file_type, core_data_file_type;
# init에서 실행 시 도메인 전환
init_daemon_domain(myapp)
# Binder 사용
binder_use(myapp)
# 시스템 속성 읽기
get_prop(myapp, system_prop)
# 자신의 데이터 파일 접근
allow myapp myapp_data_file:dir create_dir_perms;
allow myapp myapp_data_file:file create_file_perms;
# 로그 작성
allow myapp kmsg_device:chr_file write;
# 네트워크 사용
allow myapp self:tcp_socket create_stream_socket_perms;
allow myapp self:udp_socket create_socket_perms;
seapp_contexts란?
seapp_contexts는 Android 앱(APK)이 실행될 때 어떤 SELinux 도메인과 데이터 파일 컨텍스트를 사용할지 결정하는 파일입니다. .te 파일이 정책 규칙을 정의한다면, seapp_contexts는 실제 앱과 정책을 매핑합니다.
파일 위치
/system/etc/selinux/plat_seapp_contexts
/vendor/etc/selinux/vendor_seapp_contexts
/system_ext/etc/selinux/system_ext_seapp_contexts
기본 문법
각 줄은 다음과 같은 형식입니다.
key1=value1 key2=value2 ... domain=domain_name type=file_type name=dir_name
주요 키(Key) 설명
- system_server 프로세스 여부
- 앱이 실행되는 Linux 사용자
- _app, system, radio, bluetooth 등
- mac_permissions.xml에서 정의한 seinfo 태그
- 앱의 서명(signature)에 따라 할당됨
- 앱의 패키지 이름
- 앱 프로세스가 실행될 SELinux 도메인
- 앱의 데이터 디렉토리(/data/data/패키지명)에 부여될 파일 타입
- MLS(Multi-Level Security) 레벨 설정
- user, app, all 등
실제 예제
(1) 시스템 서버
isSystemServer=true domain=system_server
- system_server 프로세스는 system_server 도메인으로 실행
(2) 일반 앱 (기본값)
user=_app domain=untrusted_app type=app_data_file levelFrom=user
- 일반 사용자 앱은 untrusted_app 도메인
- 데이터 디렉토리는 app_data_file 타입
(3) 플랫폼 키로 서명된 앱
user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user
플랫폼 서명 앱은 platform_app 도메인 (더 많은 권한)
(4) 특정 패키지 이름 지정
user=_app seinfo=mycompany name=com.mycompany.myapp domain=myapp type=myapp_data_file levelFrom=all
- com.mycompany.myapp 패키지는 myapp 도메인으로 실행
- 데이터 디렉토리는 myapp_data_file 타입
(5) 시스템 유저로 실행되는 앱
user=system seinfo=platform domain=system_app type=system_app_data_file
(6) Isolated 프로세스
user=_isolated domain=isolated_app levelFrom=user
Android에서 자주 사용되는 도메인들:
- untrusted_app: 일반 서드파티 앱
- platform_app: 플랫폼 서명 앱
- system_app: 시스템 파티션의 앱
- priv_app: 특권 앱 (/system/priv-app)
- isolated_app: 격리된 프로세스
- ephemeral_app: Instant Apps
- bluetooth: 블루투스 앱
- nfc: NFC 앱
- radio: 전화 관련 앱
디버깅
# 실행 중인 앱의 컨텍스트
adb shell ps -Z | grep cohttp://m.example.myapp
# 데이터 디렉토리 컨텍스트
adb shell ls -Z /data/data/cohttp://m.example.myapp
출력 예
u:r:myservice_app:s0:c512,c768 u0_a123 12345 ... com.example.myservice
디버깅 팁
1. AVC denial 로그 확인
adb logcat | grep avc
2. audit2allow 사용 (개발 시만)
adb pull /sys/fs/selinux/policy
adb logcat -b events -d | audit2allow -p policy
3. Permissive 모드 (개발/디버깅용):
# 특정 도메인만 permissive
permissive myapp;
참고자료
https://source.android.com/docs/security/features/selinux/concepts?hl=ko
SELinux 개념 | Android Open Source Project
2026년부터 트렁크 안정 개발 모델과 일치하고 생태계의 플랫폼 안정성을 보장하기 위해 2분기와 4분기에 AOSP에 소스 코드를 게시합니다. AOSP를 빌드하고 기여하려면 aosp-main 대신 android-latest-releas
source.android.com
'Android > Android' 카테고리의 다른 글
| [Android] Android.mk와 AIDL(작성중) (0) | 2026.01.21 |
|---|---|
| [Android] Android AIDL 통신 (작성중) (0) | 2026.01.19 |
| [ADB] 각종 ADB shell 명령어 + Android settings 명령어 (0) | 2025.08.19 |
| [Android] Android ACTs (0) | 2025.08.19 |
| [Android] seapp_contexts 예제 형식 (0) | 2024.03.06 |
