操作系统与虚拟化安全-内核导论

配合内核代码结构理解

安全工作重点关注:不同子组件的系统调用,pool

内核结构

程序调用内核协同

内核代码结构

linux 4.19内核代码:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/?h=v4.19.294

init:开机启动

  • https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/init?h=v4.19.294

kernel:进程管理和调度

  • https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/kernel?h=v4.19.294
  • fork.c等等

ipc:进程通信

  • https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/ipc?h=v4.19.294

fs:文件系统

  • https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/fs?h=v4.19.294
  • vfs是抽象层次封装的文件系统,便于扩展
  • 鸿蒙的文件系统就是在vfs下实现的分布式文件系统

include:数据结构的实现

security:安全部分代码

  • https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/security?h=v4.19.294
  • 比如se linux等模块

文件子系统

功能

  • 分配文件空间
  • 管理空闲空间
  • 控制对文件的存取
  • 为用户检索数据

系统调用

  • open, creat, close, read, write, state, chown, chmod, link, unlink, mount, umount

进程控制子系统

功能

  • 进程同步
  • 进程间通信
  • 存储管理
  • 进程调度

系统调用

  • fork, exec, execve, setuid, exit, kill, wait, brk

硬件控制

功能

  • 负责处理中断及与机器通信

文件的内容表示

inode table

include/inode.c

内容

  • 包含文件所有者、存取权限、及其存取时间等信息

  • 后期做安全权限控制修改的部分

文件索引过程

  • 内核每次分析文件名中的一个分量,检查该进程是否有权检索路径中的目录
  • 并且最终检索到该文件所对应的索引节点。如:open(“/fs2/mjb/rje/sourcefile”,1);

文件创建、操作过程

  • 当一个进程建立一个新文件时,内核分配给它一个尚未使用的索引节点,索引节点被存储在文件系统中(即磁盘索引节点表)
  • 但是当操作文件时,内核将它们读到内存索引节点表中,即:对系统中的每个活动的文件(被某个进程打开了),内存中索引节点表都包含一个条目

对比:磁盘索引节点表、内存索引节点表

  • 磁盘索引节点

磁盘索引节点内容

  • 内存索引节点
    • 内存索引节点
    • 引用数:open文件的进程数
    • 内核函数:
      • iget 分配一个索引节点的内存拷贝
      • iput 释放一个索引节点的内存拷贝
      • namei 把路径名转换为索引节点
      • ialloc 把一个磁盘索引节点分配给一个新建立的文件
      • ifree 释放一个磁盘索引节点

对比:文件表(file table)、用户文件描述符表(user file descriptor table)、内存索引节点

  • 文件表

    include/file结构体

    • linux内核里全局表,所有进程共享(内核唯一)
    • 其中的一个条目《=》内核里all进程的open
      • 文件偏移量
      • 访问模式(读、写、or 读-写)
      • 指向它的文件描述符表的条目计数
  • 用户文件描述符表

    files_struct 结构体

    • 记录某进程所有打开的文件(进程唯一)
    • 每个进程用一个fs_struct结构体来描述进程的当前工作目录及其所在文件系统根目录下的索引节点
    • 理解图1:由于文件表条目存储了访问模式(当前读写位置),所以由于A、B进程中对同一个位置的访问模式不同,所以指向不同的文件表条目。
    • 理解图2:假设B是一个A打开文件以后fork的进程,对应后面的图,不需要再开一个新的文件表条目

理解三张表的关系

image-20230918103902793

进程的结构

数据结构

  • 标识号:唯一标识一个进程,用组号标识、用户标识来确定权限
    • 真正用户/组标识号:uid,gid
    • 有效用户/组标识号:euid,egid(真正有效的一组),pool
  • 状态信息:进程当前的状态
  • 调度信息:如计数器、优先级、调度策略、实时优先级
  • 通信信息:
    • 如信号Signals,管道Pipes,以及内存共享shared memory, 信号量semaphore, 消息队列 Message Queues
    • 进程接到的信号、信号掩码、信号处理函数、为避免死锁而在信号量上设置的取消操作、与信号量相关的等待队列
  • 进程链接信息:
    • 进程树中的位置(父子关系、兄弟关系)
    • 运行队列的位置
  • 时间和定时器
  • 文件系统信息
    • 可执行映像所对应根目录、当前目录的指针(struct fs_struct *fs
    • 打开的文件的描述符(struct files_struct *files
  • 相关上下文信息
    • 虚拟内存与物理内存之间的映射信息
    • 和处理器相关的环境信息,如寄存器、堆栈信息,在进程暂停、恢复是保存和恢复其状态

进程树

进程的标识

进程上下文

进程表与U区

进程的状态

进程的控制

进程的通信

基本机制

UNIX系统V的IPC机制

系统调用

消息队列

共享存储区

信号量

I/O 子系统


操作系统与虚拟化安全-内核导论
https://al-377.github.io/2023/09/18/OS-Virtualization-Security-lesson3/
作者
Aidan Lew
发布于
2023年9月18日
许可协议