From bfa38b0d534f5cc687f6a37d995e94119be7f28f Mon Sep 17 00:00:00 2001 From: JingMatrix Date: Mon, 17 Feb 2025 11:42:36 +0100 Subject: [PATCH] Fix liboat_hook.so inaccessible in some device (#190) User has reported `dex2oat` failure with SELinux log: ``` W dex2oat64: type=1400 audit(0.0:922): avc: denied { read } for path="/data/adb/modules/zygisk_lsposed/bin/liboat_hook64.so" dev="dm-58" ino=91204 scontext=u:r:dex2oat:s0 tcontext=u:object_r:adb_data_file:s0 tclass=file permissive=0 ``` Hence, we now set the SELinux context of `liboat_hook.so` in Dex2OatService. Moreover, by the pull-request #194, we have to move `putenv` out of the if block by testing. Indeed, if we call `putenv` inside the if block, then it is no longer valid out of the block. --- .../main/java/org/lsposed/lspd/service/Dex2OatService.java | 4 ++++ dex2oat/src/main/cpp/dex2oat.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/daemon/src/main/java/org/lsposed/lspd/service/Dex2OatService.java b/daemon/src/main/java/org/lsposed/lspd/service/Dex2OatService.java index 627f17af..6a12fdee 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/Dex2OatService.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/Dex2OatService.java @@ -50,6 +50,8 @@ public class Dex2OatService implements Runnable { private static final String TAG = "LSPosedDex2Oat"; private static final String WRAPPER32 = "bin/dex2oat32"; private static final String WRAPPER64 = "bin/dex2oat64"; + private static final String HOOKER32 = "bin/liboat_hook32.so"; + private static final String HOOKER64 = "bin/liboat_hook64.so"; private final String[] dex2oatArray = new String[6]; private final FileDescriptor[] fdArray = new FileDescriptor[6]; @@ -186,6 +188,8 @@ public class Dex2OatService implements Runnable { SELinux.setFileContext(WRAPPER64, xposed_file); setSockCreateContext("u:r:installd:s0"); } + SELinux.setFileContext(HOOKER32, xposed_file); + SELinux.setFileContext(HOOKER64, xposed_file); try (var server = new LocalServerSocket(sockPath)) { setSockCreateContext(null); while (true) { diff --git a/dex2oat/src/main/cpp/dex2oat.c b/dex2oat/src/main/cpp/dex2oat.c index b3b53024..a3e4863d 100644 --- a/dex2oat/src/main/cpp/dex2oat.c +++ b/dex2oat/src/main/cpp/dex2oat.c @@ -117,6 +117,9 @@ int main(int argc, char **argv) { read_int(sock_fd); close(sock_fd); + if (hooker_fd == -1) { + PLOGE("failed to read liboat_hook.so"); + } LOGD("sock: %s %d", sock.sun_path + 1, stock_fd); const char *new_argv[argc + 2]; @@ -136,6 +139,7 @@ int main(int argc, char **argv) { char env_str[STRING_BUFFER]; snprintf(env_str, STRING_BUFFER, "LD_PRELOAD=/proc/%d/fd/%d", getpid(), hooker_fd); putenv(env_str); + LOGD("Set env %s", env_str); fexecve(stock_fd, (char **)new_argv, environ);