Intereting Posts
расширение командной строки переименования команд Является ли «Арифметическое расширение» ожидаемым действием на vars внутри `[[` tests? как начать графический режим пользовательского интерфейса в oracle linux 7.2 Иногда водитель загружается, иногда Обмен секретными ключами на машинах Эквивалент даты – ссылка в Solaris Не удалось обновить мою систему Ubuntu13.04: Получение сообщения – требуется установка ненадежных пакетов Разный раздел после обновления OPENWRT VNC с хост-компьютера на Android-телефон под управлением Ubuntu Не удается загрузить тестирование Debian после обновления визуальный режим в vi для удаления символа в конце нескольких строк Могу ли я увеличить яркость текста в оболочке Arch? Возможно ли эффективное развитие андроида на vim? Как определить, где исполняемый файл выполняет поиск общей библиотеки? переносная команда для распаковки и распаковки без GNU и старого unix

Избегайте внедрения команд с помощью system () api

У нас есть унаследованный код C, который позволяет менее привилегированным пользователям запускать пользовательские сценарии с повышенными привилегиями. Здесь установлен бит SUID. Этот код ограничивает окружение PATH определенной папкой, а затем использует system() api для выполнения сценария с ограниченной оболочкой:

 /bin/bash -r -c "script " 

Поскольку путь ограничен, он может выполнять только сценарии из этой конкретной папки.

Теперь, зная все подводные камни для внедрения команд с помощью system() api, какие меры можно предпринять, чтобы избежать внедрения команд? Это используется во многих местах в различных сценариях и т. Д., Поэтому мы не хотим делать совершенно новую реализацию, чтобы избежать регрессии.

Поскольку это трудно сделать правильно, я бы предложил удалить SUID в вашем коде. Измените свой код C, чтобы использовать sudo . С помощью sudo выполняются более сложные аспекты обеспечения безопасного системного программирования.

Затем вы можете аккуратно сконструировать конфигурацию sudo, используя visudo, которая выполняет минимум, необходимый для выполнения задачи, и ограничивает его необходимыми пользователями / группами. После настройки sudo попросите кого-нибудь, кроме вас, протестировать его и попытаться нарушить предполагаемые ограничения.

Внедрение кода требует от пользователя возможности передавать произвольные строки в качестве параметров в вызов system() . Это очень похоже на SQL-инъекции, и его следует избегать аналогичным образом: не передавайте пользовательскую строку непосредственно в вызов:

  • числовые параметры должны быть преобразованы в целые числа, а затем преобразованы обратно в строки во время вызова

  • параметры, которые принадлежат фиксированному словарю, должны быть преобразованы в значения enum или аналогичные, а затем обратно в строки во время вызова

  • ввод произвольного текста должен быть ограничен безобидным набором символов, где это возможно (например, [a-zA-Z0-9]* ). Там, где требуются проблемные символы (включая пробел), следует применять правильное экранирование (то есть ab следует заменить на a\ b и т. Д.)