日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

修改Android10系统源码关闭selinux

發布時間:2024/3/13 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 修改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.c

setenforce實現代碼如下:

#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刷機??梢杂谰藐P閉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。?修改如下:

bool IsEnforcing() {?????///ADD?START if(1>0) {???????//一直返回false return false; }????///ADD END if (ALLOW_PERMISSIVE_SELINUX) { return StatusFromCmdline() == SELINUX_ENFORCING; } return true;}
  • ? 第二種修改SelinuxInitialize方法,在函數中主動調用security_setenforce(false)。修改之后如下:

void SelinuxInitialize() { Timer t; LOG(INFO) << "Loading SELinux policy"; if (!LoadPolicy()) { LOG(FATAL) << "Unable to load SELinux policy"; } bool kernel_enforcing = (security_getenforce() == 1); bool is_enforcing = IsEnforcing(); if (kernel_enforcing != is_enforcing) { if (security_setenforce(is_enforcing)) { PLOG(FATAL) << "security_setenforce(%s) failed" << (is_enforcing ? "true" : "false"); }????}????//直接調用security_setenforce方法來關閉????///ADD START????security_setenforce(false);????///ADD END if (auto result = WriteFile("/sys/fs/selinux/checkreqprot", "0"); !result) { LOG(FATAL) << "Unable to write to /sys/fs/selinux/checkreqprot: " << result.error(); } // init's first stage can't set properties, so pass the time to the second stage. setenv("INIT_SELINUX_TOOK", std::to_string(t.duration().count()).c_str(), 1);}

? ?

修改之后編譯源碼刷機,開機之后生效。

?

?

玩轉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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。