Избегайте внедрения команд с помощью 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 и т. Д.)

  • Есть ли способ зеркалировать выходы USB?
  • Не удалось выполнить скомпилированную программу C
  • Как скомпилировать программу ac, не выходя из редактора?
  • Вычислить общее использование ЦП в пространстве имен ПИД
  • Могу ли я работать с Sql Server, Office и C # с помощью Linux?
  • Не работает системный вызов «открытый» режим
  • Реализуются ли потоки как процессы в Linux?
  • Как установить последнюю стабильную версию GCC в Linux Mint?
  • Поиск зависимостей для скомпилированной программы на C ++
  • -fPIC Флаг в масштабе всей системы?
  • Как я могу скомпилировать minix при внесении изменений в библиотеки
  • Linux и Unix - лучшая ОС в мире.