Por que eu consigo escrever um parâmetro de módulo com as permissões READ ONLY?

4

Eu escrevi o seguinte módulo simples do kernel do Linux para testar o recurso 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");

Agora, quando tento ecoar um valor para ele, recebo o erro "Permission Desnied", como esperado:

[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

Até aí tudo bem.

No entanto, posso escrever no arquivo usando o vim.

Ele tenta me avisar com as seguintes mensagens na linha de status:

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

Mas eu forço a escrever com! e sair do vim, e para minha surpresa o valor do parâmetro é reescrito!

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

(o valor Oriuginal era 5 e eu escrevi 32 usando o vim).

Além disso, o valor do parâmetro no módulo também é alterado !!:

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

O que isso significa? READ Somente permissões podem ser anuladas por um aplicativo userland como o vim? Qual é o uso de bits de permissão então ...?

    
por Lavya 09.07.2015 / 17:46

1 resposta

4

O sistema de arquivos /sys (sysfs) é um pouco especial; muitas operações não são possíveis, por exemplo, criar ou remover um arquivo. Alterar as permissões e propriedade de um arquivo ou definir uma ACL é permitido; que permite ao administrador do sistema permitir que certos usuários ou grupos acessem certos pontos de entrada do kernel.

Não há nenhum caso especial que restrinja um arquivo que é inicialmente somente leitura para todos, desde que seja alterado para ser gravável para alguns. É o que o Vim faz quando é frustrado em sua tentativa inicial de salvar.

As permissões são a única coisa que impede que o arquivo seja gravado. Assim, se forem alterados, o conteúdo do arquivo é alterado, o que, para um parâmetro do módulo, altera o valor do parâmetro dentro do módulo.

Normalmente, isso não tem nenhuma implicação de segurança, pois somente o root pode alterar as permissões no arquivo, e o root pode alterar o valor em /dev/kmem ou carregando outro módulo. É algo para se ter em mente se o root estiver restrito ao carregar módulos ou acessar a memória física diretamente por uma estrutura de segurança como o SELinux; a estrutura de segurança precisa ser configurada para proibir alterações de permissão problemáticas em /sys . Se um usuário receber a propriedade do arquivo, ele poderá alterar as permissões; para evitar isso, se um usuário específico precisar de permissão para ler um parâmetro, não chown o arquivo para esse usuário, mas defina uma ACL ( setfacl -m u:alice:r /sys/… ).

    
por 10.07.2015 / 01:58