在 Android 上临时禁用或修改 SELinux

Temporary disable or modify SELinux on Android

提问人:Martin L. 提问时间:10/6/2013 最后编辑:Breno LeitãoMartin L. 更新时间:11/18/2023 访问量:51143

问:

我是Android应用程序的开发人员。

可悲的是,现在在某些设备/ROM 上,SELinux 处于强制模式,并阻止了我的应用程序的某些操作。

因为这是一个root应用程序,所以用户授予我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-file 以允许被阻止的命令并触发它的重新加载,但我既不确定这是否以及如何工作,也不是一个好主意。

谁还有更多提示或资源给我?

安卓 SELininwork

评论

0赞 Delyan 10/6/2013
我以为 su 守护进程通过在完全不同的上下文中运行来绕过 SELinux 和 nosuid,不是吗?哪些操作特别被阻止?
0赞 Martin L. 10/6/2013
我不知道 Chainfire 是如何用 SU 做到的。但就我而言,它是例如。 也许在那之后还有更多的事情:/avc: denied { execstack } for pid=10971
0赞 Delyan 10/6/2013
你是自己发货的吗?您确实意识到,无论谁设置了强制模式,都可能已经锁定了守护程序/程序,直到在这种情况下它无能为力,对吧?execstacksu
0赞 Martin L. 10/6/2013
我对所有这些东西都不是很熟悉,但 SU 正在我的设备上工作:)
0赞 Delyan 10/6/2013
你到底在用 su 运行什么?似乎有什么东西在运行(Linux 历史上一段相当晦涩难懂的东西),SELinux 正在阻止它。请发布完整的日志。您运行的任何内容都可以从 shell 中工作吗?execstack

答:

2赞 user1546570 10/28/2013 #1

一段时间以来,我一直在尝试在 Android 4.3 上禁用 SELinux,这就是我想出的。

在三星 S4 Android 4.3 上,将更改为模式。setenforce 0Permissive

在Samsung Note 3 Android 4.3上,不会更改SELinux状态。setenforce 0

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

评论

0赞 Matthias Urlichs 10/18/2014
你实际上并没有回答这个问题......
2赞 Kevin Mark 10/29/2014
@MatthiasUrlichs他没有?他给出了一种在运行时主动改变 SELinux 执行的方法。OP认为他的问题与此直接相关。我可以确认在CyanogenMod 11中以root身份运行时,SELinux状态会发生变化。setenforce
1赞 t1mz0r 11/22/2014 #2

如果您具有 root 访问权限,请运行以更改为模式:su 0 setenforce 0Permissive

// Set SELinux to permissive
private static final String COMMAND = "su 0 setenforce 0"; 
try {
  Runtime.getRuntime().exec(COMMAND);
} catch (IOException e) {
  e.printStackTrace();
}

评论

0赞 Martin L. 11/24/2014
嗨 t1mz0r ,感谢您的反馈。这就是我在最初的请求中已经做过并提到的。User1546570 指出,它有时有效,有时无效。同时,我知道它不适用于一些三星设备。我通过在运行时以编程方式更改策略并强制重新加载它们来解决这个问题,而不是通过 setenforce 禁用整个 SELinux。现在,随着 Android 5 的上路,这种情况可能会普遍改变 - setenforce 至少适用于 Nexus 设备。干杯和亲切的问候
1赞 Herik 6/13/2015 #3

您可以下载应用程序名称 selinux mod changer。它不在 Play 商店中,因此您可以从 chrome 或您选择的任何其他浏览器下载它。应用程序只需要root权限,所以尝试一下。

13赞 Martin Gerczuk 11/8/2015 #4

您可以从SuperSU应用程序使用supolicy,请参阅链接以获取何时以及如何调用它的详细说明。

总之:

  • 通过检查审计消息,找出 SELinux 阻止某些内容的原因,例如dmesg | grep "audit"
  • 创建允许被阻止操作的规则。它们与 SELinux *.te 文件中的“允许”规则相似(相同?)。allow ...
  • 在 root shell 中运行并检查操作现在是否成功。如果没有,请扩展您的“允许”规则。您可以在单个调用中指定多个“允许”规则。supolicy --live "allow ..."supolicy

请注意,这是一项成本高昂的操作,因此请确保仅调用一次。supolicy

如果您不想依赖 Chainfire 的 SuperSU,您可以尝试 sepolicy-inject。我自己没有测试过。

评论

1赞 Wtower 11/8/2015
嗨,欢迎。我建议你扩展你的答案,以便更有帮助并吸引更多的选票。
1赞 Martin Gerczuk 11/9/2015
谢谢你的提示。我添加了一个粗略的描述如何使用.supolicy
1赞 Wyatt Ward 6/23/2016
我宁愿不信任具有闭源二进制文件的root,所以我没有SuperSU。我很想看看该应用程序正在进行哪些 API 调用。不过我会尝试的。setpolicy-inject
2赞 27px 7/21/2017 #5

使用文本编辑器搜索编辑根目录(第一个目录)上的系统文件夹中的文件build.propselinux

如果您看到类似 ,请将其更改为 ,如果要禁用,反之亦然enable_selinux=10

更改将在重新启动或启动后应用。

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

评论

1赞 Metafaniel 12/28/2018
在我的设备中,它是这样设置的ro.buid.selinux = 1
0赞 Guerlando OCs 6/3/2022 #6

androidboot.selinux=permissive

到内核引导参数

0赞 Mehran Alidoost Nia 11/18/2023 #7

如果要禁用 SElinux 并使整个系统,则需要更改位于 的功能。两个函数,并设置以不同单位调用的 SElinux 的状态。如果同时更改 as 和 的 return 值,则 SElinux 状态将始终为宽松。您可以在此处找到更多详细信息。permissiveselinux.cppsystem/core/initStatusFromProperty()IsEnforcing()SELINUX_PERMISSIVEfalse