在linux的世界里,权限是一件复杂又重要的事情。这次从dmidecode命令的执行引出对权限的控制。

Dmidecode

  • 在许多linux发行版中都有的一个软件,用来查看硬件信息。
  • DMI(Desktop Management Interface,DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force(DMTF)起草的开放性的技术标准,其中DMI设计适用于任何的平台和操作系统。
  • 首先会从/sys/firmware/dmi/tables/smbios_entry_point/sys/firmware/dmi/tables/DMI读取相应信息,如果没有这两个文件,则从/dev/mem读取。

/dev/mem

  • 该文件可以映射整个处理器的地址空间。除了内存,还有外设的IO空间,以及其他总线映射过来的mem(如PCI)。通常用mmap操作这个文件。
  • 所以可借此实现用户态驱动程序。
  • 对此文件进行操作需要cap_sys_rawio权限(实际操作中这个cap不够,应该是误传)。

SUID,SGID

  • linux下的特殊权限位。
  • 当可执行文件被设置了这两个权限位,文件被执行的时候,会相应拥有owner、owner group的权限。
  • 参见《UNIX环境高级编程》阅读笔记。

capability

  • linux将root用户的权限,切分成更小的组成。
  • cap可以赋给某个进程或某个可执行文件。
  • cap有三个位图,inheritable(I),permitted(P)和effective(E),对应进程描述符task_struct(include/linux/sched.h)里面的cap_effective, cap_inheritable,cap_permitted,所以我们可以查看/proc/PID/status来查看进程的能力。
    • cap_effective:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0。
    • cap_permitted:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集。
    • cap_inheritable: 表示能够被当前进程执行的程序继承的能力。

让普通用户也能执行dmidecode命令

  • 显然,有至少三个办法。
    • 改变/sys/firmware/dmi/tables/*的可读权限。
      • sudo chmod 444 /sys/firmware/dmi/tables/*
    • 给dmidecode设置SUID
      • sudo chmod u+s /usr/sbin/dmidecode
    • 给dmidecode增加capability。
      • sudo setcap cap_dac_override=eip /usr/sbin/dmidecode

Reference