在Android上临时禁用或修改SELinux

22

我是一款Android应用程序的开发者。

遗憾的是,现在一些设备/ROM中有SELinux启用强制模式并阻止我的应用程序执行某些操作。

由于这是一个根应用程序,用户授予我root访问权限!

现在,SELinux正在阻止我的一些操作,我需要找到解决方案。

我尝试通过以下方式暂时禁用SELinux:

setenforce permissive -> no failure, but getenforce still returns "Enforcing"
echo 0 > /sys/fs/selinux/enforce -> no failure, but getenforce still returns "Enforcing"

我在考虑在运行时编辑sepolicy文件,以允许被阻止的命令并触发其重新加载,但我不确定这是否可行,也不确定这是否是个好主意。

谁有更多的提示或资源可以提供给我?


我认为 su 守护程序通过在完全不同的上下文中运行,绕过了 SELinux 和 nosuid 的限制,不是吗?具体被阻止的是哪些操作? - Delyan
我不知道Chainfire是如何处理SU的。但在我的情况下,它会出现例如avc: denied {execstack} for pid=10971等错误信息,可能还有更多其他的信息 :/ - Martin L.
你自己是否在运输execstack?你应该意识到,设置强制模式的人可能已经将su守护进程/程序锁定,以至于在这种情况下无法使用。 - Delyan
由于SE策略的原因,execstack调用(使二进制可执行文件中的堆栈)失败了。很抱歉,这对我来说太专业了,无法提供帮助。 - Delyan
好的,非常感谢您抽出时间 :) - Martin L.
显示剩余3条评论
7个回答

13
您可以使用超级用户应用程序中的 supolicy,请查看链接以获取详细说明何时以及如何调用。
简而言之:
  • 通过检查审计消息(例如 dmesg | grep "audit")找出为什么 SELinux 阻止某些操作。
  • 创建一个allow ... 规则以允许被阻止的操作。它们与SELinux *.te文件中的 'allow'规则相似(或者相同?)。
  • 在 root shell 中运行supolicy --live "allow ...",并检查操作是否成功。 如果不成功,请扩展您的 'allow'规则。 您可以在单个supolicy 调用中指定多个 'allow'规则。
请注意,supolicy 是一项昂贵的操作,因此请确保仅调用一次。
如果您不想依赖Chainfire的SuperSU,则可以尝试sepolicy-inject。 我自己没有测试过。

1
你好,欢迎。我建议你在回答中加入更多内容,以便更有帮助性并吸引更多的投票。 - Wtower
1
谢谢提示。我添加了一个大致的描述,说明如何使用supolicy - Martin Gerczuk
1
我宁愿不相信闭源二进制文件的根,所以我没有SuperSU。我很想看看该应用程序正在进行哪些API调用。不过,我会尝试 setpolicy-inject - Wyatt Ward

2

在根目录(即第一个目录)的系统文件夹中编辑build.prop文件,使用文本编辑器搜索selinux

如果你看到像enable_selinux=1这样的内容,请将其更改为0,如果要禁用,则反之。

更改将在重新启动或引导后生效。

同样地,您可以打开/关闭多用户帐户、系统更新。我的设备制造商已禁用了系统更新。


1
在我的设备上,它被设置为 ro.buid.selinux = 1 - Metafaniel

2

我一直在尝试禁用Android 4.3上的SELinux,以下是我的解决方案。

在三星S4 Android 4.3中,setenforce 0会切换到Permissive模式。

在三星Note 3 Android 4.3上,setenforce 0不会改变SELinux状态。

我尝试过Nexus 4 Android 4.3,但默认情况下它是Permissive模式。


你实际上没有回答这个问题... - Matthias Urlichs
2
@MatthiasUrlichs他没有吗?他提供了一种在运行时主动更改SELinux执行的方法。 OP建议他的问题直接与此有关。 我可以确认,在CyanogenMod 11中以root身份运行setenforce时,SELinux状态将发生变化。 - Kevin Mark

1
如果您拥有root访问权限,请运行su 0 setenforce 0以切换到Permissive模式:
// Set SELinux to permissive
private static final String COMMAND = "su 0 setenforce 0"; 
try {
  Runtime.getRuntime().exec(COMMAND);
} catch (IOException e) {
  e.printStackTrace();
}

嗨t1mz0r,感谢您的反馈。这正是我在最初的请求中所做和提到的。user1546570指出,它有时有效,有时无效。与此同时,我知道它在一些三星设备上不起作用。我通过在运行时编程更改策略并强制重新加载它们来解决了这个问题,而不是通过setenforce禁用整个SELinux。现在随着Android 5的推出,这可能会发生一般性的变化 - setenforce至少适用于Nexus设备。祝好&敬意 - Martin L.

1

您可以下载名为selinux mod changer的应用程序。它不在play商店上,因此您需要从Chrome或任何其他浏览器中下载它。该应用程序只需要root权限,因此请尝试使用它。


0
如果你想禁用SElinux并使整个系统处于"宽容"模式,你需要修改位于"system/core/init"目录下的"selinux.cpp"文件中的函数。两个函数"StatusFromProperty()"和"IsEnforcing()"分别设置SElinux的状态,并在不同的单元中调用。如果你将它们的返回值都修改为"SELINUX_PERMISSIVE"和"false",那么SElinux的状态将始终为宽容模式。你可以在这里找到更多详细信息。

0

添加

androidboot.selinux=permissive

添加到您的内核启动参数中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接