Android透過root権限制御


プロジェクト要件:特定のアプリケーションはroot権限でiptablesなどの一部のコマンドを実行する必要があります.
2つの部分を分割:
1、システムサービスを開き、cmdを受信し、xxssu(プライベートrootプログラム)を呼び出す.
2、システムの下層はxxxsuサービスを実現し、上層呼び出しに供する
私のところはシステムの最下層の実現を担当しています.
1、まずroot関連の内容が4.3の変化を説明する.
Android 4.3では、次のopen Source Codeから
dalvik_system_Zygote.cpp-》forkAndSpecializeCommon:
#ifdef HAVE_ANDROID_OS
extern int gMallocLeakZygoteChild;
gMallocLeakZygoteChild = 1;

/* keep caps across UID change, unless we're staying root */
if (uid != 0) {
err = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);

if (err < 0) {
ALOGE("cannot PR_SET_KEEPCAPS: %s", strerror(errno));
dvmAbort();
}
}

for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
if (err < 0) {
if (errno == EINVAL) {
ALOGW("PR_CAPBSET_DROP %d failed: %s. "
"Please make sure your kernel is compiled with "
"file capabilities support enabled.",
i, strerror(errno));
} else {
ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));
dvmAbort();
}
}
}

#endif /* HAVE_ANDROID_OS */
赤い斜体のコードに注意してください.これは4.3で新しく追加されました.新しく追加されたこれらのコードは、setuid()インタフェースが機能しなくなります.
次に、initプロセスでrootユーザーでsu--daemonプロセスを起動し、ローカルsocketでコマンドを受信することが主流です.
1、第一歩は、cm-13コードのsuを移植し、このsuは--daemonパラメータを持ち、サービスをサポートする方式でroot権限のコマンドをエージェントが実行することをサポートする.
cm-13をダウンロードし、system/extras/suディレクトリを移植します.改名xxssuは、更新suを直接上書きしてもよい.以下、改名xxssuを例に説明する.
2、システム/core/include/private/android_を修正するfilesystem_config.hファイル、自分の権限制御要求に従って実行可能ファイル権限を変更する
{ 00750, AID_ROOT,      AID_SHELL,     0, "system/xbin/xxxsu"},
3、init.rcでrootエージェントサービスの起動を追加します.
# su daemon
service xxxsu_daemon /system/xbin/xxxsu --daemon
    seclabel u:r:xxxsudaemon:s0

on property:persist.sys.root_access=0
    stop xxxsu_daemon                                   
on property:persist.sys.root_access=1
    start xxxsu_daemon
は、必要な位置でsetprop persistを通過する.sys.root_アクセス1 rootサービスの開始
4、external/sepolicyディレクトリにxxxsuを追加する.te,対応する運転ルールを追加すると以下のようになる.
type xxxsu_exec, exec_type, file_type;
type xxxsudaemon, domain;

# Domain used for su processes, as well as for adbd and adb shell
# after performing an adb root command.  The domain definition is
# wrapped to ensure that it does not exist at all on -user builds.
type xxxsu, domain, mlstrustedsubject;
domain_auto_trans(xxxxxx, xxxsu_exec, xxxsu)  #  xxxxxx   xxxsu

# Make sure that dumpstate runs the same from the "su" domain as
# from the "init" domain.
#  domain_auto_trans(su, dumpstate_exec, dumpstate)

# su is also permissive to permit setenforce.
permissive xxxsu;
permissive xxxsudaemon;

5、これでuserdebugバージョンをコンパイルし、Android appでは、次のコードでコマンドを実行できるようになったはずです
String [] finalcmd={"xxxsu","-c",cmd};
Runtime runtime = Runtime.getRuntime();

userバージョンに切り替えると、様々なsepolicyルールの制限により、APP側で実行に失敗することがあります.これは、自分のAppのユーザータイプに応じて、指定したタイプのappに実行権限があるように、異なるルールを制定する必要があります.