To pytanie jest całkowicie ogólne i dotyczy nie tylko mojej sytuacji, ale ... Mam małe urządzenie busybox, w którym chcę, aby użytkownik inny niż root mógł wykonać określony skrypt z uprawnieniami administratora. Na przykład coś takiego jak ten mały skrypt do włączenia DHCP, gdzie jedyną zmienną ( $1
) do wysłania na cmdline (!!) jest nazwa hosta do wysłania:
#!/bin/bash
udhcpc -b -i eth0 -h $1
uruchamianie udhcpc w ten sposób wymaga dostępu do konta root, więc w tym celu planuję zmodyfikować, /etc/sudoers
aby zawierał ten wiersz:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
które powinny umożliwić „Joe” łatwe uruchamianie tego skryptu z uprawnieniami administratora poprzez proste uruchomienie:
sudo /path/to/enable_dhcp.sh
i nie jest proszony o hasło (to jest to, czego chcę, ponieważ chcę, żeby Joe mógł to zrobić).
Teraz .. Wiem (a przynajmniej tak mi się wydaje), że użycie $1
w skrypcie, który można łatwo uruchomić z uprawnieniami administratora, jest OGROMNYM pomysłem, ponieważ możesz do niego wstrzyknąć, co tylko chcesz.
Więc ... jaki jest najlepszy sposób, aby sobie z tym poradzić? Jak pozwolić Joe'emu robić, co chcę, z uprawnieniami roota, pozwalać mu przekazywać zmienną (lub skutecznie robić to tak, jak ze zmienną środowiskową), nie będąc jednocześnie szeroko otwartym na ataki iniekcyjne?
Powinieneś dopasować przekazane dane wejściowe do znanego dobrego wzorca.
Na przykład wygląda na to, że adres IP może być dla Ciebie prawidłowy. Możesz więc użyć czegoś takiego:
Pamiętaj, że wyrażenie regularne nie zostało przetestowane, jesteś odpowiedzialny za upewnienie się, że wyrażenie regularne nie zezwala na nic niebezpiecznego.
źródło