内核达人

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4|回复: 0

sudo底层实现原理

[复制链接]

25

主题

25

帖子

83

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
83
发表于 7 天前 | 显示全部楼层 |阅读模式

哈喽,大家好,我就是那个不喜欢在大厂搬砖,不喜欢在研究院做研究,只喜欢创业做计算机底层课程的coder,子牙老师

关于sudo,想必大家不陌生了,给我们最直观的感受就是以root权限执行后面的命令,那你是否好奇它底层是如何实现的呢?最近正好备课把这个问题深入研究了一下,分享给大家

以下,enjoy

场景
Linux系统中,你是个普通用户(非root),你想mount,会得到报错信息
提示你,只有root用户才能做这个操作

其实不止是mount,你普通用户想做任何高危操作,都需要root权限

但是你没有root密码,这时候你会怎么办?使用sudo,对吧
输入你自己的密码,就可以了

为什么这样就可以了?

sudo
来看下sudo命令有什么特殊的地方
常见的权限位是rwx,对应的权限是可读可写可执行。你会发现sudo的权限位有个s位,这个是什么呢?这个是SUID,在Linux内核中对应的宏是S_ISUID
这个SUID的信息存储在哪?存储在可执行文件对应的inode节点中
如果你想看源码,存储在inode的属性i_mode中。如图
如果你想知道存储细节,满足你:i_mode是16位的,前4位存放文件类型,中间3位存放特殊权限位如SUID、SGID、Sticky Bit,后面9位就存放所有者所属组其他人的rwx权限

我为什么知道的这么细?Linux内核玩熟了呗~你玩到这么熟,你可能比我还细~

为什么sudo命令有了s权限就可以如此强大呢?

SUID
SUID的作用是:以文件所有者权限执行这个程序。所以光有SUID还不行,文件的所有者还得是root,两个条件缺一不可

来看看所属用户是root,具备s权限的sudo,Linux系统是如何做到以root权限运行的

Linux系统执行sudo命令的时候,会创建进程,对应的内核对象是task_struct,task_struct中有三个属性与用户权限相关
ptracer_cred与调试相关,real_cred是进程的真实凭证,cred是运行时凭证。SUID作用的就是cred中的属性euid

结构体cred中与uid、gid相关的几个属性
来看Linux内核源码论证,Linux内核真的会根据SUID配置进程的cred中的euid
一个进程为什么要有两个cred?因为Linux系统提供了相关的机制可以去修改程序运行时的所有者与所属组、粘滞位,分开存储。如果不分开,那就会把一个程序变成真正的root权限,存在安全隐患。这部分是Linux安全子系统 LSM 中的内容,感兴趣的小伙伴可以自行深究

至此,自上而上,sudo可以以root权限执行程序的谜底已全部揭晓

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|内核达人

GMT+8, 2025-12-6 13:24 , Processed in 0.048902 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表