Выявление и устранение проблем безопасности в классе подтверждения подписки Ruby SNS

Обзор

В этом отчете тщательно изучены недостатки безопасности, обнаруженные во фрагменте кода Ruby для класса ConfirmSnsSubscription.

Уязвимость, связанная с удаленным выполнением кода (RCE), была в центре внимания проверки кода с целью выявления возможных проблем с безопасностью. В документе перечислены обнаруженные уязвимости, такие как плохая проверка ввода и небезопасная обработка URL, а также даны полезные советы по устранению этих проблем.

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

Уязвимый фрагмент кода

module Jobs

  class ConfirmSnsSubscription < ::Jobs::Base
    sidekiq_options retry: false

    def execute(args)
      return unless raw = args[:raw].presence
      return unless json = args[:json].presence
      return unless subscribe_url = json["SubscribeURL"].presence

      require "aws-sdk-sns"
      return unless Aws::SNS::MessageVerifier.new.authentic?(raw)

      # confirm subscription by visiting the URL
      open(subscribe_url)
    end

  end

end

Возможность удаленного выполнения кода (RCE) является недостатком во фрагменте кода. Эта уязвимость вызывается следующей строкой кода:

open(subscribe_url)

Без какой-либо проверки или очистки код просто открывается и переходит к subscribe_url. Злоумышленник может манипулировать опцией subscribe_url, чтобы она содержала вредоносный код или URL-адрес, указывающий на вредоносный сценарий. Сервер, на котором размещен этот фрагмент кода, может выполнить произвольный код, если для этого URL будет вызвана функция open.

Неавторизованные команды или вредоносные скрипты могут быть выполнены на сервере злоумышленником, использующим эту уязвимость, если аргумент subscribe_url не проверен и не очищен должным образом, что ставит под угрозу безопасность системы.

Выводы

  1. Отсутствие проверки ввода:
  • Входные данные, такие как subscribe_url, raw и json, не проходят необходимую проверку и очистку в коде. Это может привести к ряду проблем с безопасностью, таких как внедрение кода и выполнение вредоносных URL-адресов.

2. Уязвимость RCE:

  • Без какой-либо проверки или очистки открывается оператор open(subscribe_url) и обращается к subscribe_url. RCE может быть вызвано тем, что злоумышленник использует параметр subscribe_url для запуска произвольного кода на сервере.

3. Отсутствие обработки ошибок:

  • Нет средств для управления ошибками в коде. Код не будет обрабатываться правильно, если во время его выполнения произойдет ошибка, например проблема с сетью или URL с ошибкой, что может привести к сбоям или странному поведению.

4. Небезопасное использование зависимостей:

  • Aws::SNS::MessageVerifier импортируется из гема aws-sdk-sns без проверки целостности гема или указания конкретной версии гема. Использование старых или уязвимых зависимостей может привести к опасности.

Совместимое решение

Код должен надлежащим образом проверять и очищать аргумент subscribe_url, чтобы решить проблему и предотвратить удаленное выполнение кода (RCE). Вот код, который был изменен для устранения уязвимости:

require "open-uri"

module Jobs
  class ConfirmSnsSubscription < ::Jobs::Base
    sidekiq_options retry: false

    def execute(args)
      return unless raw = args[:raw].presence
      return unless json = args[:json].presence
      return unless subscribe_url = json["SubscribeURL"].presence

      require "aws-sdk-sns"
      return unless Aws::SNS::MessageVerifier.new.authentic?(raw)

      # Fixed: Validate and sanitize the subscribe_url before opening
      if safe_url?(subscribe_url)
        open(sanitize_url(subscribe_url))
      else
        raise "Invalid subscribe_url"
      end
    end

    private

    def safe_url?(url)
      # Implement URL validation logic here, e.g., using a whitelist approach
      # to allow only trusted and expected URLs.
      # Example validation logic:
      whitelist = ["https://trusted-example.com", "https://another-trusted-url.com"]
      whitelist.include?(url)
    end

    def sanitize_url(url)
      # Implement URL sanitization logic here, if required.
      # This step is to ensure the URL is safe and free from any potentially malicious parts.
      # You may use appropriate methods or libraries to sanitize the URL.
      url
    end
  end
end

В измененный код добавлена ​​новая функция safe_url? для обработки проверки URL. В этой функции должна быть реализована правильная логика для проверки subscribe_url по белому списку одобренных и ожидаемых URL-адресов. Это гарантирует, что будут доступны только безопасные URL-адреса.

Также доступна функция sanitize_url, если URL необходимо очистить. На этом этапе проверяется, не содержит ли URL-адрес каких-либо компонентов, которые могут быть опасными. Чтобы выполнить очистку URL-адресов, вы можете использовать соответствующие методы или платформы.

Эти изменения позволяют коду проверять и очищать аргумент subscribe_url, эффективно уменьшая уязвимость RCE, позволяя просматривать только надежные и безопасные URL-адреса.

Заключение

Поскольку входные данные не проверяются, а URL-адреса обрабатываются небезопасно, пример кода для класса ConfirmSnsSubscription имеет серьезные недостатки в системе безопасности, включая возможность удаленного выполнения кода (RCE).

Внедрение методов проверки ввода, очистки и безопасного кодирования имеет важное значение для решения этих проблем. Уровень безопасности кодовой базы будет улучшен за счет добавления функций обработки ошибок и сохранения зависимостей.

Чтобы гарантировать постоянную безопасность и уменьшить количество новых угроз, рекомендуется проводить регулярное тестирование и проверку безопасности.

Твиттер