Как предотвратить уязвимости впрыска кода в приложениях без сердца (2 часть серии)
Эта статья Часть 2 серии. Вот, я собираюсь объяснить Как защитить приложения без сервера от нагрузочных атак с использованием брандмауэров AWS Web Application (WAF) Отказ
В Часть 1 Я представил Serverlessgoat, намеренно уязвимый Mersebless MS-Word .doc. к текстовому преобразователю службы. Я объяснил, как использовать свою уязвимость в инъекции кода и как исправить уязвимость, заменяя вызов инструмента командной строки кот С соответствующей библиотекой JS для загрузки документа MS-Word. Кроме того, я вскоре представил входную проверку данных с деналистами, то есть исключая входные данные, которые содержат определенные символы или соответствуют определенному формату, а также allowlists, то есть только позволяя вводам с определенным форматом или входом, который соответствует элементу в данном списке констант. Давайте погрузимся в то, как AWS WAF может помочь нам реализовать разрешение/деналисты для входной проверки!
Если вы пропустили на Часть 1, не стесняйтесь догнать Действительно
Входная проверка с использованием AWS WAF
Проверка ввода может быть реализована в функции без сервеса непосредственно — и должно быть в соответствии с Безопасность лучших практик . Тем не менее, неверные инфраструктуры часто содержат множество различных функций, которые могут получить прибыль от аналогичной проверки ввода, в этом случае имеет смысл использовать центральную точку для дополнительной предварительной санитации.
К счастью, с веб-приложениями брандмауэры (WAF) AWS предлагает средство для проведения входной проверки для нескольких функций даже до того, как они вообще будут вызывать. WAFS могут быть прикреплены к шлюзам API и балансировщики нагрузки и уже позволяют использовать Предварительно настроенные правила для OwASP Top-Ten Как описано в соответствующие белые стороны Отказ
Реализация денилиста с AWS WAF
Использование WAF, он прятен, чтобы реализовать базовый денилистический подход и прикрепить его к шлюзу API Serverlessgoat. Спецификации WAF могут быть созданы с консолью AWS, CLI и API. Ради простоты, я собираюсь объяснить, как настроить WAF в консоли AWS. Это позволяет проще тестировать и воспроизводить с WAF, используя правильный графический интерфейс пользователя.
После Развертывание приложения Serverlessgoat Давайте будем следовать за Документация Чтобы настроить список контроля доступа (ACL) для WAF в созданном шлюзе API. Как и в традиционных брандмауэрах, ACLS — это списки, которые позволяют/предотвратить доступ к конкретным источникам к конкретным активам на основе правил.
Шаг 1: Откройте консоль шлюза API для Serverless-коз API -> Перейти к Этапы -> Открыто Прод Этап -> Создать новый Web acl.
Шаг 2: В консоли Web ACL, нажмите Создать веб ACL. Заполните метаданные для ACL и нажмите Добавить ресурсы AWS.
Шаг 3: Выберите Прод и Этап Этапы Serverless-коз API Gateway -> Нажмите Добавить -> нажимать Следующий Чтобы добавить правила к ACL
Шаг 4: В Добавить правила и группы правил Просмотр, нажмите на Добавьте правила а затем выберите Добавьте свои собственные правила и группы правил
Шаг 5: Используйте редактор визуального правила, чтобы создать правило, которое применяется, если символ SEMICOLON (;) содержится в Document_url Параметр query String -> Так как мы строим денилисты, обязательно блокируйте запрос, если правило применяется -> Добавить правило
Шаг 6: Обязательно разрешите все запросы, которые не соответствуют никаким правилам! Мы хотим исключить только запросы, где Document_url Параметр query String содержит точку с запятой. -> Нажмите Далее -> Далее -> Далее -> Создайте веб-ACL
AWS займет некоторое время, чтобы настроить ACL и прикрепить его к этапам Gateway API. После завершения создания мы можем проверить, ведет ли наш денилист как ожидаемый.
Просмотрите Прод Сценический вид Serverless-коз API Gateway. Теперь вы можете увидеть правильно назначенный на сцену ACL. Развернуть /api/convert Конечная точка для получения URL конечной точки сцены:
Используя этот URL, теперь мы можем проверить наш денилист. Если мы предлагаем действительный документ MS-Word для Document_url Параметр, мы вернемся в содержащийся текст как открытый текст:
Пытаясь напасть на коз с https://foobar; Cat/etc/passwd # сейчас приводит к Запрещено Как наш WAF успешно обнаружил, что полуконный символ Semicolon Char в входном параметре:
Ловушки денилистов
Мы уверены сейчас? НЕТ! 😦 Мы только что помешали конкретной атаке, где команды приковываются с запятой. Тем не менее, Bash по крайней мере позволяет кучу других возможных решений для цепи и впрыскивания дополнительных команд в команду OS E.G., используя && или
Если мы сейчас предложим https://www.puresec.io/hubfs/document.doc >/dev/null && cat/etc/passwd # как Document_url, Где мы выбрасываем вывод команды Curl, направляя его на /dev/null а затем цепь вызовы кот с && (и) Оператор, мы все еще можем использовать уязвимость команды для чтения /etc/passwd :
Это сводится к общей проблеме с деналистами: очень сложно придумать все возможные проблемные входы и специфически отфильтровывать запросы, которые содержат их. Почти гарантировано, что злоумышленник сможет найти правильный вклад, который обходит правила денилиста с использованием конкретных публично доступных инструментов перечисления. Но как правильно подтвердить ввод? Использовать allowlists Чтобы разрешить только очень конкретные форматы ввода и отрицать все остальное!
Реализация AllowList с AWS WAF
Реализация позжелистов с WAF так проста, как реализация денилистов. Для нашего AllowList мы хотим придумать шаблон, который является как можно более конкретно, чтобы соответствовать только правильному входному документу. Давайте, следовательно, создайте регулярное выражение, чтобы соответствовать действительному document_url.
Для этого мы снова открываем AWS Firewall Manager -> Выберите Наборы рисунка Regex Просмотр -> Нажмите Создать набор шаблонов Regex
Теперь мы создаем регулярное выражение в нашем регионе, который соответствует только URL-адресам, начиная с http (ы), заканчивая .doc, И ничто, кроме как между простой словами и скользями ( /). Таким образом, мы особенно помешаем злоумышленнику добавлять любой поддельный ввод до, после, или между предоставленным URL-адресом:
Теперь мы хотим добавить ранее созданное регулярное выражение в качестве фильтра для нашего ACL:
Перейти к Правила Tab -> Добавьте правила -> Добавьте свои собственные правила и группы правил
Настройка похожа на шаге 5. На этот раз, однако, мы используем наше ранее созданное регулярное выражение в качестве сопоставления:
Помните, мы строим allowlist. Таким образом, убедитесь, что на этот раз, чтобы разрешить запросы, где Document_url Параметр запроса соответствует этому правилу.
Чтобы завершить доработку AllowList, теперь мы должны убедиться, что наше ранее созданное правило от денилиста больше не активно и мы разрешаем только запросы, которые соответствуют нашим вновь созданным Allow_valid_urls правило. Поэтому после создания нового правила удалите старый Deny_command_chaining правило и установить Действие по умолчанию Web ACL для запросов, которые не соответствуют никаких правилах к Блокировать.
Раздел правила нашего ACL теперь должен выглядеть так:
Поскольку мы отредактировали существующие ACL, которые уже связаны с нашим шлюзом API, нам не нужно проводить дополнительные шаги. Давайте проверим наш AllowList:
Как мы видим, ни одна из наших атак больше не работает, и мы все еще можем использовать услугу с действительным Document_url Отказ 👍.
Мы уверены сейчас? Ну, Serverlessgoat имеет довольно еще несколько вопросов, ожидающих исправления — по крайней мере, мы закрепили наше приложение от атаки командной инъекции! 🛡.
Имейте в виду, однако: реалистичные приложения гораздо сложнее пропустить, и вы никогда не можете быть уверены, что ваш WAF ограничивает фантазированные данные для течения к вашей функции через каждый возможный канал. Следовательно, в дополнение к WAF, никогда не доверяйте входам в ваши функции лямбда и внедряйте дополнительные измерения счетчика в вашем коде!
Исправление уязвимости — одно. Но как его найти в первую очередь?
Мы развиваем CodeSeeShield Чтобы помочь разработчикам найти и исправлять уязвимости в приложениях без сервеса. Проверьте наш Тур продукта Чтобы попробовать это сами!
О
Мануэль Бенц соучредитель CodeSeeShield , новый инструмент статического тестирования статического обеспечения, ориентированного на углубленный анализ программы архитектуры микросервиса и серверу серверов. Перед началом начала Мануэль работал исследователем по комбинациям статического и динамического анализа программы для обнаружения уязвимости в группе безопасных программных программ в университете Paderborn. Мануэль все еще активно поддерживает SOOT STATATION PROSTAL PROSTAL ANALLYSTED Framework для Java Отказ
Как предотвратить уязвимости впрыска кода в приложениях без сердца (2 часть серии)
Оригинал: «https://dev.to/mbenz89/how-to-prevent-code-injection-vulnerabilities-in-serverless-applications-part-2-2-j5k»