前言:
今天發(fā)現(xiàn)很詭異的問(wèn)題,之前一直是可讀的,忽然發(fā)現(xiàn)權(quán)限被拒絕。
LOG(ERROR) << "讀取文件內(nèi)容 "<<FileUtils::getFileText((char *)"/sys/class/net/eth0/address",20);
std::string FileUtils::getFileText(char *path,int BuffSize) {
char buffer[BuffSize];
memset(buffer, 0, BuffSize);
std::string str;
//int fd = open(path, O_RDONLY );
long fd = syscall(__NR_open, path, O_RDONLY);
LOG(ERROR) << "open 內(nèi)容 "<<fd;
if(fd==-1){
LOG(ERROR) << "讀文件出錯(cuò),錯(cuò)誤原因 " << strerror(errno);
return "";
}
//失敗 -1;成功:>0 讀出的字節(jié)數(shù) =0文件讀完了
while (syscall(__NR_read,fd, buffer, 1) != 0) {
str.append(buffer);
}
syscall(__NR_close,fd);
return str;
}
之前運(yùn)行一直沒(méi)問(wèn)題,忽然發(fā)現(xiàn)讀取系統(tǒng)內(nèi)核文件讀不了了,之前是可以的,用文件管理器查看文件是444
都是可讀的,open函數(shù)一直返回 -1 失敗。
細(xì)看日志發(fā)現(xiàn)一條異樣:
type=1400 audit(0.0:127783): avc: denied { search } for name="net" dev="sysfs" ino=46905 scontext=u:r:untrusted_app:s0:c189,c258,c512,c768 tcontext=u:object_r:sysfs_net:s0 tclass=dir permissive=0
在講之前需要詳細(xì)介紹一下SELinux相關(guān)的知識(shí),防止別人采坑。
之前也是知道一些SELinux的一些基礎(chǔ),但是也一直沒(méi)深入研究和Liunx的區(qū)別。
今天有時(shí)間做個(gè)記錄
什么是SELinux?
安全增強(qiáng)型 Linux(Security-Enhanced Linux)簡(jiǎn)稱 SELinux,它是 Linux 的一個(gè)安全子系統(tǒng)。SELinux 主要作用是最大限度地減小系統(tǒng)中服務(wù)進(jìn)程可訪問(wèn)的資源(最小權(quán)限原則)。對(duì)資源的訪問(wèn)控制分為兩類: DAC和MAC ,我們用的安卓底層的Linux就是這它。
linux傳統(tǒng)設(shè)備文件訪問(wèn)控制方法
傳統(tǒng)的 Linux設(shè)備文件訪問(wèn)控制機(jī)制通過(guò)設(shè)置用戶權(quán)限來(lái)實(shí)現(xiàn).
- 超級(jí)用戶(root),具有最高的系統(tǒng)權(quán)限,UID為0。
- 系統(tǒng)偽用戶,Linux操作系統(tǒng)出于系統(tǒng)管理的需要,但又不愿賦予超級(jí)用戶的權(quán)限,需要將某些關(guān)鍵系統(tǒng)應(yīng)用文件所有權(quán)賦予某些系統(tǒng)偽用戶,其UID范圍為1~ 499,系統(tǒng)的偽用戶不能登錄系統(tǒng)。
- 普通用戶,只具備有限的訪問(wèn)權(quán)限,UID 為 500 ~ 6000,可以登錄系統(tǒng)獲得shell。在Linux權(quán)限模型下,每個(gè)文件屬于一個(gè)用戶和一個(gè)組,由UID與GID標(biāo)識(shí)其所有權(quán)。針對(duì)于文件的具體訪問(wèn)權(quán)限定義為可讀(r)、可寫(xiě)(w)與可執(zhí)行(x),并由三組讀、寫(xiě)、執(zhí)行組成的權(quán)限三元組來(lái)描述相關(guān)權(quán)限。
第一組定義文件所有者(用戶)的權(quán)限,第二組定義同組用戶(GID相同但UID不同的用戶)的權(quán)限,第三組定義其他用戶的權(quán)限(GID與UID都不同的用戶)。
Linux工作模式:
SELinux 有三種工作模式,分別為:
enforcing: 強(qiáng)制模式, 執(zhí)行SELinux規(guī)則, 違反的行為會(huì)被阻止
permissive: 寬容模式, 執(zhí)行SELinux規(guī)則, 違反的行不會(huì)被阻止
disabled: 關(guān)閉SELinux
SEAndroid app分類
SELinux(或SEAndroid)將app劃分為主要三種類型(根據(jù)user不同,也有其他的domain類型):
1)untrusted_app 第三方app,沒(méi)有Android平臺(tái)簽名,沒(méi)有system權(quán)限
2)platform_app 有Android平臺(tái)簽名,沒(méi)有system權(quán)限
3)system_app 有android平臺(tái)簽名和system權(quán)限
從上面劃分,權(quán)限等級(jí),理論上:untrusted_app < platform_app < system_app
我們看一下我們的剛剛的日志
標(biāo)志性 log: avc: denied { 操作權(quán)限 } for pid=7201 comm=“進(jìn)程名” scontext=u:r:源類型:s0 tcontext=u:r:目標(biāo)類型:s0 tclass=訪問(wèn)類型 permissive=0
源類型:授予訪問(wèn)的類型,通常是進(jìn)程的域類型
目標(biāo)類型:客體的類型,它被授權(quán)可以訪問(wèn)的類型
訪問(wèn)類型:客體的類可
操作權(quán)限:表示主體對(duì)客體訪問(wèn)時(shí)允許的操作類型(也叫做訪問(wèn)向量)。
我們剛剛的錯(cuò)誤日志是,我們分解詳細(xì)看看:
avc: denied { search } for 缺少search權(quán)限
name="net"
dev="sysfs"
ino=46905
scontext=u:r:untrusted_app:s0:c189,c258,c512,c768 未簽名的App
tcontext=u:object_r:sysfs_net:s0 哪個(gè)te文件缺少權(quán)限
tclass=dir 什么類型的文件the object class of the target
permissive=0 permissive (1 寬容模式) or enforcing (0 強(qiáng)制模式)
沒(méi)有簽名的App 沒(méi)有search 權(quán)限訪問(wèn)dir文件目錄。
我們將 SELinux 安全關(guān)掉
setenforce 0
完美解決。
參考:
https://blog.csdn.net/su749520/article/details/80284543
https://www.zybuluo.com/guhuizaifeiyang/note/772144
安卓逆向百級(jí)教程+全網(wǎng)最新js逆向視頻+永久小蜜圈+永久售后群=1299
視頻下載網(wǎng)盤
?http://nas.alienhe.cn:5008/home.html?
下載視頻賬號(hào)密碼:
賬號(hào)guest 密碼world
Js試看:
http://oss.alienhe.cn/JS%E9%80%86%E5%90%91%E5%85%A5%E9%97%A8-%E5%B8%A6%E6%B0%B4%E5%8D%B0.mp4