Android 5.0 Lollipop 4.2.2 처럼 su 명령 을 통 해 루트 권한 을 가 져 오 는 방법

25136 단어 Android
Android 5.0 Lollipop 4.2.2 처럼 su 명령 을 통 해 루트 권한 을 가 져 오 는 방법
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 파일 에 따라 코드 를 수정 하고 안 드 로 이 드 시스템 을 다시 컴 파일 하 는 것 입 니 다.
  • su 명령 원본 에 uid 검 사 를 추가 하여 셸/root 사용자 만 호출 할 수 있 습 니 다
  • Zygote 소스 코드 에 DropCapabilitiesBoundingSet 차단 앱 을 추가 하여 setuid 기능
  • adb 소스 코드 에 should 추가drop_privileges 는 adb 가 setuid 기능 을 차단 합 니 다 (userdebug/eng 버 전에 서 이 함수 가 호출 되 지 않 았 습 니 다)
  • 상기 세 가지 항목 은 코드 를 바 꾸 고 안 드 로 이 드 시스템 을 다시 컴 파일 해 야 합 니 다.1, 2, 3 코드 수 정 된 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 의 상용 상 태 는 두 개 PermissiveEnforcing 가 있 는데 후 자 는 앱 이 su 명령 을 호출 할 수 없고 전 자 는 가능 하 다.1. 현재 SELinux 상태 조회:
    adb shell getenforce

    이 명령 을 실행 하면 현재 시스템 의 SELinux 권한 PermissiveEnforcing 을 출력 합 니 다.2. eng/userdebug 버 전에 서 SELinux 모드 를 Permissive mode 로 조정
  • 임시 방안: 다음 명령 을 실행 합 니 다 (시스템 을 다시 시작 하지 않 아 도 즉시 효 과 를 볼 수 있 습 니 다)
  • adb shell setenforce 0
  • 장기 방안: 시작 매개 변수 에 추가
  • androidboot.selinux=permissive

    ROOT 실패 문제 해결 방법
    루트 가 성공 하지 못 한 것 은 주로 이 항목 들 을 모두 고치 지 않 았 기 때 문 입 니 다. 그 중 하 나 를 고치 지 않 으 면 루트 가 성공 하지 못 할 수 있 습 니 다.여기에 모든 항목 을 잘 고치 지 못 하면 발생 할 문 제 를 열거 하여 참고 하도록 한다.
  • HelloRoot App 을 설치 하여 실행 합 니 다. 루트 권한 을 가 져 올 수 있 는 지 확인 하 는 데 도움 을 주 는 작은 도구 입 니 다.
  • HelloRoot 의 Application user id 보기
  • 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.ccore/jni/com_android_internal_os_Zygote.cpp 수정 이 불가능 합 니 다.
    참고 문서: 1. Android 4.4.4 이상 에서 SELinux 를 0 또는 permissive 모드 로 설정 하 는 방법 은 무엇 입 니까?by user 1147688 2. user 버 전 루트 권한 을 어떻게 여 는 지 3. NanoPi T2 QQ 그룹 네티즌: 외 로 운 늑대

    좋은 웹페이지 즐겨찾기