読み取り専用権限でモジュールパラメータに書き込むことができるのはなぜですか?

読み取り専用権限でモジュールパラメータに書き込むことができるのはなぜですか?

パラメータ機能をテストするために、次の簡単なLinuxカーネルモジュールを作成しました。

#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を使ってファイルに書き込むことができます。

ステータスバーに次のメッセージを表示して私に警告しようとしました。

"/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]# 

どういう意味ですか? vimなどのユーザー空間アプリケーションは読み取り専用権限を無視できますか?もしそうなら、権限ビットの用途は何ですか?

ベストアンサー1

(sysfs) ファイル/sysシステムは幾分特別です。ファイルの作成や削除など、多くの操作は不可能です。ファイルの権限と所有権を変更したり、ACLを設定したりできます。これにより、システム管理者は特定のユーザーまたはグループが特定のカーネルエントリポイントにアクセスできるようになります。

もともとすべての人に読み取り専用であったファイルを他の人が書き込むように変更することを制限する特別な状況はありません。これは、最初の保存試行がブロックされたときにVimが実行するアクションです。

権限は、ファイルの書き込みを妨げる唯一の要素です。したがって、変更するとファイルの内容が変更され、モジュールパラメータの場合はモジュール内のパラメータ値が変更されます。

通常、ルートのみファイルの権限を変更でき、ルートは/dev/kmem他のモジュールをロードまたはロードして値を変更できるため、セキュリティには影響しません。 SELinuxなどのセキュリティフレームワークによってルートがモジュールをロードしたり、物理メモリに直接アクセスできないように制限されている場合は、問題の権限の変更を防ぐようにセキュリティフレームワークを設定する必要があります/sys。ユーザーにファイルの所有権が与えられたら、それを防ぐために権限を変更できます。特定のユーザーがパラメーターを読み取る権限が必要な場合は、chownそのユーザーにファイルを送信せずに代わりにACL(setfacl -m u:alice:r /sys/…)を設定してください。 。

おすすめ記事