KernelSU 解决方案:解决 openRemoteFile 创建文件 SELinux 上下文问题

在升级到 1.10.2 版本后,现代 API 函数 openRemoteFile 创建的文件出现了错误的 SELinux 上下文,导致写操作失败并返回 XposedServiceError。本文将探讨如何复现此问题,并提供相应的解决方案。

问题复现步骤

  1. 移除之前的模块数据

    rm -rf /data/adb/lspd/modules/0/*
  2. 使用 1.10.2 版本构建并运行官方示例项目
    官方示例项目
  3. 使用 openRemoteFile 创建文件
  4. 尝试向文件写入数据
  5. 观察失败情况并检查 SELinux 上下文

预期行为

在 1.10.1 版本中,通过 openRemoteFile 创建的文件应该具有以下 SELinux 上下文:

u:object_r:magisk_file:s0

写操作应成功执行。

实际行为

在 1.10.2 版本中,文件创建时会出现以下 SELinux 上下文:

u:object_r:xposed_file:s0

任何尝试向文件写入的操作都会导致 XposedServiceError

Xposed 模块列表

仅 LSPosed 中的示例

Root 方案

在 Magisk 和 KSU Next 上进行了测试。

系统模块列表

仅 lsposed 在 Magisk 中

LSPosed 版本

1.10.2

Android 版本

14

版本要求

日志

在 1.10.2 版本中,日志显示以下错误:

07-29 15:07:04.858 21099 21099 E AndroidRuntime: FATAL EXCEPTION: main
07-29 15:07:04.858 21099 21099 E AndroidRuntime: Process: io.github.libxposed.example, PID: 21099
07-29 15:07:04.858 21099 21099 E AndroidRuntime: io.github.libxposed.service.XposedService$ServiceException: Xposed service error
...
Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died, but this could also be caused by running out of binder buffer space

解决方案

为了解决这个问题,可以手动将 SELinux 上下文更改为 magisk_file。使用以下命令:

chcon u:object_r:magisk_file:s0 <file>

通过这种方式,文件创建时将使用正确的 SELinux 上下文,从而允许写操作成功执行。

结论

通过上述步骤,我们可以复现 1.10.2 版本中 openRemoteFile 创建文件时 SELinux 上下文错误的问题,并提供相应的解决方案。通过手动更改 SELinux 上下文,可以确保文件操作的正确性和稳定性。