修改Android10系统源码关闭selinux
一、seandroid簡介
? ? ???SEAndroid是Google在Android4.4上正式推出的一套以SELinux為核心的系統安全機制。在Android源碼中,系統默認的seandroid配置存放如下路徑:
/home/qiang/lineageOs/system/sepolicy? 目錄中存放了比如adbd、system_server、系統app、第三方app等te配置文件。
? ? 由于Android系統引進了seandroid策略。強化了app對資源的訪問限制。安全性大大提高。比如舉一個獲取wifi mac的例子為例說明:
? ?? 在android app中很多app通過讀取/sys/class/net/wlan0/address來獲取手機的wifi mac地址。通過adb 命令查看該文件的權限如下:
C:\Users\Qiang>adb shell ls -la /sys/class/net/wlan0/address-r--r--r-- 1 root root 4096 2021-01-12 14:57 /sys/class/net/wlan0/address?? ? 以上說明手機的app都可以讀取訪問該文件。但是在Android10中,系統配置了普通App不能讀取/sys/class/net/wlan0/address的seandroid策略權限。導致Android 10 中讀取失敗,提示權限拒絕。由于seandroid強化了系統安全性,要想一個App訪問訪問系統的某一個目錄或者路徑,需要專門去配置te文件策略。對于不熟悉seandroid配置的開發者配置起來有點難度。那有沒有辦法不配置seandroid策略文件,設置文件或者目錄可讀權限就能訪問的方法。答案就是全局關閉seandroid。
?
二、安卓中關閉seandroid的方式討論
?
??? 1.使用setenforce命令臨時關閉
? ? ?? 命令如下
adb shell setenforce 0? ? setenforce命令只能暫時關閉seandroid,如果手機重啟了會被恢復為正常狀態。
? ?setenforce在安卓源碼中的路徑如下:
external/toybox/toys/android/setenforce.csetenforce實現代碼如下:
#define FOR_setenforce
#include "toys.h" void setenforce_main(void){ char *new = *toys.optargs; int state, ret; if (!is_selinux_enabled()) error_exit("SELinux is disabled"); else if (!strcmp(new, "1") || !strcasecmp(new, "enforcing")) state = 1; else if (!strcmp(new, "0") || !strcasecmp(new, "permissive")) state = 0; else error_exit("Invalid state: %s", new); ret = security_setenforce(state); if (ret == -1) perror_msg("Couldn't set enforcing status to '%s'", new);}? 從以上代碼可知,setenforce最終調用的是函數security_setenforce完成selinux的控制。
?
???2.在kernel 關閉 selinux
? ??在內核中配置SECURITY_SELINUX設置為 false,重新編譯kernel刷機。可以永久關閉seandroid。
? ? 以下是測試的內核編譯中.config文件中關閉selinux之后的配置信息:
CONFIG_SECURITY_SELINUX=n???
3.在init進程啟動的時候關閉selinux?
? ???安卓系統啟動過程中,init進程會進行selinux的初始化。通過讀取/proc/cmdline文件,判斷androidboot.selinux的值是否需要開啟selinux。因此,我們可以init進程初始化selinux的時候強制執行關閉操作。
? ? 以下將討論第三種方案來實現全局關閉selinux。
?
?三、init進程中全局關閉selinux
?
????1.init進程中selinux的初始化流程分析
?
? ? ? ?init進程中selinux初始化相關的文件路徑如下:
system/core/init/selinux.cppsystem/core/init/main.cpp???? 大概的初始化流程如下:
? ? ??a.?main.cpp中的main函數調用selinux.cpp中的SetupSelinux:
int?main(int?argc,?char**?argv)?{
????????...省略 if (!strcmp(argv[1], "selinux_setup")) { return SetupSelinux(argv);????????}????????...省略}? ???b.?selinux.cpp中SetupSelinux函數實現如下:
int SetupSelinux(char** argv) {
...省略 SelinuxInitialize(); ...省略 return 1;}? ? ??c.?SetupSelinux調用了SelinuxInitialize方法。SelinuxInitialize方法代碼如下:
//SelinuxInitialize?中可以看到調用了IsEnforcing方法判斷
void?SelinuxInitialize()?{????...省略 bool kernel_enforcing = (security_getenforce() == 1);????//判斷是否強制模式????bool?is_enforcing?=?IsEnforcing(); if (kernel_enforcing != is_enforcing) {????????//調用security_setenforce函數,和setenforce原理一樣 if (security_setenforce(is_enforcing)) { PLOG(FATAL) << "security_setenforce(%s) failed" << (is_enforcing ? "true" : "false"); }????}????...省略}????d.IsEnforcing方法實現如下:
//判斷是否需要強制模式
bool IsEnforcing() { if (ALLOW_PERMISSIVE_SELINUX) { return StatusFromCmdline() == SELINUX_ENFORCING; } return true;}? ? 從IsEnforcing中可以知道,如果一直返回false,那么將會關閉selinux。
?
2.全局強制關閉selinux修改
?
? ?從以上init進程初始化selinux的流程可以提供兩種修改方案來全局關閉。
-
? 第一種修改IsEnforcing函數永遠返回false。?修改如下:
-
? 第二種修改SelinuxInitialize方法,在函數中主動調用security_setenforce(false)。修改之后如下:
? ?
修改之后編譯源碼刷機,開機之后生效。
?
?
玩轉Android10系統源碼開發定制更多文章:
玩轉Android10源碼開發定制(一)源碼下載編譯
玩轉Android10源碼開發定制(二)刷機操作
玩轉Android10源碼開發定制(二)刷機操作之fastboot刷機演示
玩轉Android10源碼開發定制(二)刷機操作之Recovery刷機演示
玩轉Android10源碼開發定制(三)源碼中編譯手機刷機包
玩轉Android10源碼開發定制(四)源碼開發環境搭建
玩轉Android10源碼開發定制(五)源碼編譯開發中常用命令
玩轉Android10源碼開發定制(六)修改內核源碼繞過反調試檢測
玩轉Android10源碼開發定制(七)修改ptrace繞過反調試
玩轉Android10源碼開發定制(八)內置Apk到系統
玩轉Android10源碼開發定制(九)內置frida-gadget so文件和frida-server可執行文件到系統
玩轉Android10源碼開發定制(十)增加獲取當前運行最頂層的Activity命令
玩轉Android10源碼開發定制(11)內核篇之安卓內核模塊開發編譯
玩轉Android10源碼開發定制(12)內核篇之logcat輸出內核日志
?
關注公眾號獲取更多最新文章
總結
以上是生活随笔為你收集整理的修改Android10系统源码关闭selinux的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pythonz之路,Day1 基于Pyt
- 下一篇: 国家级示范高等职业院校网址