user_namespace学习笔记


getuid源码分析

https://elixir.bootlin.com/linux/v6.13.5/source/kernel/sys.c#L995

current_uid

current_uid是一个宏:

然后是走current_cred_xxx,相当于是current_cred()->uid:

然后current_cred如下:

总之,current_uid的作用就是从当前task中找到cred,并从中取出uid;

基本数据结构

数据结构:

说到底就是个int32。

uid_map

uid_map结构如下:

分两种情况使用,当数量小于5的时候采用第一种模式,数量大于5的时候采用链表,通过nr_extents来表征,如果是链表,这个nr_extents不会被破坏,改成大于5的数字应该就行了:

整体结构

过程分析

from_kuid_munged主要执行了from_kuid函数:

from_kuid则只执行了map_id_up函数:

map_id_up函数首先根据map的nr_extents成员来判断uid_map的实现方式:

然后通过map_id_up_base或者map_id_up_max来取出对应的extent,下面先只看map_id_up_base,first 为本子 user ns 的起始 uid,lower_first 为父 user ns 的起始 uid(内核会转换成全局uid),count 为映射的个数

对extent,个人的理解是,每一个extent表示一段连续的映射,first表示这段连续映射中子user_ns的起始uid,lower_first表示这段来纳许映射中父(或者全局?)user_ns的起始uid,count则表示这段连续映射中映射的数量:

关于 Capability

分析一下open函数在内核中是怎样进行权限检查的https://elixir.bootlin.com/linux/v6.13.5/source/fs/open.c#L1414:

https://elixir.bootlin.com/linux/v6.13.5/source/fs/namei.c#L380

参考

https://www.cnblogs.com/scriptk1d/p/13052993.html

https://tinylab.org/user-namespace/


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录