android KK 4.4版本后,app使用root(su)权限受到严格限制说明
时间:10-02
整理:3721RD
点击:
[Description]
android KK 4.4 版本后,不管是user 版本,还是eng 版本,app 执行su 后,还由很多权限受到限
制,比如无法抓kernel log, 执行dmesg, 提示:klogctl: Operation not permitted。无法
remount system image 等。
[Keyword]
KK, 4.4, app, su , root
[Solution]
Google 对root 权限是又爱又恨,同时也对app 进行更加严格的权限管控。
在android 4.4 上,zygote fork app 时,特意对所有fork 出来的子进程,进行了CAPBSET_DROP
动作,将Process 的root capabilities 进行了强行限制。 使得即使这些APK 徒有Root 权限,而
无真实的capabilites.
具体代码参考dalvik/vm/native/dalvik_system_Zygote.cpp 中的forkAnDSPecializeCommon 函数
(这个贵司无法修改,因为我们释放时使用封装的Dalvik)
for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
if (err < 0) {
if (errno == EINVAL) {
ALOGW("PR_CAPBSET_DROP %d failed: %s. "
"Please make sure your kernel is compiled with "
"file capabilities support enabled.",
i, strerror(errno));
} else {
ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));
dvmAbort();
}
}
}
这样使得即使后面使用su, 因为Capabilites 中的bounding set 受到明确的限制,使得子进程也无
法拿到完整的capabilities。对比android JB 4.2 的版本,以及android KK 4.4 的版本,你就会
看到:
4.2.2 版本:
root@MT6589_phone_720pv2:/ # cat proc/17569/status
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
4.4.2 版本:
root@mt6589_phone_720pv2:/ # cat proc/17569/status
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffe000000000
可以明显的看到,app 所有有效capabilities 的bounding 都被消除掉。故后续su 起来时
,Permitted/effective Capabilites 也被消除。
CapInh: 0000000000000000
CapPrm: ffffffe000000000
CapEff: ffffffe000000000
CapBnd: ffffffe000000000
因此app 执行su 时,其权限受到了严格的管控,比如无法逃脱DAC 权限管控。但因为依旧具有root
uid/gid, 所以在php?mod=tag&id=6090" target="_blank" class="relatedlink">Framework 层的permission 限制上依旧畅通无阻。
反过来,如果其他非zygote 以及它的子进程fork 的process 执行su/root 则不受这个影响。
[相关FAQ]
FAQ11414: android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
android KK 4.4 版本后,不管是user 版本,还是eng 版本,app 执行su 后,还由很多权限受到限
制,比如无法抓kernel log, 执行dmesg, 提示:klogctl: Operation not permitted。无法
remount system image 等。
[Keyword]
KK, 4.4, app, su , root
[Solution]
Google 对root 权限是又爱又恨,同时也对app 进行更加严格的权限管控。
在android 4.4 上,zygote fork app 时,特意对所有fork 出来的子进程,进行了CAPBSET_DROP
动作,将Process 的root capabilities 进行了强行限制。 使得即使这些APK 徒有Root 权限,而
无真实的capabilites.
具体代码参考dalvik/vm/native/dalvik_system_Zygote.cpp 中的forkAnDSPecializeCommon 函数
(这个贵司无法修改,因为我们释放时使用封装的Dalvik)
for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {
err = prctl(PR_CAPBSET_DROP, i, 0, 0, 0);
if (err < 0) {
if (errno == EINVAL) {
ALOGW("PR_CAPBSET_DROP %d failed: %s. "
"Please make sure your kernel is compiled with "
"file capabilities support enabled.",
i, strerror(errno));
} else {
ALOGE("PR_CAPBSET_DROP %d failed: %s.", i, strerror(errno));
dvmAbort();
}
}
}
这样使得即使后面使用su, 因为Capabilites 中的bounding set 受到明确的限制,使得子进程也无
法拿到完整的capabilities。对比android JB 4.2 的版本,以及android KK 4.4 的版本,你就会
看到:
4.2.2 版本:
root@MT6589_phone_720pv2:/ # cat proc/17569/status
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
4.4.2 版本:
root@mt6589_phone_720pv2:/ # cat proc/17569/status
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffe000000000
可以明显的看到,app 所有有效capabilities 的bounding 都被消除掉。故后续su 起来时
,Permitted/effective Capabilites 也被消除。
CapInh: 0000000000000000
CapPrm: ffffffe000000000
CapEff: ffffffe000000000
CapBnd: ffffffe000000000
因此app 执行su 时,其权限受到了严格的管控,比如无法逃脱DAC 权限管控。但因为依旧具有root
uid/gid, 所以在php?mod=tag&id=6090" target="_blank" class="relatedlink">Framework 层的permission 限制上依旧畅通无阻。
反过来,如果其他非zygote 以及它的子进程fork 的process 执行su/root 则不受这个影响。
[相关FAQ]
FAQ11414: android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
沙发