web-dev-qa-db-ja.com

読み取り専用権限でモジュールパラメータを記述できるのはなぜですか?

Param機能をテストするために次の簡単な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");

これで、値をエコーし​​ようとすると、期待どおりに「PermissionDesnied」エラーが発生します。

[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]# 

これは何を意味するのでしょうか? READ Onlyパーミッションは、vimのようなユーザーランドアプリケーションによって単に無効にされる可能性がありますか?それでは、許可ビットの使用は何ですか..?

4
Lavya

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

最初はすべての人が読み取り専用であるファイルを、一部の人が書き込み可能に変更することを制限する特別なケースはありません。それが、Vimが最初の保存の試みで妨害されたときに行うことです。

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

Rootのみがファイルの権限を変更でき、rootは/dev/kmemを介して、または別のモジュールをロードすることによって値を変更できるため、通常、これにはセキュリティ上の影響はありません。 rootが、SELinuxなどのセキュリティフレームワークによってモジュールのロードや物理メモリへの直接アクセスを制限されている場合は、注意が必要です。セキュリティフレームワークは、/sysで問題のある権限の変更を禁止するように構成する必要があります。ユーザーにファイルの所有権が与えられている場合、ユーザーはアクセス許可を変更できます。これを回避するために、特定のユーザーがパラメーターを読み取るためのアクセス許可を持っている必要がある場合は、ファイルをそのユーザーにchownせずに、ACL(setfacl -m u:alice:r /sys/…)を設定します。