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

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

 /bin/bash -r -c "script " 

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

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

2 Solutions collect form web for “Избегайте внедрения команд с помощью system () api”

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

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

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

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

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

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

  • команда du показывает разные результаты, чем st_blocks
  • Каждый процесс считается нитью?
  • Пользовательский протокол уровня ссылки в UNIX
  • Как проверить правильность установки FFTW?
  • Не работает системный вызов «открытый» режим
  • Как я могу связать свою программу C с библиотекой Arb?
  • Компиляция g ++ из исходного кода приводит к повреждению стандартной библиотеки. error: ':: realloc' не был объявлен
  • Кейт против VIM / Emacs относительно скорости
  • Как использовать STL в unix и linux?
  • Лимит принятия Linux для разработчика .NET
  • crc8 undefined при компиляции модуля ядра Linux на Beaglebone black / Debian
  • Interesting Posts

    Как установить путь unix при первом запуске компьютера?

    zypper, как установить пакет в локальный каталог ~ / bin

    Какова точка режима виртуальной замены в Vim?

    Linux Mint 18 удаляет /etc/init.d/xorg.conf при каждой перезагрузке и не запускает x-сервер

    Есть ли способ сделать фильтрацию 7 уровня в Linux?

    Инструмент командной строки для поиска и замены многострочного регулярного выражения

    Доступ к передаче закрыт

    Лучший способ запуска одиночного цикла вместо двух для циклов

    Как я могу проверить RUNLEVEL из сценария bash на Rasbpian?

    Grub2 – загрузочный Linux с бесконечной символической ссылкой

    Простой сценарий оболочки Korn должен содержать список всех файлов, созданных / измененных после tidemark date

    Невозможно FTP в экземпляр Google Compute Engine с помощью Debian

    Добавление двух стандартных шлюзов в файл интерфейсов Debian

    Завершение вкладки не работает для аргументов, когда команда является псевдонимом

    Что такое регулярное выражение для проверки пользователей Linux?

    Linux и Unix - лучшая ОС в мире.