在上篇文字《Linux 单用户模式patch解析》(传送门:https://blog.csdn.net/cui841923894/article/details/82261386)的最后有个疑问,为什么在单用户模式下useradd操作仍然可以执行成功(su操作却失败),单用户模式不应该屏蔽所有用户操作吗?难道是因为patch漏了对内核中useradd函数的禁用?
带着上面疑问,展开了我的探索之旅。
查找linux内核代码中useradd接口
开始想的是只要找到内核useradd函数,然后仿照patch的操作,使用#ifdef CONFIG_MULTIUSER屏蔽掉函数,然后添加到sys_in.c中,不就可以禁止useradd操作了吗?
然后linux代码下执行
#grep "useradd" -rn *
#grep "adduser" -rn *
竟然没找到相关函数。
#vim include/linux/syscalls.h
也没找到添加用户的接口,难道用户添加接口名称不是这些?
strace和ftrace查看用户态->内核态调用流程
既然无法直接搜到,那么我ftrace抓一下关键函数总可以了吧。
#cd /sys/kernel/debug/tracing
#echo 0 > tracing_on; echo "" > trace
#echo 1 > tracing_on ; useradd cbx; echo 0 > tracing_on
#cat trace > ftrace.log
#strace useradd cbx1 > strace.log
抓到ftrace.log和strace.log,仔细查看调用流程(篇幅有限,截取关键流程):
ftrace.log
passwd-850 [000] .... 923.403649: do_sys_open <-do_syscall_64
passwd-850 [000] .... 923.403653: getname <-do_sys_open
passwd-850 [000] .... 923.403656: getname_flags <-do_sys_open
passwd-850 [000] .... 923.403676: get_unused_fd_flags <-do_sys_open
passwd-850 [000] .... 923.403680: __alloc_fd <-do_sys_