Linux内核进程管理子系统有什么第四十二回 —— 进程主结构详解(38)

接前一篇文章:Linux内核进程管理子系统有什么第四十一回 —— 进程主结构详解(37)

本文内容参考:

Linux内核进程管理专题报告_linux rseq-CSDN博客

《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超

《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社

setuid系统调用及示例-CSDN博客

setuid函数解析 - HelloMarsMan - 博客园

特此致谢!

进程管理核心结构 —— task_struct

8. 进程权限相关成员

进程权限相关成员包括以下几个:

​	/* Process credentials: *//* Tracer's credentials at attach: */const struct cred __rcu		*ptracer_cred;/* Objective and real subjective task credentials (COW): */const struct cred __rcu		*real_cred;/* Effective (overridable) subjective task credentials (COW): */const struct cred __rcu		*cred;

这几个字段的描述如下:

上一回继续对于struct cred进行解析,本回仍然继续。为了便于理解和回顾,再次贴出struct cred的定义,在include/linux/cred.h中,如下:

​
/** The security context of a task** The parts of the context break down into two categories:**  (1) The objective context of a task.  These parts are used when some other*	task is attempting to affect this one.**  (2) The subjective context.  These details are used when the task is acting*	upon another object, be that a file, a task, a key or whatever.** Note that some members of this structure belong to both categories - the* LSM security pointer for instance.** A task has two security pointers.  task->real_cred points to the objective* context that defines that task's actual details.  The objective part of this* context is used whenever that task is acted upon.** task->cred points to the subjective context that defines the details of how* that task is going to act upon another object.  This may be overridden* temporarily to point to another security context, but normally points to the* same context as task->real_cred.*/
struct cred {atomic_t	usage;
#ifdef CONFIG_DEBUG_CREDENTIALSatomic_t	subscribers;	/* number of processes subscribed */void		*put_addr;unsigned	magic;
#define CRED_MAGIC	0x43736564
#define CRED_MAGIC_DEAD	0x44656144
#endifkuid_t		uid;		/* real UID of the task */kgid_t		gid;		/* real GID of the task */kuid_t		suid;		/* saved UID of the task */kgid_t		sgid;		/* saved GID of the task */kuid_t		euid;		/* effective UID of the task */kgid_t		egid;		/* effective GID of the task */kuid_t		fsuid;		/* UID for VFS ops */kgid_t		fsgid;		/* GID for VFS ops */unsigned	securebits;	/* SUID-less security management */kernel_cap_t	cap_inheritable; /* caps our children can inherit */kernel_cap_t	cap_permitted;	/* caps we're permitted */kernel_cap_t	cap_effective;	/* caps we can actually use */kernel_cap_t	cap_bset;	/* capability bounding set */kernel_cap_t	cap_ambient;	/* Ambient capability set */
#ifdef CONFIG_KEYSunsigned char	jit_keyring;	/* default keyring to attach requested* keys to */struct key	*session_keyring; /* keyring inherited over fork */struct key	*process_keyring; /* keyring private to this process */struct key	*thread_keyring; /* keyring private to this thread */struct key	*request_key_auth; /* assumed request_key authority */
#endif
#ifdef CONFIG_SECURITYvoid		*security;	/* LSM security */
#endifstruct user_struct *user;	/* real user ID subscription */struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */struct ucounts *ucounts;struct group_info *group_info;	/* supplementary groups for euid/fsgid *//* RCU deletion */union {int non_rcu;			/* Can we skip RCU deletion? */struct rcu_head	rcu;		/* RCU deletion hook */};
} __randomize_layout;

上一回在讲 struct cred中的第4组字段kuid_t suid和kgid sgid时,

对于setuid系统调用进行知识补强。没有讲完,本回把这一知识点讲完、讲透彻。

知识补强 —— setuid系统调用

函数功能

设置调用进程的有效用户ID(Effective UID)。

根据调用者的权限(是否为root)和目标uid,行为会有所不同:

  • 如果进程拥有超级用户特权,则setuid系统调用将实际用户ID(real UID)、有效用户ID(effective UID)以及保存的设置用户ID(saved UID)设置为uid;
  • 如果进程没有超级用户特权、但uid等于实际用户ID(real UID)或保存的设置用户ID(saved UID),则setuid只将有效用户ID(effective UID)设置为uid。并不改变实际用户ID和保存的设置用户ID。
  • 如果上两个条件都不满足(即进程也没有超级用户特权、uid也不等于实际用户ID和保存的设置用户ID),则将errno设置为EPERM,并返回错误。

从另外一种说法来理解一下:

函数原型

#include <unistd.h>    // 包含系统调用声明
#include <sys/types.h> // 包含 uid_t 类型定义int setuid(uid_t uid);

参数

  • uid_t uid:指定要设置的新的有效用户ID。

返回值

成功返回0;失败返回-1,并将errno设置为合适的值,以指示具体的错误原因。

错误码(errno)

  • EINVAL:参数无效(虽然在 Linux 中通常不会返回此错误)。
  • EPERM:调用者没有权限执行此操作。对于普通用户,这意味着uid既不是ruid、也不是suid(就是上边两个条件都不满足的那种情况)。

下一回继续对于setuid系统调用进行深入讲解,务必使读者能够理解清楚这一段比较复杂和费解的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95687.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于飞算JavaAI的学生成绩综合统计分析系统

第一章&#xff1a;项目概述与背景 1.1 项目背景与意义 在教育信息化飞速发展的今天&#xff0c;学生成绩管理已成为学校教学管理的核心环节。传统的学生成绩管理多依赖于手工操作或基础的信息管理系统&#xff0c;存在数据处理效率低、统计分析功能薄弱、数据可视化缺失等问题…

C++程序员必懂:std::bad_function_call异常的真相与预防秘诀

std::bad_function_call 是 C++ 标准库在 <functional> 头文件中定义的一个异常类型。当程序试图调用一个未持有任何可调用目标(即处于“空状态”)的 std::function 对象时,此异常会被抛出。本文将深入探讨该异常的根本原因、详细的触发场景,并提供一套完整的预防与处…

Html重绘和重排

在网页渲染过程中&#xff0c;重绘&#xff08;repaint&#xff09;和重排&#xff08;reflow&#xff09;是两个重要的概念。理解它们的区别和优化方法对于提升网页性能至关重要。重排&#xff08;Reflow&#xff09;重排是指当页面元素的位置、尺寸等几何属性发生变化时&…

Redis 客户端与服务器:银行的 “客户服务系统” 全流程

目录 一、Redis 客户端&#xff1a;银行的 “客户档案” 二、客户端关闭&#xff1a;银行的 “终止服务规则” 三、命令处理流程&#xff1a;柜员办理业务的 “标准步骤” 1. 接收申请单&#xff08;读取命令请求&#xff09; 2. 确认业务类型&#xff08;查找命令&#x…

HTML图片标签及路径详解

图片是网页内容的重要组成部分&#xff0c;能够使页面更加生动直观。在HTML中&#xff0c;使用<img>标签插入图片&#xff0c;而正确设置图片路径则是确保图片能够正常显示的关键。一、图片标签&#xff08;<img>&#xff09;1. 图片标签的基本语法<img>标签…

【数据库通过日志恢复数据解读】

在数据库恢复机制中&#xff0c;日志文件是实现事务原子性、持久性和崩溃恢复的核心组件。以下通过具体示例和解读方法&#xff0c;结合主流数据库系统的实现细节&#xff0c;详细说明日志文件的内容与分析逻辑。 一、日志文件的核心作用与结构 日志文件通过**预写式日志&#…

【面试题】搜索准确性不高你怎么排查?

系统性排查框架&#xff1a;数据层检查 索引覆盖率&#xff1a;检查文档是否全部正确索引数据新鲜度&#xff1a;确认索引更新频率和延迟文档质量&#xff1a;分析被索引内容的质量和完整性查询理解层 分词分析&#xff1a;检查查询分词是否正确意图识别&#xff1a;验证意图分…

当AI开始“偷吃”用户数据并拼装功能模块:初级开发者的脑洞保卫战与老码农的灵魂蘸料

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录当AI开…

Flowable——流程定义与部署(RepositoryService)

文章目录 前言 参考资料 流程图的部署、查询与删除 流程图的准备 流程的部署 指定已部署流程信息查询 删除指定已部署流程 结语 前言 前篇博客具体说了怎么使用flowable去自动建表,以及搭建配置前端UI绘图的界面。本篇博客主要说明对于已绘制好的流程图如何去进行部署。 Flow…

采用基于模型的方法实现车辆SOA威胁分析自动化

摘要尽管采用面向服务架构&#xff08;SOA&#xff09;有助于实现自动驾驶、空中下载更新等功能&#xff0c;但同时也增加了车辆遭受攻击的风险&#xff0c;可能对道路使用者造成伤害。为解决这一问题&#xff0c;相关标准&#xff08;ISO 21434 / 联合国欧洲经济委员会&#x…

C++语言编程规范-常量

01 C还有搞头吗 02 常量 不变的值更易于理解、跟踪和分析&#xff0c;所以应该尽可能地使用常量代替变量&#xff0c;定义值的时候&#xff0c;应该把 const 作为默认的选项。使用 const 常量取代宏说明&#xff1a;宏是简单的文本替换&#xff0c;在预处理阶段时完成&#x…

【CS32L015C8T6】配置单片机PWM输出(内附完整代码及注释)

目录 前言&#xff1a; 一、CS32L015中定时器及PWM硬件资源介绍&#xff1a; 二、以CS32L015为例配置PWM步骤&#xff1a; 三、完整代码及注释 四、如果这篇文章能帮助到你&#xff0c;请点个赞鼓励一下吧ξ( ✿&#xff1e;◡❛)~ 前言&#xff1a; CS32L015 是一款内嵌 …

hive表不显示列注释column comment的问题解决

安装datasophon平台hive后&#xff0c;发现hive表的字段注释丢失了&#xff0c;表的注释没问题&#xff0c;csv格式的表没问题&#xff0c;只有parquet和orc的表有这个问题。查网上似乎没有这方面的问题。查看mysql表里面的中文注释也一切正常&#xff0c;后来经过多次研究才发…

【笔记】AI Agent发展趋势

前言 本章主要探讨了现在AI技术的发展趋势、大模型的一些局限性和小模型存在的必要性,然后引出了AI Agent的优势与发展趋势。 目标 学完本课程后,您将能够: 了解大模型的局限性; 了解小模型存在的必要性; 了解AI Agent的优势; 了解模型协同的技术。 目录 1.AI发…

ChatDOC工具测评:AI驱动PDF/Word文档处理,支持敏感内容隐私保护与表格提取分析

之前跟你们聊过用 Python 处理数据的 Pandas&#xff0c;今天换个更贴近日常办公的方向 —— 给你们安利一个 AI 文档处理工具「ChatDOC」&#xff0c;官网地址是https://www.chatdoc.com/&#xff0c;它能直接读取 PDF、Word 里的内容&#xff0c;你不用逐页翻文档找信息&…

Vue + fetchEventSource 使用 AbortController 遇到的“只能中止一次”问题解析与解决方案

前言 在前端项目中&#xff0c;使用 SSE&#xff08;Server-Sent Events&#xff09; 长连接去获取实时消息已经很常见了。像 fetchEventSource 这种封装好的工具&#xff0c;可以帮助我们轻松处理流式请求。 不过在实践中&#xff0c;我遇到了一个奇怪的问题&#xff1a;点击按…

Django get_or_create 方法详解

get_or_create 是 Django ORM 中的一个非常常用的方法&#xff0c;它用于获取数据库中的一个对象&#xff0c;如果该对象不存在&#xff0c;则创建一个新的对象并返回。 方法签名&#xff1a; Model.objects.get_or_create(defaultsNone, **kwargs)参数解释&#xff1a; defaul…

LangChain 文档问答系统中高级文本分割技术

告别语义断裂:LangChain 文档问答系统中高级文本分割技术深度指南 文章目录 引言:问题的根源——为何精准的文本分割是 RAG 系统的命脉? 第一部分:探本溯源——剖析 LangChain 默认分割器的“机械之困” 机制解析:语法驱动的“暴力”切分 问题场景化展示:语义、上下文与结…

Web2 vs Web3--差异一看就懂

互联网技术的浪潮不断推动着我们从Web2时代向Web3时代迈进。这两个时代在技术架构、用户体验、数据所有权等方面有着显著的差异。本文将为您详细解析Web2与Web3之间的差异&#xff0c;并探讨它们如何塑造我们的数字生活。 定义 Web2&#xff0c;即第二代互联网&#xff0c;以其…

深入解析MongoDB内部架构设计

MongoDB内部构造详解 MongoDB作为一款流行的NoSQL数据库&#xff0c;其内部构造设计独特且高效。以下从多个维度详细解析MongoDB的内部架构和核心组件。 一、整体架构 MongoDB采用分布式架构设计&#xff0c;主要包含以下核心组件&#xff1a;应用层&#xff1a;应用程序通过语…