虽然鸿蒙系统对外宣传天然无Root,但只要是代码开发者,在使用hdc时,‘#’出现在你的面前,当然对于
开发调试者是一种窃喜,想怎么往里推文件,修改参数。但从最终用户来看,这是安全隐患。如何关闭root,切
换到shell用户呢,解决中…
解决思路:
1.参考Android init启动流程,参考对应的adb守护进程,发现在其中在启动流程中,切换了root
到shell。
static void drop_privileges(int server_port) {
if (should_drop_caps) {
minijail_use_caps(jail.get(), CAP_TO_MASK(CAP_SETUID) | CAP_TO_MASK(CAP_SETGID));
}
minijail_change_gid(jail.get(), AID_SHELL);
minijail_change_uid(jail.get(), AID_SHELL);
// minijail_enter() will abort if any priv-dropping step fails.
minijail_enter(jail.get());
}
2.查看鸿蒙系统hdcd代码,找到其代码git库 developtools/hdc_standard$
在hdc的进程里
void NeedDropPriv()
{
char droprootSet[BUF_SIZE_TINY] = “”;
Base::GetHdcProperty(“persist.hdc.root”, droprootSet, BUF_SIZE_TINY);
droprootSet[sizeof(droprootSet) - 1] = ‘\0’;
string rootMode = droprootSet;
if (Base::Trim(rootMode) == “1”) {
setuid(0);
g_rootRun = true;
WRITE_LOG(LOG_DEBUG, “Root run”);
} else if (Base::Trim(rootMode) == “0”) {
setuid(AID_SHELL);
setgid(AID_SHELL);
}
}
可以修改 persist.hdc.root参数,在init.cfg里,或编译param里,需要注意的是:
这个加入的位置要早,前于hdcd start。否则属性修改无效。
- 修改后, hdc shell, ‘$’,终于OK。但是你会发现另外的问题,hilog敲完后,使用不了,
是不是很意外,报错error 13,Permission denied,权限问题。继续查看hilog代码,base/hiviewdfx/hilog,
你会发现,在etc里sockect里没有配置对应的shell gid/uid,但修改后,并不能解决。所以鸿蒙系统还是很多坑,
后面升级3.1,说可以修改,但未验证。
4.另外还有有一个root bug,你在使用uart debug log,是不是也是 “#”号,这个又是怎么回事,调试打印一个
log,还需要root权限,真是难以理解,查找代码,base/startup/init_lite, init.cfg 里有一个配置:
+++ b/services/etc/init.cfg
@@ -498,7 +498,7 @@
“path” : [“/system/bin/sh”],
“disabled” : 1,
“console” : 1,
***"uid" : "root",***
"uid" : "shell",
"gid" : ["shell", "log", "readproc"]
}