V13.4.1 GraphQL
Requirement:#
Verify that a query allow list or a combination of depth limiting and amount limiting is used to prevent GraphQL or data layer expression Denial of Service (DoS) as a result of expensive, nested queries. For more advanced scenarios, query cost analysis should be used.
Explanation:#
Код часто работает с ограниченными ресурсами, поэтому программисты должны следить за тем, чтобы ресурсы не расходовались слишком быстро или слишком легко. Без использования квот, ограничений ресурсов или других механизмов защиты злоумышленник может легко потреблять много ресурсов, быстро выполняя множество запросов или вызывая использование большего количества ресурсов, чем необходимо. Когда выделено слишком много ресурсов или если один ресурс слишком велик, это может помешать правильной работе кода, что может привести к отказу в обслуживании.
Remediation:#
Чтобы устранить проблему предотвращения атак типа «отказ в обслуживании» (DoS) GraphQL или выражений уровня данных, можно предпринять следующие шаги:
- Реализуйте список разрешенных запросов, определяющий допустимые запросы GraphQL, которые могут выполняться клиентами. Это можно сделать, определив набор разрешенных запросов в файле конфигурации или в коде и отклонив любые запросы, которые не соответствуют разрешенному набору.
- Реализуйте ограничение глубины, чтобы ограничить максимальную глубину вложенных запросов. Это можно сделать, добавив проверку в серверный код, обрабатывающий запросы GraphQL, и отклонив любые запросы, превышающие максимально допустимую глубину.
- Реализуйте ограничение количества, чтобы ограничить количество элементов, которые могут быть возвращены в одном запросе. Это можно сделать, добавив проверку в серверный код, обрабатывающий запросы GraphQL, и отклонив любые запросы, которые превышают максимально допустимое количество элементов.
- Используйте анализ стоимости запроса, чтобы обнаруживать и отклонять запросы, требующие больших вычислительных затрат, например те, которые выполняют сложные вычисления или обращаются к большим объемам данных. Это можно сделать, внедрив калькулятор стоимости запроса, который анализирует вычислительную стоимость запроса и отклоняет любые запросы, которые превышают определенный порог.
- Регулярно проверяйте систему на наличие признаков больших объемов запросов или использования ресурсов и незамедлительно реагируйте на любые обнаруженные проблемы с производительностью.
- Рассмотрите возможность проведения регулярного тестирования на проникновение и оценки безопасности, чтобы выявить любые потенциальные уязвимости и обеспечить эффективность мер безопасности.
Вот пример кода на JavaScript, который реализует список разрешенных запросов и ограничение глубины на сервере GraphQL:
В этом примере сервер GraphQL создается с использованием библиотеки graphql-yoga, а список разрешенных запросов реализуется путем проверки количества полей, выбранных в запросе. Если количество выбранных полей превышает определенный порог, запрос отклоняется с сообщением об ошибке. Это помогает предотвратить атаки типа «отказ в обслуживании», которые могут быть результатом дорогостоящих вложенных запросов.
Additional:#
CWE - CWE-770: Allocation of Resources Without Limits or Throttling (4.10) (mitre.org)