Android10 시스템 소스 코드를 수정하여 selinux를 닫습니다.

1. seandroid 소개

       SEAndroid는 Android4.4에서 Google이 공식적으로 출시 한 핵심으로 SELinux를 사용하는 시스템 보안 메커니즘 세트입니다. Android 소스 코드에서 시스템 기본 seandroid 구성은 다음 경로에 저장됩니다.

/home/qiang/lineageOs/system/sepolicy

  디렉토리는 adbd, system_server, 시스템 앱 및 타사 앱과 같은 구성 파일을 저장합니다.

    Android 시스템이 seandroid 전략을 도입함에 따라. 리소스에 대한 앱의 액세스 제한을 강화합니다. 보안이 크게 향상되었습니다. 예를 들어 wifi mac을 얻는 예를 들어 보겠습니다.

     Android 앱의 많은 앱은 / sys / class / net / wlan0 / address를 읽어 휴대폰의 Wi-Fi MAC 주소를 얻습니다. 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가 마지막으로 selinux 제어를 완료하기 위해 security_setenforce 함수를 호출하는 것을 볼 수 있습니다.

 

   2. 커널에서 selinux를 닫습니다.

    커널에서 SECURITY_SELINUX를 false로 구성하고 커널을 다시 컴파일하고 시스템을 플래시하십시오. Seandroid는 영구적으로 폐쇄 될 수 있습니다.

    다음은 테스트 한 커널 컴파일의 .config 파일에서 selinux를 끈 후의 구성 정보입니다.

CONFIG_SECURITY_SELINUX=n

   

3. 초기화 프로세스가 시작되면 selinux를 닫습니다. 

     Android 시스템을 시작하는 동안 init 프로세스는 selinux를 초기화합니다. / proc / cmdline 파일을 읽어서 androidboot.selinux의 값이 selinux를 활성화해야하는지 확인합니다. 따라서 init 프로세스가 selinux를 초기화 할 때 강제 종료 작업을 수행 할 수 있습니다.

    다음은 selinux의 전역 종료를 달성하는 세 번째 옵션에 대해 설명합니다.

 

 3. init 프로세스에서 전체적으로 selinux 닫기

 

    1. 초기화 과정에서 Selinux 초기화 과정 분석

 

       init 프로세스에서 selinux 초기화와 관련된 파일 경로는 다음과 같습니다.

system/core/init/selinux.cppsystem/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;}

      다.  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를 초기화하는 프로세스는 전역 적으로 종료하는 두 가지 수정 체계를 제공 할 수 있습니다.

  •   첫 번째는 항상 false를 반환하도록 IsEnforcing 함수를 수정하는 것입니다. 다음과 같이 수정하십시오.

  bool IsEnforcing() {
   
        ///ADD START    if(1>0)    {
   
          //一直返回false       return false;    }    ///ADD END    if (ALLOW_PERMISSIVE_SELINUX) {
   
           return StatusFromCmdline() == SELINUX_ENFORCING;    }    return true;}

  •   두 번째는 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) 플래시 작업의 빠른 부팅 플래시 데모

재미있는 Android10 소스 코드 개발 및 사용자 정의 (2) 플래시 작업의 복구 플래시 데모

Android10 소스 코드 개발 및 커스터마이징 (3) 소스 코드에서 휴대폰 플래시 패키지를 컴파일하여 즐기십시오.

재미있는 Android10 소스 코드 개발 및 사용자 정의 (4) 소스 코드 개발 환경 구축

재미있는 Android10 소스 코드 개발 및 사용자 지정 (5) 소스 코드 컴파일 및 개발의 일반적인 명령

Android10 소스 코드 개발 및 사용자 정의 (6) 안티 디버깅 감지를 우회하도록 커널 소스 코드 수정

Android10 소스 코드 개발 및 사용자 정의 (7) 안티 디버깅을 우회하도록 ptrace 수정

재미있는 Android10 소스 코드 개발 및 사용자 정의 (8 개) 시스템에 내장 된 Apk

재미있는 Android10 소스 코드 개발 및 사용자 지정 (9) 내장 된 frida-gadget so 파일 및 frida-server 실행 파일을 시스템에

Android10 소스 코드 개발 및 커스터마이징에 대한 재미 (10) 현재 실행중인 최상위 액티비티를 가져 오는 명령을 추가합니다.

Android10 소스 코드 개발 및 사용자 정의 (11) Android 커널 모듈 개발 및 컴파일의 커널 장으로 재미

재미있는 Android10 소스 코드 개발 및 사용자 정의 (12) 커널 문서 logcat 출력 커널 로그

 

더 많은 최신 기사를 보려면 공개 계정을 따르십시오.영상영상영상영상

영상

추천

출처blog.csdn.net/u011426115/article/details/112689147