我在Android中有一个应用需要使用root修改其他应用的私有数据库。目前的方法适用于所有设备,包括Lollypop,但由于SELinux,似乎在Marshmallow设备上失败。
要修改数据库,应用程序会执行以下操作:
但是,在Marshmallow上,尝试使用SQLiteDatabase打开复制的数据库失败并产生以下AVC拒绝:
avc: denied { open } for path="/data/data/<my app package>/cache/<database>.db" dev="dm-0" ino=509488 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:app_data_file:s0 tclass=file permissive=0
我唯一尝试过的是以root用户身份在文件上运行chcon u:r:untrusted_app:s0
,但它表示权限已被拒绝。
此外,根据我在此处阅读的内容:https://source.android.com/security/selinux/,似乎SELinux在5.0版本中设置为强制模式,那么为什么现在这只是一个问题,现在在6.0但是没有&#39 ; t在5.0?
答案 0 :(得分:1)
我刚为我的某个应用程序完成了类似的操作,因此它可以在Pixel设备上的Android 7上运行。
与您一样,我将原始数据库文件复制到我应用的位置。然后我不仅chmod他们,但我也chown / chgrp他们到我的应用程序的uid。最后,我将数据库文件切换到在其原始位置为它们找到的上下文。然后,我可以通过我的应用程序中的SqliteDatabase类访问和操作它们。
完成后,我将数据库文件移回原来的位置,将它们chg / chgrp回到拥有应用程序的uid,然后恢复它们。
这是一个巨大的痛苦。但到目前为止它似乎在我的有限测试中起作用。但请注意,在Android的更高版本中,工具箱命令似乎已被toybox命令取代,这确实会影响chown / chgrp。工具箱版本允许在同一命令中更改所有者和组。 Toybox不是这样,你必须发出chown和chgrp命令。
也可能有其他命令更改。例如,在Pixel上,grep命令现在是一个独立的二进制文件,而不是工具箱或玩具箱的一部分。
答案 1 :(得分:0)
您可以使用adb shell su 0 setenforce 0
代码关闭强制执行模式并转到许可模式。
在许可模式下,您可以在没有SELinux的情况下做普通手机上的任何事情。
关闭强制执行模式后,您可以执行以前的操作。