1. 程式人生 > >詳解Android Selinux 許可權及問題

詳解Android Selinux 許可權及問題

由於現做的是MTK平臺,原始碼路徑基於MTK, 不過高通大同小異

說明

Android 5.0以後完全引入了 SEAndroid/SELinux 安全機制,這樣即使擁有 root 許可權或 chmod 777 ,仍然無法再JNI以上訪問核心節點。

其實在 Android 4.4 就有限制的啟用此安全機制了。後面內容都按照 5.0 以後介紹,4.4 會有些許差異。

SELinux Mode

SELinux 分為兩種模式,Android 5.0 後所有程序都使用 enforcing mode。

?

1

2

enforcing mode: 限制訪問

permissive mode: 只審查許可權,不限制

SELinux Policy檔案路徑

?

1

2

3

4

5

6

# Google 原生目錄

external/sepolicy

 

# 廠家目錄,高通將 mediatek 換為 qcom

alps\device\mediatek\common\sepolicy

alps\device\mediatek\<platform>\sepolicy

編譯時將以合併的方式將廠家policy追加到Google原生。

Log

沒有許可權時可以在核心找到如下 log :

?

1

2

3

4

5

6

7

8

9

10

11

12

# avc: denied { 操作許可權 } for pid=7201 comm=“程序名” scontext=u:r:源型別:s0 tcontext=u:r:目標型別:s0 tclass=訪問型別 permissive=0

 

avc: denied {getattr read} for pid=7201 comm="xxx.xxx" scontext=u:r:system_app:s0 tcontext=u:r:shell_data_file:s0 tclass=dir permissive=0

```

## 許可權修改

主要有三種方式,前兩種只能用來測試,第三種是推薦的正式處理方式。

### adb線上修改seLinux

```bash

# Enforcing - 表示已開啟 ,Permissive - 表示已關閉

getenforce;  //獲取當前seLinux狀態

setenforce 1; //開啟seLinux

setenforce 0; //關閉seLinux

kernel中關閉

?

1

2

# alps\kernel-3.18\arch\arm64\configs\xxx_defconfig

CONFIG_SECURITY_SELINUX=y // 遮蔽此配置項

SELinux Sepolicy中新增許可權

修改相應源型別.te檔案(基本以源程序名命名),新增如下一行語句:

?

1

2

3

4

5

6

7

8

9

# 格式

allow 源型別 目標型別:訪問型別 {操作許可權}; // 注意分號

 

# 例項,具體寫法參考原始碼

allow system_app shell_data_file:dir{getattr read write};

allow mediaserver tfa9897_device:chr_file { open read write };

allow system_server tfa9897_device:chr_file rw_file_perms;

 

chr_file - 字元裝置 file - 普通檔案 dir - 目錄

通常很少修改Google default 的policy, 推薦更新mediatek 下面的相關的policy.

新建節點

如果是自己新建的節點,需要在 sepolicy 路徑下的 file_contexts 檔案中做如下新增:

?

1

2

# 參考已有的格式

/dev/goodix_fp     u:object_r:goodixfp_device:s0

Android 5.0 修改的檔案為device.te 和 file_contexts.be,而且device/mediatek/common/BoardConfig.mk 中的 BROAD_SEPOLICY_UNION 增加對應的xxxx.te。

編譯

?

1

2

3

4

5

6

# 模組編譯

mmm external/sepolicy

make -j24 ramdisk-nodeps & make -j24 bootimage-nodeps

 

# 整編

make -j24

ps新增許可權後的neverallowed衝突

編譯報錯:

libsepol.check_assertion_helper: neverallow on line xxx ofexternal/sepolicy/domain.te ……

 原因:

新新增的sepolicy專案違反了domain.te 中規定的的總策略原則。所以該條許可權策略不能新增,如果強行新增的話有CTS測試失敗的風險。

解決方法:

1.從執行log中找到要訪問的目標名稱,一般是name欄位後的名稱
avc: denied { read write } for pid=303 comm="mediaserver" name="tfa9890"dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0tcontext=u:object_r:device:s0tclass=chr_file permissive=0

2.找到相應的*_contexts檔案。

  一般有file_contexts, genfs_contexts,  property_contexts,  service_contexts 等檔案

在contexts檔案中指定要訪問的目標為一個“源型別 ”有許可權訪問的“目標型別”

如:在file_contexts中新增: /dev/tfa9890     u:object_r:audio_device:s0

 舉例

新增許可權:

在mediaserver.te中新增allow mediaserver device:chr_file { read write open};

編譯報錯:
libsepol.check_assertion_helper: neverallow on line 258 ofexternal/sepolicy/domain.te (or line 5252 of policy.conf) violated byallow mediaserver device:chr_file { read write open};

違反了domain.te 258的:
neverallow {domain –unconfineddomain –ueventd } device:chr_file { open read write}

執行Log:
avc: denied { read write } for pid=303 comm="mediaserver"name="tfa9890" dev="tmpfs" ino=3880 scontext=u:r:mediaserver:s0 tcontext=u:object_r:device:s0tclass=chr_file permissive=0

修改步驟:

1.目標名稱是: tfa9890, 其在系統中的路徑是: /dev/tfa9890,  是audio相關的裝置檔案
2.源型別是mediaserver, 在mediaserver.te 檔案中發現其具有 audio_device 目標型別的許可權
3.所以在file_contexts 中新增 “/dev/tfa9890        u:object_r:audio_device:s0” 可以解決問題

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家