[Description]
user版本怎麼打開root權限
[Keyword]
user root adb superuser 使用者版本 root權限 security
[Serious Declaration]
嚴重聲明: 任何在最終user版本上打開root權限的手法都會給使用者帶來安全風險, 請仔細評估您的需求是否真實需要. MTK 強烈反對此類做法, 由此帶來的安全風險,以及造成的損失, MTK 不承擔任何的責任。
[Solution]
首先您要确認您是想開啟adbd 的root 權限,還是讓app 也可以拿到root 權限。他們之間的差别,可以參考FAQ
(1). adbd 的root 權限
我們通常在debug user 版本問題時, 或者進行user 版本的monkey test 時都會這個工作,以便debug. 可以參考FAQ.
如果你想user 版本adb root 權限預設關閉, 而在想開啟時, 可以通過工程模式中的設定項開啟, 那麼請USER2ROOT 功能 (L 版本不再支援此功能)。
此功能預設關閉, 如果開啟, 需要在ProjectConfig.mk 中設定: MTK_USER_ROOT_SWITCH = yes
同樣注意此項功能通常隻用于debug 或者 cmcc 送測, 在正式出貨版本, 強烈要求關閉, 否則有安全風險.
(2). app 的root 權限
app 的root 權限通常是通過執行su 指令來擷取。注意的是KK 上, 因為多種限制, 普通的su 難以直接拿到root 權限, 需要做針對性的改動.
通常我們會内置具有控制端的第三方su, 下面以内置SuperSU, 以及使用Google default su 為例進行說明。
(3). 如何内置第三方SuperSU
該方式可以繞過zygote 和 adbd 對Root Capabilities BoundSet 的限制. MTK 目前僅測試KK 以及以前的版本, L 版本後因為SuperSU 還在持續更新中, 請客戶檢視它官網的說明.
3.1. 下載下傳SuperSU
3.2. 内置Superuser.apk 到 system/app
将su 複制并改名成: daemonsu
内置su 到 system/xbin
内置daemonsu 到 system/xbin
内置chattr 到 system/xbin
内置chattr.pie 到 /system/xbin
3.3. 内置install-recovery.sh 到system/etc
更新alps/system/core/inlcude/private/android_filesystem_config.h
在android_files 數組的最開始新增.
{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/install-recovery.sh" },
(4). 如何内置Google default su
4.1 放開Google default su 隻準shell/root 使用者使用的限制.
system/extras/su/su.c 中删除下面3行代碼
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
return 1;
}
4.2 首先将此編譯出的su 内置到system/bin, 然後修改su 的内置權限,啟用sbit 位.
在android_files 數組中
增加
{ 06755, AID_ROOT, AID_ROOT, 0, "system/bin/su" },
注意這行要放在
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" },
之前
4.3 如果是KK 版本(非KK2 MT6752/MT6732), 需要強行解除zygote 和 adbd 對Root Capabilities BoundSet 的限制
更新kernel/security/commoncap.c 中 cap_prctl_drop 函數為:
static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
//mtk71029 add begin: Let 'zygote' and 'adbd' drop Root Capabilities BoundSet ineffectively
if (!strncmp(current->comm, "zygote", 16)) {
return -EINVAL;
}
if (!strncmp(current->comm, "adbd", 16)) {
// add end
if (!capable(CAP_SETPCAP))
return -EPERM;
if (!cap_valid(cap))
cap_lower(new->cap_bset, cap);
return 0;
}
4.4 如果貴司一定要在K2(MT6752/MT6732) 上開啟, 請送出eService, 申請定制的DVM, 放開相關的權限限制.
4.5 如果貴司在L 版本操作, 請按下面的流程:
4.5.1 更新alps/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
将 DropCapabilitiesBoundingSet(JNIEnv* env) 這個函數置空.
4.5.2 更新alps/frameworks/base/cmds/app_process/app_main.cpp 的main 函數, 注釋掉main函數開始的下面這段代碼
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
// Older kernels don't understand PR_SET_NO_NEW_PRIVS and return
// EINVAL. Don't die on such kernels.
if (errno != EINVAL) {
LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
return 12;
}
}
4.5.3 更新alps/system/core/adb/adb.c 将should_drop_privileges() 函數, 清空這個函數,直接傳回 0 即可.
重新編譯系統, 重新download 後, adb shell 進入後再輸入su 看看是否指令行由$切換到#, 如果切換即成功。
(5). 在KK 版本後app 使用root 權限受到更加嚴格的限制, 可以參考FAQ
[FAQ11414] android KK 4.4 版本後,user 版本su 權限嚴重被限制問題說明
<a target="_blank" href="https://onlinesso.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11414">http://online.mediatek.inc/Pages/FAQ.aspx?List=SW&FAQID=FAQ11414</a>
FAQ11538:android KK 4.4 版本後,app 使用root(su) 權限受到嚴格限制說明
<a target="_blank" href="https://onlinesso.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11538">https://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11538</a>