tgoop.com/qianqianzhuang/33
Last Update:
前文再续。三个月之后,Magisk 终于修复了这个问题。方法也很简单直接:Magisk 在开机时修补 sepolicy 有两个阶段,第一阶段拦截 init 写入 /sys/fs/selinux/load 的过程,获取原本要写入的 sepolicy 数据库;第二阶段从数据库中 dump 出 policy,在加入 Magisk 自身与模块所需规则后重新编译数据库,再向内核写入。因此,Magisk 可以在第一阶段时读取 init 编译好的数据库携带的 config bits,在第二阶段时直接原样写入内核。
看起来所有问题都得到了修复。然而,根据用户反馈,部分新设备上又出现了任意应用都可以获取 MAC 地址的问题(Native Test 报 Permission Loophole),且这些设备都使用了 live patch (magiskpolicy —live)功能。live patch 的原理,是从 /sys/fs/selinux/policy 读取内核当前加载的 policy 数据库,加入所需条目后重新写入内核。而前述补丁已经按原样写入了 config bits,难道出问题的是内核?
经过进一步调查,我们确认这是一个 AOSP bug。谷歌撰写的两个加入 Android 专用 class 的提交(第一个和第二个),只处理了 policydb_read() 函数,没有处理 policydb_write() 函数。也就是说,用户态可以向内核传递正确的 config,但却无法从内核导出正确的 config。在 live patch 时,内核输出的数据库并不包括前述两个 config,导致 Magisk 在回写内核时,也无法正确处理这两个 config。昨天向 AOSP 提交了补丁,希望能尽快被合并。
怎么修?我有想过在 Magisk 处理,要么在开机时手动保存从 init 读取到的 config,要么直接根据系统版本判断。但考虑到这其实并不是 Magisk 自身的问题,可能还是由谷歌来修复更为合适。对开发者的建议是,在任何情况下,都要优先使用 sepolicy.rule 来修补 sepolicy。
BY 钱庄
Share with your friend now:
tgoop.com/qianqianzhuang/33