Этот вопрос носит общий характер и применим не только к моей ситуации, но ... У меня есть небольшое устройство busybox, где я хочу, чтобы пользователь без полномочий root мог выполнять определенный сценарий с привилегиями пользователя root. Например, что-то вроде этого небольшого скрипта для включения DHCP, где единственная переменная ( $1
) для отправки в cmdline (!!) - это то, какое имя хоста отправлять:
#!/bin/bash
udhcpc -b -i eth0 -h $1
для запуска udhcpc, подобного этому, требуется root-доступ, поэтому для этого я планирую /etc/sudoers
внести изменения, содержащие следующую строку:
joe ALL = NOPASSWD: /path/to/enable_dhcp.sh
что должно позволить "joe" легко запускать этот скрипт с привилегиями root, просто запустив:
sudo /path/to/enable_dhcp.sh
и не запрашивать пароль (это то, что я хочу, так как я хочу, чтобы Джо мог написать это).
Теперь ... Я знаю (или, по крайней мере, думаю, что знаю), что использование $1
в скрипте, который легко может быть запущен с привилегиями root, является УЖАСНОЙ идеей, поскольку вы можете внедрить в нее все, что захотите.
Итак ... каков наилучший способ справиться с этим? Как я могу позволить joe делать то, что я хочу, с правами суперпользователя, разрешать ему передавать переменную (или эффективно делать это, как с переменной окружения), не будучи широко открытыми для атак с использованием инъекций?
Вы должны сопоставить переданный ввод с известным хорошим шаблоном.
Например, похоже, что IP-адрес может быть правильным вводом для вас. Таким образом, вы можете использовать что-то вроде этого:
Обратите внимание, что регулярное выражение не было проверено, вы несете ответственность за то, чтобы ваше регулярное выражение не позволяло ничего опасного.
источник