Maneira padrão de expor o arquivo de dispositivo a aplicativos de usuário em execução em uma conta de usuário não privilegiada?

2

Acabei de terminar a primeira versão de um módulo de kernel do Linux que escrevi em C O módulo cria um arquivo de dispositivo ( /dev/wn0 ) que controla um dispositivo USB com três luzes de LED. Por exemplo, rodando como root, eu posso fazer isso:

echo "#ff0000" >/dev/wn0

... e o dispositivo brilhará em vermelho vivo.

Meu problema é que quero que usuários sem privilégios possam acessar o dispositivo (gravando dados em /dev/wn0 ). Existe uma maneira padrão de fazer isso? É tão simples quanto alterar as permissões no arquivo /dev/wn0 ? Isso cria preocupações de segurança?

    
por Nathan Osman 16.01.2013 / 07:40

1 resposta

4

Ok, vejo algumas possibilidades:

  • A maneira mais rápida, todo o sentido das permissões POSIX e da propriedade: você quer que alguém seja capaz de ler e / ou escrever, você define as permissões de acordo. Basta colocar essas pessoas em um grupo e alterar a propriedade do dispositivo para esse grupo, concedendo permissões de gravação ao grupo. Você pode ter que colocar isso em udev regras, se seu /dev for gerenciado por udev . Isso é o que algumas ferramentas fazem, por exemplo, o bluez faz isso para permitir que os usuários usem o bluetooth, ou pelo menos esse é o método usado na minha distro, a menos que eu tente usar o "ConsoleKit".

  • Se o dispositivo for simples e não houver problema em usá-lo para todos, permita que todos escrevam nele.

  • Escreva um daemon que começa como um usuário que pode escrever no dispositivo, pega o dispositivo e descarta seus privilégios alterando seu UID e processa solicitações de qualquer usuário por meio, por exemplo, do TCP.

  • Escreva um pequeno binário para escrever para o dispositivo, que é setuid de algum usuário que pode gravar no dispositivo e fazer com que os usuários o usem para gravar no dispositivo. Isso é o que o mount faz, é setuid root, para que usuários comuns possam montar sistemas de arquivos se /etc/fstab permitir que eles façam isso.

Ele não cria quaisquer preocupações de segurança adicionais , na medida em que você concorda com a possibilidade de esses usuários usarem esse dispositivo. É claro que qualquer pessoa com acesso ao dispositivo pode explorar qualquer vulnerabilidade no módulo, mas isso seria possível, independentemente de como você conceda às pessoas acesso a ele. Se você escrever um daemon, isso pode ser explorado. Talvez seja melhor manter as coisas simples e garantir que seu código não seja vulnerável.

Eu diria que não há uma maneira padrão única de fazer isso - há algumas maneiras pelas quais partes dos sistemas UNIX fazem isso, e cada parte faz isso da maneira mais conveniente para o tipo de problema que está sendo resolvido.

    
por 16.01.2013 / 18:08