읽기 전용 권한으로 모듈 매개변수에 쓸 수 있는 이유는 무엇입니까?

읽기 전용 권한으로 모듈 매개변수에 쓸 수 있는 이유는 무엇입니까?

매개변수 기능을 테스트하기 위해 다음과 같은 간단한 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/…) 을 설정하십시오. .

관련 정보