# SELinux策略编写

## 概述

SELinux (Security-Enhanced Linux) 是Android系统的重要安全机制，通过强制访问控制（MAC）提供额外的安全保护层。

## SELinux基础

### 1. SELinux概念

#### 什么是SELinux
- Linux内核的安全模块
- 提供强制访问控制（MAC）
- 补充传统的自主访问控制（DAC）

#### SELinux模式
- **Enforcing**: 强制模式，拒绝违反策略的操作
- **Permissive**: 宽容模式，记录但不拒绝
- **Disabled**: 禁用模式，不执行SELinux

#### 查看SELinux状态
```bash
# 查看SELinux状态
adb shell getenforce

# 设置SELinux模式（需要root）
adb shell setenforce 0  # Permissive
adb shell setenforce 1  # Enforcing
```

### 2. SELinux策略

#### 策略类型
- **TE (Type Enforcement)**: 类型强制，主要策略类型
- **MLS (Multi-Level Security)**: 多级安全
- **RBAC (Role-Based Access Control)**: 基于角色的访问控制

#### 策略文件位置
```
/system/etc/selinux/
├── plat_sepolicy.cil      # 平台策略
├── system_sepolicy.cil    # 系统策略
└── vendor_sepolicy.cil    # 厂商策略
```

## SELinux策略语法

### 1. 类型定义

#### 定义类型
```sepolicy
# 定义进程类型
type system_server, domain;

# 定义文件类型
type system_file, file_type;

# 定义属性
typeattribute system_server coredomain;
```

#### 类型属性
```sepolicy
# 定义属性
typeattribute coredomain;

# 将类型添加到属性
typeattribute system_server coredomain;
```

### 2. 访问向量规则

#### allow规则
```sepolicy
# 允许system_server读取system_file
allow system_server system_file:file read;

# 允许system_server执行system_file
allow system_server system_file:file execute;
```

#### 规则语法
```
allow source_type target_type:class permission_set;
```

#### 常用权限
- **file**: read, write, execute, create, delete, getattr, setattr
- **dir**: read, write, search, add_name, remove_name
- **socket**: create, bind, listen, accept, connect, send, receive
- **process**: fork, transition, signal, ptrace

### 3. 类型转换规则

#### type_transition
```sepolicy
# 文件类型转换
type_transition system_server system_file:process system_server;

# 目录类型转换
type_transition system_server system_file:dir system_data_file;
```

#### 规则语法
```
type_transition source_type target_type:class default_type;
```

## 常见策略配置

### 1. 系统服务策略

#### SystemServer策略
```sepolicy
# SystemServer类型定义
type system_server, domain;
typeattribute system_server coredomain;

# 允许SystemServer执行
allow system_server system_file:file execute;

# 允许SystemServer读取系统属性
allow system_server system_prop:property_service get;

# 允许SystemServer创建socket
allow system_server system_server:socket create_socket_perms;
```

#### 服务策略示例
```sepolicy
# ActivityManagerService策略
type activity_service, service_manager_type;

# 允许system_server注册服务
allow system_server activity_service:service_manager add;

# 允许应用查询服务
allow untrusted_app activity_service:service_manager find;
```

### 2. 应用策略

#### 应用域定义
```seplatform
# 应用域
type untrusted_app, domain;
typeattribute untrusted_app appdomain;

# 应用数据目录
type app_data_file, file_type, data_file_type;
```

#### 应用权限策略
```sepolicy
# 允许应用读取自己的数据
allow untrusted_app app_data_file:file rw_file_perms;

# 禁止应用访问系统文件
neverallow untrusted_app system_file:file { read write execute };
```

### 3. 文件系统策略

#### 文件类型定义
```sepolicy
# 系统文件
type system_file, file_type;

# 数据文件
type system_data_file, file_type, data_file_type;

# 缓存文件
type cache_file, file_type, cache_file_type;
```

#### 文件访问规则
```sepolicy
# 允许system_server读写系统数据
allow system_server system_data_file:file rw_file_perms;

# 允许system_server读取系统文件
allow system_server system_file:file read;
```

## 策略调试

### 1. 查看SELinux日志

#### dmesg日志
```bash
# 查看SELinux拒绝日志
adb shell dmesg | grep avc

# 实时查看
adb shell dmesg -w | grep avc
```

#### logcat日志
```bash
# 查看SELinux日志
adb logcat | grep avc

# 查看特定标签
adb logcat -s avc
```

### 2. 分析拒绝日志

#### 日志格式
```
avc: denied { read } for pid=1234 comm="system_server" 
name="file" dev="mmcblk0p1" ino=12345 
scontext=u:r:system_server:s0 
tcontext=u:object_r:system_file:s0 
tclass=file permissive=0
```

#### 日志解析
- **denied**: 拒绝的操作
- **scontext**: 源上下文（进程）
- **tcontext**: 目标上下文（对象）
- **tclass**: 目标类别
- **permissive**: 是否在宽容模式

### 3. 生成策略规则

#### audit2allow工具
```bash
# 从日志生成策略规则
adb shell dmesg | grep avc | audit2allow

# 生成策略文件
adb shell dmesg | grep avc | audit2allow -M mypolicy
```

#### 手动编写规则
根据拒绝日志手动编写allow规则：
```sepolicy
# 根据日志生成规则
# scontext=u:r:system_server:s0
# tcontext=u:object_r:system_file:s0
# tclass=file
# denied { read }

allow system_server system_file:file read;
```

## 策略编写实践

### 1. 最小权限原则

#### 只授予必要权限
```sepolicy
# ❌ 错误：授予过多权限
allow system_server system_file:file rw_file_perms;

# ✅ 正确：只授予必要权限
allow system_server system_file:file read;
```

### 2. 使用属性

#### 属性组织策略
```sepolicy
# 定义属性
typeattribute coredomain;
typeattribute system_server coredomain;

# 使用属性简化规则
allow coredomain system_file:file read;
```

### 3. 策略模块化

#### 模块化组织
```sepolicy
# system_server.te
type system_server, domain;
typeattribute system_server coredomain;

# system_server_file.te
type system_server_data_file, file_type;
allow system_server system_server_data_file:file rw_file_perms;
```

## 常见问题

### 1. 权限被拒绝

#### 问题现象
- 应用无法访问文件
- 服务无法启动
- 操作被SELinux拒绝

#### 解决方法
1. 查看SELinux日志
2. 分析拒绝原因
3. 编写或修改策略规则
4. 编译和加载策略

### 2. 策略冲突

#### 问题现象
- 策略规则冲突
- 编译失败
- 策略加载失败

#### 解决方法
1. 检查策略规则
2. 解决规则冲突
3. 重新编译策略

### 3. 性能影响

#### 问题现象
- SELinux影响性能
- 系统响应变慢

#### 解决方法
1. 优化策略规则
2. 使用属性减少规则数量
3. 避免过度限制

## 策略编译和加载

### 1. 编译策略

#### 使用sepolicy工具
```bash
# 编译策略
sepolicy compile -o sepolicy system_sepolicy.cil

# 验证策略
sepolicy validate system_sepolicy.cil
```

### 2. 加载策略

#### 加载到设备
```bash
# 推送策略文件
adb push sepolicy /data/local/tmp/

# 加载策略（需要root）
adb shell load_policy /data/local/tmp/sepolicy
```

### 3. 测试策略

#### 测试方法
1. 设置SELinux为Permissive模式
2. 测试功能
3. 查看日志
4. 修复策略
5. 设置为Enforcing模式
6. 再次测试

## 最佳实践

### 1. 策略编写
- 遵循最小权限原则
- 使用属性组织策略
- 模块化策略文件
- 充分测试策略

### 2. 策略调试
- 使用Permissive模式调试
- 仔细分析拒绝日志
- 逐步添加规则
- 验证策略效果

### 3. 策略维护
- 定期审查策略
- 更新策略规则
- 文档化策略变更
- 版本控制策略文件

## 相关链接

- [[README]]
- [[权限管理框架]]
- [[漏洞案例库]]