Android 5.0 Lollipop 4.2.2 처럼 su 명령 을 통 해 루트 권한 을 가 져 오 는 방법
25136 단어 Android
4.2.2 (Jelly Bean) 에서 루트 를 사용 하 는 방법 은 간단 합 니 다. su 명령 을 호출 하면 루트 권한 을 얻 고 명령 을 수행 할 수 있 습 니 다.그러나 안 드 로 이 드 4.3 + 5.0 에서 구 글 은 이러한 루트 방법 에 층 층 장 애 를 설정 했다. 1. su 명령 소스 코드 에 uid 검 사 를 추 가 했 고 셸/root 사용자 만 호출 할 수 있 도록 했다. 2. Zygote 소스 코드 에 Drop Capabilities BoundingSet 차단 앱 을 추가 했다. setuid 기능 3. adb 소스 코드 에 should 추가drop_privileges 는 adb 를 차단 하여 setuid 기능 (userdebug/eng 버 전에 서 이 함수 가 호출 되 지 않 았 음) 4. SELinux 보안 모듈 을 열 었 습 니 다. 1, 2 개가 모두 만족 하 는 경우 에 도 su 가 중 단 됩 니 다.
구체 적 인 해결 방법:
앞의 세 가지 해결 방법 은 다음 diff 파일 에 따라 코드 를 수정 하고 안 드 로 이 드 시스템 을 다시 컴 파일 하 는 것 입 니 다.
project frameworks/base/
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 1bb28c3..3e69750 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -185,6 +185,7 @@ static const char ZYGOTE_NICE_NAME[] = "zygote";
int main(int argc, char* const argv[])
{
+/*
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.
@@ -193,6 +194,7 @@ int main(int argc, char* const argv[])
return 12;
}
}
+*/
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
// Process command line arguments
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 4f5e08b..8b136bd 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -208,6 +208,7 @@ static void EnableKeepCapabilities(JNIEnv* env) {
}
static void DropCapabilitiesBoundingSet(JNIEnv* env) {
+/*
for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
int rc = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
if (rc == -1) {
@@ -220,6 +221,7 @@ static void DropCapabilitiesBoundingSet(JNIEnv* env) {
}
}
}
+*/
}
static void SetCapabilities(JNIEnv* env, int64_t permitted, int64_t effective) {
project system/core/
diff --git a/adb/adb.c b/adb/adb.c
index 10a1e0d..2cd4f97 100644
--- a/adb/adb.c
+++ b/adb/adb.c
@@ -1261,6 +1261,7 @@ static void drop_capabilities_bounding_set_if_needed() {
}
static int should_drop_privileges() {
+ return 0;
#ifndef ALLOW_ADBD_ROOT
return 1;
#else /* ALLOW_ADBD_ROOT */
diff --git a/include/private/android_filesystem_config.h b/include/private/android_filesystem_config.h
index 2f528b9..1223b45 100644
--- a/include/private/android_filesystem_config.h
+++ b/include/private/android_filesystem_config.h
@@ -244,7 +244,7 @@ static const struct fs_path_config android_files[] = {
/* the following five files are INTENTIONALLY set-uid, but they
* are NOT included on user builds. */
- { 04750, AID_ROOT, AID_SHELL, 0, "system/xbin/su" },
+ { 06755, AID_ROOT, AID_SHELL, 0, "system/xbin/su" },
{ 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/librank" },
{ 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procrank" },
{ 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procmem" },
@@ -255,6 +255,7 @@ static const struct fs_path_config android_files[] = {
{ 00750, AID_ROOT, AID_ROOT, 0, "system/bin/uncrypt" },
{ 00750, AID_ROOT, AID_ROOT, 0, "system/bin/install-recovery.sh" },
+ { 06755, AID_ROOT, AID_ROOT, 0, "system/bin/su" },
{ 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" },
{ 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" },
{ 00755, AID_ROOT, AID_ROOT, 0, "system/lib64/valgrind/*" },
project system/extras/
diff --git a/su/su.c b/su/su.c
index 8365379..826acfc 100644
--- a/su/su.c
+++ b/su/su.c
@@ -107,11 +107,12 @@ int main(int argc, char **argv)
/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
+ /*
if (myuid != AID_ROOT && myuid != AID_SHELL) {
fprintf(stderr,"su: uid %d not allowed to su
", myuid);
return 1;
}
-
+ */
if(argc < 2) {
uid = gid = 0;
} else {
SELinux 권한 을 Permissive 로 설정 합 니 다.
저 는 가능 한 한 일 을 단순화 시 키 려 고 합 니 다. 이번에 여기 서 토론 한 것 은 SELinux 입 니 다. 그 실현 원 리 는 비교적 복잡 할 것 입 니 다. 저 는 Android 5.0 + Linux 3.4 에 SELinux 를 어떻게 강등 시 키 는 지 간단하게 기록 할 뿐 입 니 다. 이렇게 하 는 이 유 는 앱 이 su 명령 을 호출 하여 최종 적 으로 명령 을 실행 할 수 있 기 때 문 입 니 다.
SELinux 의 상용 상 태 는 두 개
Permissive
와 Enforcing
가 있 는데 후 자 는 앱 이 su 명령 을 호출 할 수 없고 전 자 는 가능 하 다.1. 현재 SELinux 상태 조회:adb shell getenforce
이 명령 을 실행 하면 현재 시스템 의 SELinux 권한
Permissive
과 Enforcing
을 출력 합 니 다.2. eng/userdebug 버 전에 서 SELinux 모드 를 Permissive mode 로 조정adb shell setenforce 0
androidboot.selinux=permissive
ROOT 실패 문제 해결 방법
루트 가 성공 하지 못 한 것 은 주로 이 항목 들 을 모두 고치 지 않 았 기 때 문 입 니 다. 그 중 하 나 를 고치 지 않 으 면 루트 가 성공 하지 못 할 수 있 습 니 다.여기에 모든 항목 을 잘 고치 지 못 하면 발생 할 문 제 를 열거 하여 참고 하도록 한다.
root@nanopi2:/ # ps | grep com.example.helloroot
u0_a50 1283 121 1233532 40640 ffffffff b6e791c4 S com.example.helloroot
root@nanopi2:/ #
그 중에서
u0_a50
바로 HelloRoot 의 Application user id 입 니 다. 이 id 는 다음 단계 에서 사 용 됩 니 다.u0_a50
명령 root@nanopi2:/ # su u0_a50
root@nanopi2:/ $ id
uid=10050(u0_a50) gid=10050(u0_a50) groups=1003(graphics),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:su:s0
# 以u0_a50身份运行su命令,正常情况下会再切到root权限下
root@nanopi2:/ $ su
root@nanopi2:/ #
정상 이 아니라면 다음 과 같은 오류 가 발생 할 수 있 습 니 다.
su
이것 은 u0 에 속한다a50 su 에 대한 실행 권한 이 없습니다. 설명
su: can't execute: Permission denied
에서 고 쳐 야 할 내용 은 고치 지 않 았 거나 고치 지 못 했다.include/private/android_filesystem_config.h
이것 은 su 와 셸 이외 의 사용자 (예 를 들 어 u0 a50) 호출 을 허용 하지 않 습 니 다. 설명
su: uid 10050 not allowed to su
에서 고 쳐 야 할 내용 은 고치 지 않 았 거나 고치 지 못 했다.CheckRoot 단 추 를 누 르 면 App 이 root 가 될 수 있 는 지 여 부 를 판단 합 니 다. Log 정 보 는 다음 과 같 습 니 다.
System.err: java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
System.err: at java.lang.ProcessManager.exec(ProcessManager.java:211)
System.err: at java.lang.Runtime.exec(Runtime.java:173)
System.err: at java.lang.Runtime.exec(Runtime.java:246)
System.err: at java.lang.Runtime.exec(Runtime.java:189)
System.err: at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:135)
System.err: at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:93)
System.err: at cn.trinea.android.common.util.ShellUtils.checkRootPermission(ShellUtils.java:44)
System.err: at com.example.helloroot.MainActivity.onCreate(MainActivity.java:25)
System.err: at android.app.Activity.performCreate(Activity.java:5990)
System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
System.err: at android.app.ActivityThread.access$800(ActivityThread.java:151)
System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
System.err: at android.os.Looper.loop(Looper.java:135)
System.err: at android.app.ActivityThread.main(ActivityThread.java:5254)
System.err: at java.lang.reflect.Method.invoke(Native Method)
System.err: at java.lang.reflect.Method.invoke(Method.java:372)
System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
System.err: Caused by: java.io.IOException: Permission denied
System.err: at java.lang.ProcessManager.exec(Native Method)
System.err: at java.lang.ProcessManager.exec(ProcessManager.java:209)
System.err: ... 20 more
System.err: java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
System.err: at java.lang.ProcessManager.exec(ProcessManager.java:211)
System.err: at java.lang.Runtime.exec(Runtime.java:173)
System.err: at java.lang.Runtime.exec(Runtime.java:246)
System.err: at java.lang.Runtime.exec(Runtime.java:189)
System.err: at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:135)
System.err: at cn.trinea.android.common.util.ShellUtils.execCommand(ShellUtils.java:56)
System.err: at com.example.helloroot.MainActivity.onCreate(MainActivity.java:26)
System.err: at android.app.Activity.performCreate(Activity.java:5990)
System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
System.err: at android.app.ActivityThread.access$800(ActivityThread.java:151)
System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
System.err: at android.os.Looper.loop(Looper.java:135)
System.err: at android.app.ActivityThread.main(ActivityThread.java:5254)
System.err: at java.lang.reflect.Method.invoke(Native Method)
System.err: at java.lang.reflect.Method.invoke(Method.java:372)
System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
System.err: Caused by: java.io.IOException: Permission denied
System.err: at java.lang.ProcessManager.exec(Native Method)
System.err: at ... 19 more
A. 이 문 제 는 SELinux 를 닫 지 않 았 기 때문에 다음 과 같은 방법 으로 확인 해 야 합 니 다.
# 通过查看SELinux状态
root@nanopi2:/ # getenforce
Enforcing
"SELinux 권한 을 Permissive 로 설정 합 니 다"에 따라 설정 해 야 합 니 다.B. setuid 의 제한 수정
su.c
과 core/jni/com_android_internal_os_Zygote.cpp
수정 이 불가능 합 니 다.참고 문서: 1. Android 4.4.4 이상 에서 SELinux 를 0 또는 permissive 모드 로 설정 하 는 방법 은 무엇 입 니까?by user 1147688 2. user 버 전 루트 권한 을 어떻게 여 는 지 3. NanoPi T2 QQ 그룹 네티즌: 외 로 운 늑대
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.