Esta pergunta é totalmente geral e não se aplica apenas à minha situação, mas ... Eu tenho um pequeno dispositivo busybox no qual desejo que um usuário não root possa executar um script específico com privilégios de root. Por exemplo, algo como este pequeno script para ativar o DHCP, onde a única variável ( $1
) a ser enviada no cmdline (!!) é o nome do host a ser enviado:
#!/bin/bash
udhcpc -b -i eth0 -h $1
executar udhcpc como este requer acesso root, portanto, para isso, planejo modificar /etc/sudoers
para conter esta linha:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
o que deve permitir que "joe" execute facilmente esse script com privilégios de root simplesmente executando:
sudo /path/to/enable_dhcp.sh
e não sendo solicitada uma senha (que é o que eu quero, pois quero que Joe seja capaz de escrever isso).
Agora .. eu sei (ou pelo menos acho que sim) que usar$1
um script que possa ser facilmente executado com privilégios de root é uma idéia HORRÍVEL, pois você pode injetar o que quiser nele.
Então ... qual é a melhor maneira de lidar com isso? Como deixo joe fazer o que quero com privilégios de root, permitir que ele passe uma variável (ou efetivamente o faça com uma variável de ambiente), sem estar aberto a ataques de injeção?
Você deve combinar a entrada passada com um padrão conhecido.
Por exemplo, parece que um endereço IP pode ser uma entrada válida para você. Então você pode usar algo como isto:
Observe que o regexp não foi testado, você é responsável por garantir que o regexp não permita nada de perigoso.
fonte