Android 修改 SELinux avc 权限的方法

系统版本:Android 11.0    

平         台:RK3568

在 Android 系统的开发及适配过程中,我们常常需要对 SELinux avc  权限进行修改,以下是我对 SELinux avc  权限修改总结的方法。

一、验证功能是否存在 selinux 权限问题

#进入Android终端

adb shell

#获取root权限

su

#查看系统当前 selinux 的工作模式

getenforce

#将 selinux 切换为 Enforcing 强制模式(如果已经是Enforcing模式可省略)

setentforce 1

#验证功能并打印log

logcat | grep avc

这么做的目的是为了能够在app报错时及时发现avc权限问题。例如,在app中通过接口对节点进行读写操作时发现了log报以下selinux avc权限错误:

type=1400 audit(0.0:875): avc: denied { read } for name="value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0


type=1400 audit(0.0:876): avc: denied { write } for name="value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

二、SELinux avc权限规则快速生成配置

(1) 将上述avc 权限的 log 信息收集起来并保存到文件中

例如:log.txt

(2) 在平台代码根目录下打开终端,执行以下命令 :

#初始化参数设置

source build/envsetup.sh

#通过lunch命令选择需要编译的分支

lunch

(3) 生成的selinux avc权限配置信息

#将 log.txt 文件拷贝到以下路径中,然后在终端中切换到路径所在的位置:

external/selinux/prebuilts/bin

#生成 selinux avc 权限配置信息,命令格式如下:

./audit2allow -i [log文件] > [生成文件]

如果生成的信息不全或者为空的话(如上图),可以在 log.txt 文件中重复放多几行 avc log 信息,再执行生成命令即可,例如:

(4) 加上open和getattr权限

注意,读写等 avc 权限的配置往往还需要加上 open 和 getattr 权限,例如:

 allow system_server sysfs:file {read write open getattr};

如果不加就可能报以下错误:

type=1400 audit(0.0:604): avc: denied { getattr } for path="/sys/devices/platform/fdd60000.gpio/gpiochip0/gpio/gpio27/value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0

(5) selinux avc权限配置信息添加位置

device/rockchip/common/sepolicy/vendor/

例如,这里是在该目录下的 system_server.te 文件添加。此外,还需要对对应api等级的相同文件进行一样的修改:

system/sepolicy/prebuilts/api/30.0/private/coredomain.te

或者在 system/sepolicy 目录下找到相应文件添也行,这里是:

system/sepolicy/public/system_server.te


三、编译及验证

(1) 编译

在根目录下编译 /system/sepolicy/ 中的文件,编译命令如下:

mmm /system/sepolicy/

(2) 验证

将编译好的文件从电脑推送到Android设备中,以下推送命令(注意,需要删掉mapping目录及其包含的文件才能push成功):

adb push odm/etc/selinux/* odm/etc/selinux


adb push product/etc/selinux/* product/etc/selinux


adb push system/etc/selinux/* system/etc/selinux


adb push system_ext/etc/selinux/* system_ext/etc/selinux


adb push vendor/etc/selinux/* vendor/etc/selinux


adb reboot

四、常见编译错误

例如:

libsepol.report_failure: neverallow on line 99 of system/sepolicy/private/coredomain.te (or line 36611 of policy.conf) violated by allow system_server sysfs:file { read write open };

libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy


即上述修改的权限被 neverallow,具体位置在 /system/sepolicy/private/coredomain.te 中第99行。所以,对以上报错的修改如下:

--- a/sepolicy/private/coredomain.te
+++ b/sepolicy/private/coredomain.te
@@ -111,6 +111,7 @@ full_treble_only(`
    # /sys
    neverallow {
    coredomain
     -init
     -ueventd
     -vold
+    -system_server
     -system_app
   } sysfs:file no_rw_file_perms;
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 12 及以上版本中,系统录屏的实现方式有所改变。如果你想对 Android 13 T 系统进行客制化,可以按照以下步骤来设置自定义录屏保存路径: 1. 打开系统录屏的源码文件 ScreenRecord.java。 2. 找到 startRecording() 方法,添加以下代码,用于设置自定义的保存路径: ``` String outputPath = "/sdcard/myvideo.mp4"; // 自定义保存路径 MediaFormat format = MediaFormat.createVideoFormat(MediaFormat.MIMETYPE_VIDEO_AVC, mWidth, mHeight); format.setInteger(MediaFormat.KEY_BIT_RATE, mBitRate); format.setInteger(MediaFormat.KEY_FRAME_RATE, mFrameRate); format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, mIFrameInterval); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setOutputFile(outputPath); mMediaRecorder.setVideoEncodingBitRate(mBitRate); mMediaRecorder.setVideoFrameRate(mFrameRate); mMediaRecorder.setVideoSize(mWidth, mHeight); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setOrientationHint(rotation); mMediaRecorder.prepare(); mVirtualDisplay = mMediaProjection.createVirtualDisplay( "Recording Display", mWidth, mHeight, mDensity, flags, mMediaRecorder.getSurface(), null /* callback */, null /* handler */); mMediaRecorder.start(); ``` 3. 重新编译 Android 系统源码,生成新的系统镜像。 需要注意的是,对 Android 系统进行客制化需要具备一定的开发经验和技能,操作过程较为繁琐,建议在有经验的开发者指导下进行操作。同时,修改系统源码也可能会带来一些不可预知的风险,需要谨慎操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值