Linux

為什麼我可以編寫具有隻讀權限的模組參數?

  • July 9, 2015

我編寫了以下簡單的 linux 核心模組來測試 param 功能:

#include<linux/module.h>

int a = 5;
module_param(a, int, S_IRUGO);

int f1(void){

       printk(KERN_ALERT "hello world\n");
       printk(KERN_ALERT "  value passed: %d \n", a);
       return 0;
}

void f2(void){

       printk(KERN_ALERT "value of parameter a now is:  %d \n", a);
       printk(KERN_ALERT "bye bye qworld\n");

}

module_init(f1);
module_exit(f2);


MODULE_AUTHOR("l");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("experimanting with parameters");

現在,當我嘗試向其回顯一個值時,我得到了“Permission Desnied”錯誤,正如預期的那樣:

[root@localhost param]# insmod p.ko 
[root@localhost param]# dmesg -c
[ 7247.734491] hello world
[ 7247.734498]   value passed: 5 
[root@localhost param]# echo 32 >/sys/module/
Display all 145 possibilities? (y or n)
[root@localhost param]# echo 32 >/sys/module/p/parameters/a 
bash: /sys/module/p/parameters/a: Permission denied

到現在為止還挺好。

但是,我可以使用 vim 寫入文件 a。

它確實試圖用狀態行的以下消息警告我:

"/sys/module/p/parameters/a"
"/sys/module/p/parameters/a" E667: Fsync failed
WARNING: Original file may be lost or damaged
don't quit the editor until the file is successfully written!
Press ENTER or type command to continue

但我強迫用 ! 退出vim,令我驚訝的是參數的值被重寫了!

[root@localhost param]# vim /sys/module/p/parameters/a 
[root@localhost param]# cat /sys/module/p/parameters/a 
32

(原始值是 5,我用 vim 寫了 32)。

不僅如此,模組中參數的值也發生了變化!!:

[root@localhost param]# rmmod p.ko
[root@localhost param]# dmesg -c
[ 7616.109704] value of parameter a now is:  32 
[ 7616.109709] bye bye qworld
[root@localhost param]# 

這是什麼意思?READ Only 權限只能被 vim 之類的使用者級應用程序否決?那麼權限位有什麼用..?

( /syssysfs) 文件系統有些特殊;許多操作是不可能的,例如創建或刪除文件。允許更改文件的權限和所有權或設置 ACL;這允許系統管理員允許某些使用者或組訪問某些核心入口點。

沒有特殊情況會限制最初對所有人只讀的文件被更改為對某些人可寫。這就是 Vim 在最初嘗試保存時遇到的問題。

權限是阻止文件被寫入的唯一因素。因此,如果它們被更改,則文件內容會更改,這對於模組參數會更改模組內的參數值。

通常這沒有任何安全隱患,因為只有 root 可以更改文件的權限,並且 root 可以通過/dev/kmem或載入另一個模組來更改值。如果 root 被 SELinux 等安全框架限制載入模組或直接訪問物理記憶體,請記住這一點;需要配置安全框架以禁止在/sys. 如果使用者被授予文件的所有權,他們將能夠更改權限;為避免這種情況,如果特定使用者需要具有讀取參數的權限,請不要chown將該文件提供給該使用者,而是設置 ACL ( setfacl -m u:alice:r /sys/…)。

引用自:https://unix.stackexchange.com/questions/214893