1.seandroidの紹介
SEAndroidは、GoogleがAndroid4.4で正式にリリースしたコアとしてSELinuxを使用したシステムセキュリティメカニズムのセットです。Androidのソースコードでは、システムのデフォルトのseandroid構成が次のパスに保存されています。
/home/qiang/lineageOs/system/sepolicy
ディレクトリには、adbd、system_server、システムアプリ、サードパーティアプリなどの構成ファイルが格納されます。
Androidシステムがseandroid戦略を導入したように。リソースに対するアプリのアクセス制限を強化します。セキュリティが大幅に向上します。たとえば、例としてWi-FiMacを入手する例を見てみましょう。
Androidアプリの多くのアプリは、/ sys / class / net / wlan0 / addressを読み取ることで携帯電話のwifiMACアドレスを取得します。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
上記は、モバイルアプリがファイルを読み取ってアクセスできることを示しています。ただし、Android 10では、システムは、通常のアプリが/ sys / class / net / wlan0 / addressを読み取れないseandroidポリシー権限で構成されています。Android 10で読み取りエラーが発生し、許可が拒否されました。seandroidはシステムのセキュリティを強化するため、アプリがシステムの特定のディレクトリまたはパスにアクセスするようにする場合は、teファイル戦略を具体的に構成する必要があります。seandroidの設定に慣れていない開発者にとっては設定が少し難しいです。seandroidポリシーファイルを設定したり、ファイルまたはディレクトリの読み取り権限を設定したりせずに、ファイルまたはディレクトリにアクセスする方法はありますか?答えは、seandroidをグローバルに閉じることです。
2.Androidでseandroidを閉じる方法についての議論
1. setenforceコマンドを使用して、一時的に閉じます
コマンドは次のとおりです
adb shell setenforce 0
setenforceコマンドは、seandroidを一時的にシャットダウンすることしかできず、電話を再起動すると、通常の状態に復元されます。
Androidソースコードでの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.カーネルでselinuxを閉じます
カーネルでSECURITY_SELINUXをfalseに構成し、カーネルを再コンパイルして、マシンをフラッシュします。Seandroidは完全に閉じることができます。
以下は、テストされたカーネルコンパイルの.configファイルでselinuxがオフにされた後の構成情報です。
CONFIG_SECURITY_SELINUX=n
3.initプロセスの開始時にselinuxを閉じます
Androidシステムの起動時に、initプロセスがselinuxを初期化します。/ proc / cmdlineファイルを読み取って、androidboot.selinuxの値でselinuxを有効にする必要があるかどうかを判断します。したがって、initプロセスがselinuxを初期化するときに、強制的にシャットダウン操作を実行できます。
以下では、selinuxのグローバルシャットダウンを実現するための3番目のオプションについて説明します。
3.initプロセスでselinuxをグローバルに閉じます
1.initプロセスでのSelinux初期化プロセス分析
initプロセスでのselinuxの初期化に関連するファイルパスは次のとおりです。
system/core/init/selinux.cpp
system/core/init/main.cpp
おおよその初期化プロセスは次のとおりです。
。 main.cppにの主な機能は、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を初期化するプロセスは、グローバルにシャットダウンするための2つの変更スキームを提供できます。
-
1つ目は、IsEnforcing関数を変更して常にfalseを返すようにすることです。次のように変更します。
bool IsEnforcing() {
///ADD START
if(1>0)
{
//一直返回false
return false;
}
///ADD END
if (ALLOW_PERMISSIVE_SELINUX) {
return StatusFromCmdline() == SELINUX_ENFORCING;
}
return true;
}
-
2つ目は、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ソースコードの開発とカスタマイズ(1)ソースコードのダウンロードとコンパイル
楽しいAndroid10ソースコードの開発とカスタマイズ(2)フラッシュ操作
楽しいAndroid10ソースコードの開発とカスタマイズ(2)フラッシュ操作のfastbootフラッシュのデモンストレーション
楽しいAndroid10ソースコードの開発とカスタマイズ(2)フラッシュ操作のリカバリフラッシュデモ
Android10のソースコードの開発とカスタマイズを楽しんでください(3)携帯電話のフラッシュパッケージをソースコードにコンパイルします
楽しいAndroid10ソースコードの開発とカスタマイズ(4)ソースコード開発環境の構築
楽しいAndroid10ソースコードの開発とカスタマイズ(5)ソースコードのコンパイルと開発における一般的なコマンド
Android10ソースコードの開発とカスタマイズを楽しむ(6)カーネルソースコードを変更して、アンチデバッグ検出をバイパスします
Android10ソースコードの開発とカスタマイズを楽しむ(7)ptraceを変更してアンチデバッグをバイパスする
楽しいAndroid10ソースコードの開発とカスタマイズ(8)システムへの組み込みAPK
楽しいAndroid10ソースコードの開発とカスタマイズ(9)組み込みのfrida-gadgetsoファイルとfrida-server実行可能ファイルをシステムに追加
Android10ソースコードの開発とカスタマイズを楽しむ(10)コマンドを追加して、現在実行中の最上位のアクティビティを取得します
Android10ソースコードの開発とカスタマイズを楽しむ(11)Androidカーネルモジュールの開発とコンパイルのカーネルの章
楽しいAndroid10ソースコードの開発とカスタマイズ(12)カーネル記事logcat出力カーネルログ
最新の記事については、パブリックアカウントをフォローしてください