首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELinux阻止在Android上执行本机可执行文件

SELinux阻止在Android上执行本机可执行文件
EN

Stack Overflow用户
提问于 2022-01-17 13:00:14
回答 1查看 265关注 0票数 2

我正在尝试运行我自己的本地可执行文件。代码如下所示:

代码语言:javascript
复制
String[] command = {"/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc"};
ProcessBuilder builder = new ProcessBuilder(command);
Process process = builder.start();

我得到了这个错误:

代码语言:javascript
复制
java.io.IOException: Cannot run program "/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc": error=13, Permission denied
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1050)
    at org.smowsoft.systeminformation.ExampleInstrumentedTest.testRun(ExampleInstrumentedTest.java:113)
    ... 29 trimmed
Caused by: java.io.IOException: error=13, Permission denied
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
    at java.lang.ProcessImpl.start(ProcessImpl.java:141)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 31 more

我还尝试从本机代码运行可执行文件,如下所示:

代码语言:javascript
复制
char* lArgs[] = {0, 0};
lArgs[0] = new char[8];
strcpy(lArgs[0], "smoproc");
int result = execv("/data/user/0/org.smowsoft.systeminformation.nativelib.test/files/smoproc", lArgs);

但是execv()返回-1,errno设置为13 (EACCESS)。

可执行文件的模式设置为0777。

当我从shell运行dmesg时,我可以看到SELinux阻止了执行:

代码语言:javascript
复制
[15194.067480] type=1400 audit(1649841626.956:417509): avc: granted { execute } for comm="roidJUnitRunner" name="smoproc" dev="dm-5" ino=131258 scontext=u:r:untrusted_app:s0:c134,c256,c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file app=org.smowsoft.systeminformation.nativelib.test
[15194.070245] type=1400 audit(1649841626.956:417510): avc: denied { execute_no_trans } for comm="roidJUnitRunner" path="/data/data/org.smowsoft.systeminformation.nativelib.test/files/smoproc" dev="dm-5" ino=131258 scontext=u:r:untrusted_app:s0:c134,c256,c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0 app=org.smowsoft.systeminformation.nativelib.test

API级别为30。我在多个设备上试过。这是否意味着无法在API级别30及更高级别上运行本机可执行文件?

EN

回答 1

Stack Overflow用户

发布于 2022-04-18 13:44:15

TL;DR :根据偏好顺序,您可以尝试以下方法:

  • 最好的策略可能是将您的可执行文件放在设备上的标准位置;
  • ,您可以尝试告诉selinux允许从当前二进制文件的任何位置执行东西;如果
  • 失败,您可以尝试运行audit2why,以便从selinux那里获得如何允许程序运行的建议;如果安全性没有问题,可以尝试在运行程序时将selinux设置为允许的。

f 29

长篇版本:

Selinux在您的文件系统上增加了一层安全性,所以如果您想让您的程序使用selinux,那么在某个时候您将不得不直接处理它。

This article on serverfault似乎与您的问题有关。如果您的可执行文件不是位于“标准”位置(您的系统希望在其中查找二进制文件),那么selinux很可能会阻止执行。服务器故障源解释说,可以使用以下selinux命令(如果我正确地读取了您的应用程序路径)来修复这个问题:

代码语言:javascript
复制
chcon -R -t bin_t /data/local/tmp

或者将应用程序放置在存储其他二进制文件的地方。

如果上面的命令解决了您的问题,您可以通过运行(仍然适合于服务器错误)永久更新策略:

代码语言:javascript
复制
semanage fcontext -a -t bin_t "/data/local/tmp(/.*)?"
restorecon -r -v /data/local/tmp

如果上面的内容不起作用,selinux附带了一个审计工具,它给出了拒绝的原因,称为audit2why。跑步:

代码语言:javascript
复制
audit2why -a

通常会为您提供一个解决方案,允许被拒绝的特定事物。不过,尝试实现这些解决方案并不总是一个好主意。

最后,如果不考虑安全性问题,则始终可以将selinux设置为允许在设备上运行(即使是暂时让程序运行):

代码语言:javascript
复制
semanage permissive -a bin_t
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70741783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档