Android8.1 将su修改为taxiao,user版本可用

Android8.1 将su改为taxiao,user版本可用
效果图
关键字:su,aosp,user,sepolicy

修改记录

将system/extras/su 文件夹移动到 /system/extras/taxiao,并将su.cpp 改为taxiao.cpp

diff --git a/system/extras/taxiao/Android.mk b/system/extras/taxiao/Android.mk
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_CFLAGS := -Wall -Werror
+LOCAL_SRC_FILES:= taxiao.cpp
+LOCAL_MODULE:= taxiao
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := optional

diff --git a/build/make/tools/warn.py b/build/make/tools/warn.py
index 44ad368..6e83004 100755
--- a/build/make/tools/warn.py
+++ b/build/make/tools/warn.py
@@ -2033,7 +2033,7 @@ project_list = [
     simple_project_pattern('system/extras/runconuid'),
     simple_project_pattern('system/extras/showmap'),
     simple_project_pattern('system/extras/simpleperf'),
-    simple_project_pattern('system/extras/su'),
+    simple_project_pattern('system/extras/taxiao'),
     simple_project_pattern('system/extras/tests'),
     simple_project_pattern('system/extras/verity'),
     project_name_and_pattern('system/extras/Other', 'system/extras'),
     
diff --git a/build/make/target/product/base.mk b/build/make/target/product/base.mk

--- a/build/make/target/product/base.mk
+++ b/build/make/target/product/base.mk
@@ -134,7 +134,8 @@ PRODUCT_PACKAGES += \
     telecom \
     vdc \
     vold \
-    su \
+		 taxiao

diff --git a/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp b/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
index e1c2cb0..b71c392 100644
--- a/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
+++ b/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
@@ -241,7 +241,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++) {
+/*  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) {
       if (errno == EINVAL) {
@@ -253,6 +253,7 @@ static void DropCapabilitiesBoundingSet(JNIEnv* env) {
       }
     }
   }
+*/
 }
 
diff --git a/system/core/libcutils/fs_config.cpp b/system/core/libcutils/fs_config.cpp
index 72904e3..1dfafa6 100644
--- a/system/core/libcutils/fs_config.cpp
+++ b/system/core/libcutils/fs_config.cpp
@@ -166,7 +166,7 @@ static const struct fs_path_config android_files[] = {
     // the following two files are INTENTIONALLY set-uid, but they
     // are NOT included on user builds.
     { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/procmem" },
-    { 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/su" },
+    { 06755, AID_ROOT,      AID_SHELL,     0, "system/xbin/taxiao" },
     { 06755, AID_ROOT,      AID_ROOT,      0, "system/xbin/vm" },
 
diff --git a/system/extras/taxiao/taxiao.cpp b/system/extras/taxiao/taxiao.cpp
index ee1526e..f279596 100644
--- a/system/extras/taxiao/taxiao.cpp
+++ b/system/extras/taxiao/taxiao.cpp
@@ -81,14 +81,14 @@ void extract_uidgids(const char* uidgids, uid_t* uid, gid_t* gid, gid_t* gids, i
 }

 int main(int argc, char** argv) {
-    uid_t current_uid = getuid();
-    if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");
+//    uid_t current_uid = getuid();
+//    if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");

     // Handle -h and --help.
     ++argv;
     if (*argv && (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) {
         fprintf(stderr,
-                "usage: su [UID[,GID[,GID2]...]] [COMMAND [ARG...]]\n"
+                "usage: taxiao [UID[,GID[,GID2]...]] [COMMAND [ARG...]]\n"
                 "\n"
                 "Switch to WHO (default 'root') and run the given command (default sh).\n"
                 "\n" 
                 
diff --git a/system/sepolicy/Android.mk b/system/sepolicy/Android.mk
index e5b244b..e62500d 100644
--- a/system/sepolicy/Android.mk
+++ b/system/sepolicy/Android.mk
@@ -509,7 +509,7 @@ $(LOCAL_BUILT_MODULE): $(HOST_OUT_EXECUTABLES)/secilc $(HOST_OUT_EXECUTABLES)/se
        @mkdir -p $(dir $@)
        $(hide) $< -M true -G -c $(POLICYVERS) $(PRIVATE_CIL_FILES) -o $@.tmp -f /dev/null
        $(hide) $(HOST_OUT_EXECUTABLES)/sepolicy-analyze $@.tmp permissive > $@.permissivedomains
-       $(hide) if [ "$(TARGET_BUILD_VARIANT)" = "user" -a -s $@.permissivedomains ]; then \
+#      $(hide) if [ "$(TARGET_BUILD_VARIANT)" = "user" -a -s $@.permissivedomains ]; then \
                echo "==========" 1>&2; \
                echo "ERROR: permissive domains not allowed in user builds" 1>&2; \
                echo "List of invalid domains:" 1>&2; \
@@ -553,7 +553,7 @@ $(LOCAL_BUILT_MODULE): $(sepolicy.recovery.conf) $(HOST_OUT_EXECUTABLES)/checkpo
        $(hide) $(CHECKPOLICY_ASAN_OPTIONS) $(HOST_OUT_EXECUTABLES)/checkpolicy -M -c \
                $(POLICYVERS) -o $@.tmp $<
        $(hide) $(HOST_OUT_EXECUTABLES)/sepolicy-analyze $@.tmp permissive > $@.permissivedomains
-       $(hide) if [ "$(TARGET_BUILD_VARIANT)" = "user" -a -s $@.permissivedomains ]; then \
+#      $(hide) if [ "$(TARGET_BUILD_VARIANT)" = "user" -a -s $@.permissivedomains ]; then \
                echo "==========" 1>&2; \
                echo "ERROR: permissive domains not allowed in user builds" 1>&2; \
                echo "List of invalid domains:" 1>&2; \   

diff --git a/system/sepolicy/prebuilts/api/26.0/private/file_contexts b/system/sepolicy/prebuilts/api/26.0/private/file_contexts
index 5af834d..bf892e2 100644
--- a/system/sepolicy/prebuilts/api/26.0/private/file_contexts
+++ b/system/sepolicy/prebuilts/api/26.0/private/file_contexts
@@ -225,8 +225,8 @@
 /system/bin/mtpd       u:object_r:mtp_exec:s0
 /system/bin/pppd       u:object_r:ppp_exec:s0
 /system/bin/racoon     u:object_r:racoon_exec:s0
-/system/xbin/su                u:object_r:su_exec:s0
-/vendor/bin/vm         u:object_r:su_exec:s0
+/system/xbin/taxiao      u:object_r:taxiao_exec:s0
+/vendor/bin/vm         u:object_r:taxiao_exec:s0
 /system/xbin/perfprofd  u:object_r:perfprofd_exec:s0
 /system/bin/dnsmasq     u:object_r:dnsmasq_exec:s0
 /system/bin/healthd     u:object_r:healthd_exec:s0
 
diff --git a/system/sepolicy/prebuilts/api/26.0/public/te_macros b/system/sepolicy/prebuilts/api/26.0/public/te_macros
index d65eb88..de8b62b 100644
--- a/system/sepolicy/prebuilts/api/26.0/public/te_macros
+++ b/system/sepolicy/prebuilts/api/26.0/public/te_macros
@@ -466,8 +466,9 @@ define(`with_asan', ifelse(target_with_asan, `true', userdebug_or_eng(`$1'), ))
 #
 define(`crash_dump_fallback', `
 userdebug_or_eng(`
-  allow $1 su:fifo_file append;
+  allow $1 taxiao:fifo_file append;
 ')
+allow $1 taxiao:fifo_file append;
 allow $1 anr_data_file:file append;
 allow $1 dumpstate:fd use;
 # TODO: Figure out why write is needed and remove.
 
diff --git a/system/sepolicy/private/compat/26.0/26.0.cil b/system/sepolicy/private/compat/26.0/26.0.cil
index 40bec84..0b08e85 100644
--- a/system/sepolicy/private/compat/26.0/26.0.cil
+++ b/system/sepolicy/private/compat/26.0/26.0.cil
@@ -561,8 +561,8 @@
 (typeattributeset storage_file_26_0 (storage_file))
 (typeattributeset storagestats_service_26_0 (storagestats_service))
 (typeattributeset storage_stub_file_26_0 (storage_stub_file))
-(typeattributeset su_26_0 (su))
-(typeattributeset su_exec_26_0 (su_exec))
+(typeattributeset taxiao_26_0 (taxiao))
+(typeattributeset taxiao_exec_26_0 (taxiao_exec))
 (typeattributeset surfaceflinger_26_0 (surfaceflinger))
 (typeattributeset surfaceflinger_service_26_0 (surfaceflinger_service))
 (typeattributeset swap_block_device_26_0 (swap_block_device)) 
 
diff --git a/system/sepolicy/private/file_contexts b/system/sepolicy/private/file_contexts
index 3254d07..9eb9452 100644
--- a/system/sepolicy/private/file_contexts
+++ b/system/sepolicy/private/file_contexts
@@ -230,8 +230,7 @@
 /system/bin/mtpd       u:object_r:mtp_exec:s0
 /system/bin/pppd       u:object_r:ppp_exec:s0
 /system/bin/racoon     u:object_r:racoon_exec:s0
-/system/xbin/su                u:object_r:su_exec:s0
-/vendor/bin/vm         u:object_r:su_exec:s0
+/vendor/bin/vm         u:object_r:taxiao_exec:s0
+/system/xbin/taxiao         u:object_r:taxiao_exec:s0 
 /system/xbin/perfprofd  u:object_r:perfprofd_exec:s0
 /system/bin/dnsmasq     u:object_r:dnsmasq_exec:s0
 /system/bin/healthd     u:object_r:healthd_exec:s0
@@ -469,3 +468,5 @@
 /mnt/user(/.*)?             u:object_r:mnt_user_file:s0
 /mnt/runtime(/.*)?          u:object_r:storage_file:s0
 /storage(/.*)?              u:object_r:storage_file:s0


diff --git a/system/sepolicy/tests/treble_sepolicy_tests.py b/system/sepolicy/tests/treble_sepolicy_tests.py
index 58fd85b..d41d3b2 100644
--- a/system/sepolicy/tests/treble_sepolicy_tests.py
+++ b/system/sepolicy/tests/treble_sepolicy_tests.py
@@ -38,6 +38,7 @@ coredomainWhitelist = {
         'postinstall_dexopt',
         'recovery',
         'system_server',
+        'taxiao',
         }
 coredomainWhitelist |= coreAppdomain
 
diff --git a/system/sepolicy/public/te_macros b/system/sepolicy/public/te_macros
index cac977b..53ebb52 100644
--- a/system/sepolicy/public/te_macros
+++ b/system/sepolicy/public/te_macros
@@ -102,11 +102,12 @@ typeattribute $2 pdx_$1_endpoint_dir_type;
 type pdx_$1_endpoint_socket, pdx_$1_endpoint_socket_type, pdx_endpoint_socket_type, file_type, coredomain_socket, mlstrustedobject, mlstrustedsubject;
 type pdx_$1_channel_socket, pdx_$1_channel_socket_type, pdx_channel_socket_type, coredomain_socket;
 userdebug_or_eng(`
-dontaudit su pdx_$1_endpoint_socket:unix_stream_socket *;
-dontaudit su pdx_$1_channel_socket:unix_stream_socket *;
+dontaudit taxiao pdx_$1_endpoint_socket:unix_stream_socket *;
+dontaudit taxiao pdx_$1_channel_socket:unix_stream_socket *;
 ')
 ')

+
 #####################################
 # pdx_server(server_domain, service)
 define(`pdx_server', `
@@ -476,8 +477,10 @@ define(`with_asan', ifelse(target_with_asan, `true', userdebug_or_eng(`$1'), ))
 #
 define(`crash_dump_fallback', `
 userdebug_or_eng(`
-  allow $1 su:fifo_file append;
+  allow $1 taxiao:fifo_file append;
 ')
+
 allow $1 anr_data_file:file append;
 allow $1 dumpstate:fd use;
 # TODO: Figure out why write is needed. 
 
diff --git a/system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil b/system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil
index 2ed4efa..ab53211 100644
--- a/system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil
+++ b/system/sepolicy/prebuilts/api/26.0/nonplat_sepolicy.cil

将nonplat_sepolicy.cil文件中的 su 更改为 taxiao

system/sepolicy/prebuilts/api/26.0/private/su.te 
system/sepolicy/prebuilts/api/26.0/public/su.te

将这两个文件名更改为 taxiao.te,

后缀为.te文件,文件中的 su 更改为 taxiao,将 userdebug_or_eng(`-su') 更改为 -taxiao
 

下列是更改过的文件列表


build/make/target/product/base.mk                  |   3 +-
build/make/tools/warn.py                           |   2 +-
device/rockchip/common/recovery/etc/init.rc        |   2 +-
.../rockchip/common/sepolicy/hal_audio_default.te  |   2 +-
.../core/jni/com_android_internal_os_Zygote.cpp    |   3 +-
system/core/libcutils/fs_config.cpp                |   2 +-
system/core/rootdir/init.rc                        |   3 +
system/core/rootdir/init.usb.rc                    |   2 +-
system/extras/su/Android.mk                        |  13 -
system/extras/su/MODULE_LICENSE_APACHE2            |   0
system/extras/su/NOTICE                            | 190 ----------
system/extras/su/su.cpp                            | 145 --------
system/extras/taxiao/taxiao.cpp                    |   6 +-
system/sepolicy/Android.mk                         |   4 +-
.../prebuilts/api/26.0/nonplat_sepolicy.cil        | 402 ++++++++++-----------
system/sepolicy/prebuilts/api/26.0/private/adbd.te |   6 +-
system/sepolicy/prebuilts/api/26.0/private/app.te  |   6 +-
.../prebuilts/api/26.0/private/file_contexts       |   5 +-
system/sepolicy/prebuilts/api/26.0/private/logd.te |   2 +-
system/sepolicy/prebuilts/api/26.0/private/su.te   |  20 -
system/sepolicy/prebuilts/api/26.0/private/taxiao.te |  10 +
.../sepolicy/prebuilts/api/26.0/public/domain.te   |  44 +--
.../api/26.0/public/hal_wifi_supplicant.te         |   4 +-
.../sepolicy/prebuilts/api/26.0/public/installd.te |   2 +-
system/sepolicy/prebuilts/api/26.0/public/netd.te  |   2 +-
system/sepolicy/prebuilts/api/26.0/public/su.te    |  55 ---
.../sepolicy/prebuilts/api/26.0/public/te_macros   |   3 +-
system/sepolicy/prebuilts/api/26.0/public/taxiao.te  |   7 +-
system/sepolicy/private/adbd.te                    |   6 +-
system/sepolicy/private/app.te                     |   6 +-
system/sepolicy/private/compat/26.0/26.0.cil       |   4 +-
system/sepolicy/private/file_contexts              |   5 +-
system/sepolicy/private/logd.te                    |   2 +-
system/sepolicy/private/su.te                      |  20 -
system/sepolicy/private/taxiao.te                    |  10 +
system/sepolicy/public/domain.te                   |  43 +--
system/sepolicy/public/hal_configstore.te          |   2 +-
system/sepolicy/public/hal_wifi_supplicant.te      |   4 +-
system/sepolicy/public/installd.te                 |   2 +-
system/sepolicy/public/netd.te                     |   2 +-
system/sepolicy/public/su.te                       |  55 ---
system/sepolicy/public/te_macros                   |   9 +-
system/sepolicy/public/taxiao.te                   |   7 +-
system/sepolicy/tests/treble_sepolicy_tests.py     |   1 +
相关的知识点汇总
Linux权限详解

Linux下权限的粒度有 拥有者 、群组 、其它组 三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组

如果我们要表示一个文件的所有权限详情,有两种方式:

  • 第一种是十位二进制表示法 ,(三个属组的每个权限使用一个二进制位,再加一个最高位共十位),可简化为三个八进制数字形式(如 755)
  • 另外一种十二位二进制表示法(十二个二进制位),可简化为四个八进制数字形式(如4755)
十位权限表示

常见的权限表示形式有:

-rw------- (600)    只有拥有者有读写权限。
-rw-r--r-- (644)    只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700)    只有拥有者有读、写、执行权限。
-rwxr-xr-x (755)    拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711)    拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666)    所有用户都有文件读、写权限。
-rwxrwxrwx (777)    所有用户都有读、写、执行权限。

后九位解析: 我们知道Linux权限总共有三个属组,这里我们给每个属组使用三个位置来定义三种操作(读、写、执行)权限,合起来则是权限的后九位。 上面我们用字符表示权限,其中 -代表无权限,r代表读权限,w代表写权限,x代表执行权限。(后九位的前3位对应拥有者权限、4-6位对应群组权限、7-9对应其他组权限)

实际上,后九位每个位置的意义(代表某个属组的某个权限)都是固定的,如果我们将各个位置权限的有无用二进制数 1和 0来代替,则只读、只写、只执行权限,可以用三位二进制数表示为

r-- = 100
-w- = 010
--x = 001
--- = 000

转换成八进制数,则为 r=4, w=2, x=1, -=0(这也就是用数字设置权限时为何是4代表读,2代表写,1代表执行)

我们可以将所有的权限用二进制形式表现出来,并进一步转变成八进制数字:

rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4
-wx = 011 = 3
-w- = 010 = 2
--x = 001 = 1
--- = 000 = 0

由上可以得出,每个属组的所有的权限都可以用一位八进制数表示,每个数字都代表了不同的权限(权值)。如 最高的权限为是7,代表可读,可写,可执行。

如果我们将每个属组的权限都用八进制数表示,则文件的权限可以表示为三位八进制数

-rw------- =  600
-rw-rw-rw- =  666
-rwxrwxrwx =  777

关于第一位最高位的解释: 上面我们说到了权限表示中后九位的含义,剩下的第一位代表的是文件的类型,类型可以是下面几个中的一个:

d代表的是目录(directroy)
-代表的是文件(regular file)
s代表的是套字文件(socket)
p代表的管道文件(pipe)或命名管道文件(named pipe)
l代表的是符号链接文件(symbolic link)
b代表的是该文件是面向块的设备文件(block-oriented device file)
c代表的是该文件是面向字符的设备文件(charcter-oriented device file)
十二位权限(Linux附加权限)

附加权限相关概念

linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。

SET位权限:

suid/sgid是为了使“没有取得特权用户要完成一项必须要有特权才可以执行的任务”而产生的。

一般用于给可执行的程序或脚本文件进行设置,其中SUID表示对属主用户增加SET位权限,SGID表示对属组内用户增加SET位权限。

执行文件被设置了SUID、SGID权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。

  • suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。
  • sgid(set Group ID,set GID)意思也是一样,只是把上面的进程拥有者改成了文件拥有组(group)。

在许多场景下,使用suid 和 sgid 非常实用,但是不恰当地使用这些权限可能为系统带来安全风险。所以应该尽量避免使用SET位权限程序。(passwd 命令是为数不多的必须要使用“suid”的命令之一)。

SET位权限表示形式(10位权限):

如果一个文件被设置了suid或sgid位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了suid还设置了x(执行)位,则相应的执行位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如

1-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限
2-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限
3-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限
4-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限

粘滞位权限:

粘滞位权限即sticky。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用ls查看其属性时,其他用户权限处的x将变为t。 使用chmod命令设置目录权限时,+t、-t权限模式可分别用于添加、移除粘滞位权限。

粘滞位权限表示形式(10位权限):

一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上。如果文件设置了sticky还设置了x(执行)位,其他组用户的权限的可执行位为t(小写)。但是,如果没有设置x位,它将表示为T(大写)。如:

1-rwsr-xr-t 表示设置了粘滞位且其他用户组有可执行权限
2-rwSr--r-T 表示设置了粘滞位但其他用户组没有可执行权限

设置方式:

sticky权限同样可以通过chmod命令设置:

chmod +t <文件列表…>

十二位的权限表示方法

附加权限除了用十位权限形式表示外,还可以用用十二位字符表示。

11 10 9 8 7 6 5 4 3 2 1 0
S  G  T r w x r w x r w x

SGT分别表示SUID权限、SGID权限、和 粘滞位权限,这十二位分别对应关系如下:

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位(后九位)。

在这十二位的每一位上都置值。如果有相应的权限则为1, 没有此权限则为0。

-rw-r-Sr-- 的值为: 0 1 0  1 1 0  1 0 0  1 0 0
-rwsr-xr-x 的值为: 1 0 0  1 1 1  1 0 1  1 0 1
-rwsr-sr-x 的值为: 1 1 0  1 1 1  1 0 1  1 0 1 
-rwsr-sr-t 的值为: 1 1 1  1 1 1  1 0 1  1 0 1

如果将则前三位SGT也转换成一个二进制数,则

  • suid 的八进制数字是4
  • sgid 的代表数字是 2
  • sticky 位代表数字是1

这样我们就可以将十二位权限三位三位的转化为4个八进制数。其中

  • 最高的一位八进制数就是suid,sgdi,sticky的权值。
  • 第二位为 拥有者的权值
  • 第三位为 所属组的权值
  • 最后一位为 其他组的权值
附加权限的八进制形式

其中s是表示附加权限的把八进制数字,abc与之前一致,分别是对应User、Group、及Other(拥有者、群组、其他组)的权限。因为SUID对应八进制数字是4,SGID对于八进制数字是2,则“4755”表示设置SUID权限,“6755”表示同时设置SUID、SGID权限。

我们进一步将上小节的例子中的二进制数转变为八进制表示形式,则

-rw-r-Sr-- = 0 1 0 1 1 0 1 0 0 1 0 0 = 2644 
-rwsr-xr-x = 1 0 0 1 1 1 1 0 1 1 0 1 = 4755
-rwsr-sr-x = 1 1 0 1 1 1 1 0 1 1 0 1 = 6755
-rwsr-sr-t = 1 1 1 1 1 1 1 0 1 1 0 1 = 7755

对比范例:

  • 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行
chmod 755 netlogin
  • 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行,并且设置suid
chmod 4755 netlogin

chmod 4755与chmod 755对比多了附加权限值4,这个4表示其他用户执行文件时,具有与所有者同样的权限(设置了SUID)。

为什么要设置4755 而不是 755?
假设netlogin是root用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。但假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。

输入 id 命令,然后按 Enter 键即可查看当前用户及其所属组信息。

id

该命令会返回当前用户的 UID(user ID)、GID(group ID)以及其所属的其他附加组(如果有的话)。

例如,以下是 id 命令的示例输出:

uid=2000(shell) gid=2000(shell) groups=2000(shell),1004(input),1007(log),1011(adb)

上述示例中,当前用户的 UID 和 GID 都是 2000,它同时属于其他三个组:input、log、adb。

  • UID:用户 ID,它是一个唯一的数字标识符,用于识别 Android 系统中的各个用户。
  • GID:组 ID,它也是一个唯一的数字标识符,用于标识 Android 系统中的不同组。
  • groups:其他附加组,显示当前用户所属的其他组。
sepolicy
规则一
userdebug_or_eng(`
   allow $1 su:fifo_file append;
 ')

这段代码是一个 SELinux Policy 的规则,会向系统添加一个允许从 $1su 进程的 FIFO 文件中追加内容的规则。其中,$1 是一个占位符,它表示规则中的第一个参数,可以在实际使用时被替换为合适的值。

这个规则是一个“允许规则”,指定了一个允许追加操作的 SELinux 上下文。具体含义是,在满足这个规则的条件下,SELinux 会允许 $1su 进程的 FIFO 文件中以追加的方式写入数据。如果 $1 不满足这个规则,则只能以非追加方式进行写入操作。

需要注意的是,这个规则只在 userdebugeng 构建类型中生效,因为这两种构建类型的 SELinux Policy 规则比较宽松,具有更多的调试和测试功能。在其他构建类型中,这个规则可能会被忽略或产生错误。

规则二
neverallow adbd { domain -su }:process dyntransition;

这段代码是一个 SELinux Policy 的规则,它定义了 adbd 进程不允许使用 dyntransition 来过渡到 domain、除了su 等的上下文。具体含义是:

  • neverallow:表示这是一个 SELinux 禁止规则,说明除非满足规则的条件,否则 SELinux 会拒绝 adbd 进程对规则中指定的上下文进行过渡。
  • adbd:表示指定的进程名称。
  • { domain -su }:限定了目标规则适用的域,它包括了 domain 域,并排除了 su 域。也就是说,这个规则只限定了除了 su 域之外的所有域。
  • process:表示执行此规则的对象是进程级别的(即对指定进程的操作进行控制)。
  • dyntransition:表示动态过渡,即允许进程在某些情形下动态地从一个上下文过渡到另一个上下文。这个规则的存在表示,即使在满足动态过渡条件下,也不允许 adbd 进程从指定的上下文过渡到其他上下文。

总的来说,这个规则限制了 adbd 进程在动态过渡时的行为,防止恶意进程通过 adbd 进程进行攻击或者非法操作,从而保护 Android 系统的安全性。

规则三
neverallow { appdomain -shell userdebug_or_eng(`-su') } { domain -appdomain }:process

这段代码是一个 SELinux Policy 的规则,它定义了除非满足规则条件,否则不允许任何一个进程从 { appdomain, -shell, su } 上下文过渡到 { domain, -appdomain } 上下文。

具体含义如下:

  • neverallow:拒绝规则,表示所描述的操作将不被授权。一旦规则被定义,所有的 SELinux 决策模块都将决绝涉及到某一执行实体 (execution entity) 的操作。

  • { appdomain -shell userdebug_or_eng(-su') }:一个或多个上下文匹配模式用花括号括起来。在这个规则中,表示一个包含 appdomain、-shell、以及 selinux 构建类型为 userdebug 或 eng 且包含 -su 条目的上下文列表。

  • { domain -appdomain }:表示一个包含 domain 和除了与 appdomain 相同的上下文。

  • :process:这条规则作用范围是一个进程级别的,表示该规则约束从应用上下文切换到平台上下文的进程切换。

因此,这条规则表示:只有指定的上下文列表的进程才能从 appdomain、-shell 和 -su 上下文切换到除 appdomain 之外的其它上下文。换言之,只有指定的特定进程能够跨越应用程序域 (appdomain)、Android shell 和 su 来执行操作,以保护 Android 系统的安全性。

规则四

限制访问权限的目录或文件

进入system/sepolicy 目录,然后编辑 file_contexts 文件

例如,如果您想要限制访问 /data 目录,可以在 file_contexts 文件中查找到与该目录相关的行:

/data(/.*)?      u:object_r:system_data_file:s0

u:object_r:system_data_file:s0 安全上下文,以将限制添加到该目录或文件

neverallow 语句中添加新的规则,以禁止 root 用户或具有超级用户权限的用户访问 /data 目录:

neverallow {
  root
} {
  dir_type system_data_file_type:dir_class_set {
    -getattr,
    -read,
    -write,
    -execute
  }
}

allow 语句中添加新的规则,以允许 root 用户访问 /data 目录:

allow {
  root
} system_data_file_type:dir_type {
  getattr,
  open,
  read,
  write,
  execute,
  search,
  relabelfrom,
  relabelto,
  ioctl,
  lock,
  mounton,
  audit_access
}

微信公众号(他晓),关注并转发,谢谢

效果图
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值