思维导图
怎么搞的:
pid隔离:
user隔离:
mnt隔离:
完整的结构就是:
一个有趣的现象
有一个内核,笔者首先使用如下命令创建一个新的namespace:
然后使用借助漏洞实现任意地址读写,将当前task的cred的前0x28个字节修改成0,之后查看uid是65534,但是却能读特权文件flag:
对这个问题的解释是,首先看下面关于user_namespace的结构图:
我们查询id,通过current->cred->uid读出来的是全局的id,但是我们创建了新的user_ns,此时from_kuid就会通过cred找对应的user_namespace进行解析,然后到uid_map中寻找映射,但是此时这个全局id根本就没有映射过,所以在下面这段代码中就会匹配失败,返回NULL:
那么到了这里就会返回-1:
看一下65534是多少,是-2?: