我是 Android root 应用程序的开发人员。
遗憾的是,现在在某些设备/ROM 上,SELinux 处于 enforce 模式,并阻止我的应用程序的某些操作。
因为这是一个 root 应用程序,所以用户授予我 root 访问权限!
现在,SELinux 阻止了我的一些操作,我需要为此找到解决方案。
我尝试通过
临时禁用 SELinuxsetenforce permissive -> no failure, but getenforce still returns "Enforcing"
echo 0 > /sys/fs/selinux/enforce -> no failure, but getenforce still returns "Enforcing"
我想在运行时编辑 sepolicy 文件以允许被阻止的命令并触发其重新加载,但我不确定这是否以及如何工作,也不是一个好主意。
谁能给我一些更多的建议或资源?
supolicy
,请参阅链接以了解何时以及如何调用它的详细说明。
简而言之:
dmesg | grep "audit"
allow ...
规则。它们与 SELinux *.te 文件中的“允许”规则类似(相同?)。supolicy --live "allow ..."
并检查操作现在是否成功。如果没有,请扩展您的“允许”规则。您可以在一次 supolicy
调用中指定多个“允许”规则。请注意,
supolicy
是一个昂贵的操作,因此请务必仅调用它一次。
如果您不想依赖Chainfire的SuperSU,您可以尝试
sepolicy-inject
。我自己没有测试过。
我尝试在 Android 4.3 上禁用 SELinux 一段时间了,这就是我的想法。
在 Samsung S4 Android 4.3 上,
setenforce 0
将更改为 Permissive
模式。
在 Samsung Note 3 Android 4.3 上,
setenforce 0
不会更改 SELinux 状态。
我尝试过 Nexus 4 Android 4.3,但默认情况下它是
Permissive
模式
使用文本编辑器搜索根目录(第一个目录)上的系统文件夹中的
build.prop
编辑selinux
文件
如果您看到类似
enable_selinux=1
的内容,请将其更改为 0
,如果要禁用,则反之亦然
更改将在重新引导或启动后应用。
同样,您可以打开/关闭多用户帐户、系统更新。我的设备制造商禁用了系统更新。
如果您有 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();
}
您可以下载应用程序名称selinux modchanger。它不在 Play 商店中,因此您可以从 Chrome 或您选择的任何其他浏览器下载它。应用程序只需要 root 权限,所以尝试一下。
添加
androidboot.selinux=permissive
你的内核启动参数
如果你想禁用SElinux并使整个系统
permissive
,你需要更改位于selinux.cpp
的system/core/init
功能。 StatusFromProperty()
和IsEnforcing()
两个函数设置SElinux的状态,这两个函数在不同的单元中被调用。如果您更改 SELINUX_PERMISSIVE
和 false
的返回值,SElinux 状态将始终是许可的。您可以在此处找到更多详细信息。