从用户空间读取 /dev/cpu/*/msr:不允许操作



我正在尝试编写一个简单的应用程序,该应用程序可以读取 msr 寄存器,并且正在从用户空间运行此应用程序。

我已经加载了 msr 模块,并授予每个人对/dev/cpu/*/msr 的读取权限。但是用户仍然无法访问这些文件,但根可以。

权限如下所示:

crw-r--r-- 1 root root 202, 0 sep  6 17:55 /dev/cpu/0/msr
crw-r--r-- 1 root root 202, 1 sep  6 17:55 /dev/cpu/1/msr
crw-r--r-- 1 root root 202, 2 sep  6 17:55 /dev/cpu/2/msr
crw-r--r-- 1 root root 202, 3 sep  6 17:55 /dev/cpu/3/msr

当我尝试从用户空间读取这些文件时,我不断收到"不允许操作"错误消息,但是当root尝试访问它们时,它们工作正常。我做错了什么?我使用的是内核版本 3.11.0 的 Ubuntu 13.04。

自 3.7 左右以来,主线 Linux 内核中的更改现在要求可执行文件具有打开 MSR 设备文件 [2] CAP_SYS_RAWIO功能。除了加载 MSR 内核模块并在 msr 设备文件上设置适当的文件权限外,还必须使用以下命令向需要访问 MSR 驱动程序的任何用户可执行文件授予CAP_SYS_RAWIO功能:

sudo setcap cap_sys_rawio=ep <user_executable>

对我来说(在 debian 上),加载 msr 模块后设置设备权限很有帮助。除了PaulUTK的回答,作为根:

setcap cap_sys_rawio=ep <user_executable>

设置设备权限(之前检查):

ls -l /dev/cpu/*/msr
crw------- ... /dev/cpu/0/msr

我添加了一个组msr并分配了它。作为根:

chgrp msr /dev/cpu/*/msr
chmod g+rw /dev/cpu/*/msr
ls -l /dev/cpu/*/msr
crw-rw---- ... /dev/cpu/0/msr

将组分配给用户:

usermod -aG msr hardworkinguser

奖金提示:

将组作为勤奋用户应用,无需重新登录:

newgrp msr

我还听说必须禁用安全启动。

在用户本杰明·彼得的回答中回应以下内容:

我还听说必须禁用安全启动。

使用 AlmaLinux 8.7 和 4.18.0-425.3.1.el8.x86_64 内核能够在启用安全启动时读取 MSR。

read_smi_count.c 是程序测试的代码。能够运行它以成功读取MSR_SMI_COUNT(0x34)寄存器。以下是构建程序后的输出,它提示需要执行哪些操作才能使用户程序访问 MSR 寄存器:

[mr_halfword@skylake-alma release]$ read_smi_count/read_smi_count 
Error: No permission to open /dev/cpu/0/msr. Try:
sudo chmod o+r /dev/cpu/0/msr
[mr_halfword@skylake-alma release]$ sudo chmod o+r /dev/cpu/0/msr
[sudo] password for mr_halfword: 
[mr_halfword@skylake-alma release]$ read_smi_count/read_smi_count 
Error: No permission to open /dev/cpu/0/msr. Try:
sudo setcap cap_sys_rawio=ep read_smi_count/read_smi_count
[mr_halfword@skylake-alma release]$ sudo setcap cap_sys_rawio=ep read_smi_count/read_smi_count
[mr_halfword@skylake-alma release]$ read_smi_count/read_smi_count 
SMI COUNT = 15240

dmesg 的输出确认内核因启用 EFI 安全启动而被锁定:

mr_halfword@skylake-alma release]$ dmesg|grep lockdown
[    0.000000] Kernel is locked down from EFI secure boot; see man kernel_lockdown.7
[    1.578247] Lockdown: swapper/0: Hibernation is restricted; see man kernel_lockdown.7
[   37.750117] Lockdown: x86_energy_perf: Direct MSR access is restricted; see man kernel_lockdown.7

锁定模式是完整性

[mr_halfword@skylake-alma release]$ cat /sys/kernel/security/lockdown 
none [integrity]

上面的输出未显示机密性锁定模式的选项。尚未调查保密模式是否会阻止读取 MSR 寄存器。

Linux 内核锁定、完整性和机密性指出,机密性模式应用其他限制以防止从内核读取机密

您可以看到vfs_read:

ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
    ret = rw_verify_area(READ, file, pos, count);
    if (ret >= 0) {
        ...
        if (file->f_op->read)  // your driver read .
            ret = file->f_op->read(file, buf, count, pos);
        else
            ret = do_sync_read(file, buf, count, pos);
        ....
    }
    // here,  if the ret is  13.  your error will be occur.
    return ret;
}

最新更新