【问题标题】:Needed permission to access /dev/diag需要访问 /dev/diag 的权限
【发布时间】:2021-05-17 14:05:59
【问题描述】:

我正在尝试使用 JNI 作为 open("/dev/diag", O_RDWR | O_LARGEFILE | O_NONBLOCK); 打开 /dev/diag,但返回 errno: 13 Permission denied

应该做些什么来完成这项工作?

使用命令ls -l /dev/diag 检查/dev/diag 的所有权时,它返回crw-rw-rw- system qcom_diag 244, 0 2015-01-14 01:47 diag 当尝试使用命令id 时,我得到uid=0(root) gid=0(root) groups=0(root) context=u:r:init:s0

所以我认为问题与所有权有关?

更新:基于@HamidShatu 的回答

我尝试将 SELinux 设置为宽容,但没有成功。

我尝试了命令su 0 setenforce 0,如果立即使用getenforce 命令进行检查,它会返回OK,同时仍然是Enforcing

我什至尝试更改 prop.build:这个文件不存在,而是 prop.build.bak 这样做了,所以我复制了它,将 SELinux 修改为 0 而不是 1,并在没有 .bak 扩展名的情况下推送它。即使我检查了修改 SELinux 设置为 0 的 prop.build 的外部应用程序,但是使用 getenforce 命令检查时它仍然返回 Enforcing

这里是 dmesg 的摘录:

[18177.676603]  [0: servicemanager:  743] avc:  received setenforce notice   (enforcing=1)
[18182.768070]  [1: servicemanager:  743] avc:  received setenforce notice (enforcing=1)
[18183.231867]  [0:           init:    1] avc:  received setenforce notice (enforcing=1)
[18183.232006]  [0:           init:    1] avc:  received setenforce notice (enforcing=1)

我什至尝试通过添加到 Manifest 使应用程序作为系统应用程序运行:<application--> android:sharedUserId="android.uid.system"

提示:我正在使用可以成功访问 /dev/diag 的 Play 商店中的应用程序。

【问题讨论】:

    标签: java android android-ndk android-permissions root


    【解决方案1】:

    要了解/分析您的问题,也许我们可以先查看您在此处发布的内容。

    我正在尝试使用 JNI 作为open("/dev/diag", O_RDWR | O_LARGEFILE | O_NONBLOCK); 打开/dev/diag,但返回errno: 13 Permission denied

    根据我的经验,errno: 13 Permission denied 表明您的代码存在一些 SELinux 违规行为。

    当使用命令ls -l /dev/diag 检查/dev/diag 的所有权时,它返回crw-rw-rw- system qcom_diag 244, 0 2015-01-14 01:47 diag,当尝试使用命令id 时,我得到uid=0(root) gid=0(root) groups=0(root) context=u:r:init:s0

    这部分清楚地表明/dev/diag 目录属于Qualcomm。根据Android Treble重新架构,有3个主要分区属于:

    1. Android 系统 (Google/AOSP)
    2. 供应商(芯片制造商)&
    3. OEM(设备制造商)

    所以,根据您的分析,/dev/diag 属于 Vendor 分区。

    所以我认为问题与所有权有关?

    这个问题的答案几乎是:是的。

    应该做些什么来完成这项工作?

    您需要添加 SELinux 权限才能使其正常工作。 正如crw-rw-rw- system qcom_diag 244, 0 2015-01-14 01:47 diag 行所建议的,您需要添加一个SELinux 权限才能从system 访问qcom_diag 以获得diag

    有一件事是,任何类型的diag 权限仅在Debug 构建中给出,而不在User 构建中给出。因为在 User 构建中为 diag 授予 SELinux 权限会引发安全问题。它可以通过将重要信息打印到日志中来泄露重要信息。

    【讨论】:

    • @MRDRAG 我在该问题的评论中提出了一些要求。你能回答这些吗?还请尝试更清楚地解释您的目的,以便其他人更容易理解您的要求。
    • 感谢您的回答。我已根据您的回答更新了我的问题。如何添加 SELinux 权限以使其正常工作? @Hamid
    • 是否需要在 SELinux 策略中允许不受信任的应用程序?还是app域标签就够了?怎么做? @HamidShatu
    【解决方案2】:

    经过几天尝试找出解决方案后,我能够通过执行以下操作绕过该问题:

    • 我没有将 C 代码用作共享库,我正在努力打开 /dev/diag,而是使用 Cmake 将其作为可执行 C(.c 文件应该有一个 main 函数),如下所示:

       cmake_minimum_required(VERSION 3.4.1)
       file(GLOB SRC_FILES
           src/main/cpp/*.c)
       add_executable(
           mylib.so
           ${SRC_FILES}
       )
      
    • 在 Java 中创建一个新命令,可以使用 root priveleage 执行 mylib:

      new String[]{"su", "-c", "exec " + context.getApplicationInfo().nativeLibraryDir + "/" + "mylib.so"}
      
    • 使用流程构建器执行命令

      process = new ProcessBuilder(command)
                   .start();
      

    可执行文件可以正确使用open("/dev/diag", O_RDWR | O_LARGEFILE | O_NONBLOCK);

    原因是即使在 SU 模式下,应用程序在执行函数时也会降级到正常模式,但在 SU 模式下执行库将确保它在 su 中运行

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 2017-03-23
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多