useradd在Linux中是怎样完成添加用户的

本文探究了在Linux系统中useradd命令如何在单用户模式下依然能够执行,通过查找内核代码、分析strace和ftrace日志,发现内核并没有直接的用户添加接口。进一步研究发现,useradd命令依赖于PAM(Pluggable Authentication Modules)来管理用户。PAM提供了一种框架,使得应用程序可以调用认证、账号、会话和密码管理的模块,解释了为何在单用户模式下仍能执行useradd操作。
摘要由CSDN通过智能技术生成

在上篇文字《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_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello小崔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值