Android P版本seLinux導致U盤無法掛載的問題
- 問題背景
- 添加seLinux權限
- Vold掛載檔案的contexts
問題背景
簡單的描述一下問題背景,某平臺上,在打開了selinux后的版本上,測驗同學提了一個bug,U盤無法掛載,問題滯留時間太長,本來該模塊不是我負責的,屬于幫忙分析問題,可能理解不太專業,大家有啥可以指出來,
添加seLinux權限
從抓取的日志中,發現有一條關于fsck的seLinux權限,通過轉成allow權限就是
allow fsck_untrusted system_file:file entrypoint; ,想著難道這條權限加上就能解決了?就先嘗試了添加這條權限,

添加上這條權限之后,編譯報錯了

解決完這個編譯報錯之后真正的問題來了,我們再次編譯的時候發現有如下問題

關于這點限制簡單的說下,是在android O版本之后,seLinux 分成了兩部分,位于 /system/etc/selinux 下的 platform 部分和位于 /vendor/etc/selinux 下的 vendor 部分,coredomain 是 attribute,屬于 domain (針對行程)或者 type(針對物件,如檔案等)的集合,coremain 可以理解為包含 system 下可執行檔案和 apps 所運行的 domain 或者說包含所有屬于 Android 的 domain,
然后我將報錯部分的coredomain 從 fsck_untrusted 的ypeattribute 中去掉,接著編譯,結果還是報錯了

這兩個報錯就很尷尬了,加coredomain也不是,不加也不是,明顯加的這條selinux不符合規則,fsck_untrusted.te中也有注釋# Only allow entry from vold via fsck binaries ,只是沒有太注意,
按照目前的情況來看,通過添加、修改selinux規則來解決這個bug的作業量就有點大了,經大佬指點就換了一個思路和方向,需要看下為什么會用到fsck_untrusted,正常都應該只會用到fsck的contexts才對,
Vold掛載檔案的contexts
無法掛載的U盤,看了一下為exfat檔案系統,然后去看了一眼系統的原始碼,system/vold/model/PublicVolume.cpp 看下exfat用到的哪個bin檔案去參與掛載階段的作業
status_t PublicVolume::doMount() {
readMetadata();
LOG(INFO) << "PublicVolume::doMount: mFsType = " << mFsType.c_str();
if (mFsType == "vfat" && vfat::IsSupported()) {
if (vfat::Check(mDevPath)) {
LOG(ERROR) << getId() << " failed filesystem check";
return -EIO;
}
} else if (mFsType == "exfat" && exfat::IsSupported()) {
if (exfat::Check(mDevPath)) {
LOG(ERROR) << getId() << " failed filesystem check";
return -EIO;
}
} else if (mFsType == "ntfs" && ntfs::IsSupported()) {
if (ntfs::Check(mDevPath)) {
LOG(ERROR) << getId() << " failed filesystem check";
return -EIO;
}
} else {
LOG(ERROR) << getId() << " unsupported filesystem " << mFsType;
return -EIO;
}
//省略...
}
我們緊跟著進了exfat::Check函式

從這我們可以看到用的是/system/bin/fsck.exfat這個binary檔案,然后我們就進機器看下這個檔案對應的contexts是什么(ls -lZ)

然后就驚奇的發現fsck.exfat該bin檔案的contexts和其他的有點不一樣,使用的是u:object_r:system_file:s0 ,猜想一波,是不是由于這個檔案的contexts不對,然后導致沒有按照指定的規則,通過fsck.te的規則校驗,而是找到了fsck_untrusted.te的規則,
接下來驗證一波猜想,通過命令 chcon u:object_r:fsck_exec:s0 fsck.exfat 改變一下該檔案的contexts,插上U盤,發現可以正常掛載了,說明問題點就在這里,那么接下來的就是給相對的bin檔案加上正確的contexts就好system/sepolicy/private/file_contexts

最后整編一個ROM,驗證ok
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/298980.html
標籤:其他
