Дальнейшие шаги
По своей природе OWASP Top 10 ограничен десятью наиболее значимыми рисками. Каждый выпуск OWASP Top 10 содержит риски «на грани», которые долго рассматривались для включения, но в итоге не попали в список. Другие риски оказались более распространёнными и значимыми.
Следующие два вопроса заслуживают усилий по идентификации и устранению — как для организаций, развивающих зрелую программу AppSec, так и для консультантов по безопасности или поставщиков инструментов, желающих расширить охват своих предложений.
X01:2025 Недостаточная устойчивость приложений
Общие сведения.
Это переименование категории «Отказ в обслуживании» из 2021 года. Переименование обусловлено тем, что прежнее название описывало симптом, а не первопричину. Данная категория охватывает CWE, описывающие уязвимости, связанные с проблемами устойчивости. Оценка данной категории была очень близка к A10:2025-Некорректная обработка исключительных ситуаций. Соответствующие CWE: CWE-400 Неконтролируемое потребление ресурсов, CWE-409 Ненадлежащая обработка сильно сжатых данных (усиление данных), CWE-674 Неконтролируемая рекурсия и CWE-835 Цикл с недостижимым условием выхода ('Бесконечный цикл').
Таблица оценок.
| Число CWE | Макс. частота встречаемости | Ср. частота встречаемости | Макс. охват | Ср. охват | Ср. взвешенная эксплуатируемость | Ср. взвешенное воздействие | Общее число встречаемостей | Общее число CVE |
| 16 | 20,05% | 4,55% | 86,01% | 41,47% | 7,92 | 3,49 | 865 066 | 4 423 |
Описание.
Данная категория представляет системную уязвимость в том, как приложения реагируют на нагрузку, сбои и граничные случаи, из которых оно не может восстановиться. Когда приложение не обрабатывает корректно, не выдерживает или не восстанавливается после неожиданных условий, ограничений ресурсов и других неблагоприятных событий, это легко приводит к проблемам доступности (наиболее распространённым), а также к повреждению данных, раскрытию конфиденциальных данных, каскадным сбоям и/или обходу средств контроля безопасности.
Кроме того, X02:2025 Сбои управления памятью также могут привести к сбою приложения или всей системы.
Как предотвратить
Для предотвращения этого типа уязвимостей необходимо проектировать системы с учётом возможности сбоев и восстановления.
- Добавляйте ограничения, квоты и функциональность аварийного переключения, уделяя особое внимание наиболее ресурсоёмким операциям.
- Идентифицируйте ресурсоёмкие страницы и планируйте заранее: сокращайте поверхность атаки, не открывая доступ для неизвестных или ненадёжных пользователей к ненужным «гаджетам» и функциям, требующим большого количества ресурсов (ЦП, памяти).
- Выполняйте строгую проверку входных данных с использованием списков разрешённых значений и ограничений размера, затем тщательно тестируйте.
- Ограничивайте размеры ответов и никогда не отправляйте клиенту необработанные ответы (обрабатывайте на стороне сервера).
- Устанавливайте безопасное/закрытое состояние по умолчанию (никогда открытое), отказывайте по умолчанию и выполняйте откат при ошибке.
- Избегайте блокирующих синхронных вызовов в потоках запросов (используйте асинхронные/неблокирующие подходы, устанавливайте таймауты, ограничения конкурентности и т.д.).
- Тщательно тестируйте функциональность обработки ошибок.
- Реализуйте паттерны устойчивости: автоматические выключатели (circuit breakers), переборки (bulkheads), логику повторных попыток и корректную деградацию.
- Проводите производительное и нагрузочное тестирование; добавьте хаос-инжиниринг, если готовы к такому риску.
- Реализуйте и проектируйте избыточность там, где это разумно и доступно.
- Реализуйте мониторинг, наблюдаемость и оповещение.
- Фильтруйте недопустимые адреса отправителей в соответствии с RFC 2267.
- Блокируйте известные ботнеты по отпечаткам, IP-адресам или динамически по поведению.
- Доказательство работы (Proof-of-Work): инициируйте ресурсоёмкие операции на стороне злоумышленника, которые не оказывают большого влияния на обычных пользователей, но влияют на ботов, пытающихся отправлять огромное количество запросов. Усложняйте Proof-of-Work при повышении общей нагрузки на систему, особенно для менее доверенных систем или кажущихся ботами.
- Ограничивайте время серверной сессии на основе бездействия и финального таймаута.
- Ограничивайте хранилище информации, привязанной к сессии.
Примеры сценариев атак.
Сценарий №1: Злоумышленники намеренно потребляют ресурсы приложения для провокации сбоев в системе, что приводит к отказу в обслуживании. Это может быть исчерпание памяти, заполнение дискового пространства, насыщение ЦП или открытие бесконечных соединений.
Сценарий №2: Фаззинг входных данных, приводящий к сформированным ответам, нарушающим бизнес-логику приложения.
Сценарий №3: Злоумышленники атакуют зависимости приложения, выводя из строя API или другие внешние сервисы, и приложение не может продолжать работу.
Ссылки.
- OWASP Cheat Sheet: Denial of Service
- OWASP MASVS‑RESILIENCE
- ASP.NET Core Best Practices (Microsoft)
- Resilience in Microservices: Bulkhead vs Circuit Breaker (Parser)
- Bulkhead Pattern (Geeks for Geeks)
- NIST Cybersecurity Framework (CSF)
- Avoid Blocking Calls: Go Async in Java (Devlane)
Список связанных CWE
- CWE-73 External Control of File Name or Path
- CWE-183 Permissive List of Allowed Inputs
- CWE-256 Plaintext Storage of a Password
- CWE-266 Incorrect Privilege Assignment
- CWE-269 Improper Privilege Management
- CWE-286 Incorrect User Management
- CWE-311 Missing Encryption of Sensitive Data
- CWE-312 Cleartext Storage of Sensitive Information
- CWE-313 Cleartext Storage in a File or on Disk
- CWE-316 Cleartext Storage of Sensitive Information in Memory
- CWE-362 Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
- CWE-382 J2EE Bad Practices: Use of System.exit()
- CWE-419 Unprotected Primary Channel
- CWE-434 Unrestricted Upload of File with Dangerous Type
- CWE-436 Interpretation Conflict
- CWE-444 Inconsistent Interpretation of HTTP Requests ('HTTP Request/Response Smuggling')
- CWE-451 User Interface (UI) Misrepresentation of Critical Information
- CWE-454 External Initialization of Trusted Variables or Data Stores
- CWE-472 External Control of Assumed-Immutable Web Parameter
- CWE-501 Trust Boundary Violation
- CWE-522 Insufficiently Protected Credentials
- CWE-525 Use of Web Browser Cache Containing Sensitive Information
- CWE-539 Use of Persistent Cookies Containing Sensitive Information
- CWE-598 Use of GET Request Method With Sensitive Query Strings
- CWE-602 Client-Side Enforcement of Server-Side Security
- CWE-628 Function Call with Incorrectly Specified Arguments
- CWE-642 External Control of Critical State Data
- CWE-646 Reliance on File Name or Extension of Externally-Supplied File
- CWE-653 Improper Isolation or Compartmentalization
- CWE-656 Reliance on Security Through Obscurity
- CWE-657 Violation of Secure Design Principles
- CWE-676 Use of Potentially Dangerous Function
- CWE-693 Protection Mechanism Failure
- CWE-799 Improper Control of Interaction Frequency
- CWE-807 Reliance on Untrusted Inputs in a Security Decision
- CWE-841 Improper Enforcement of Behavioral Workflow
- CWE-1021 Improper Restriction of Rendered UI Layers or Frames
- CWE-1022 Use of Web Link to Untrusted Target with window.opener Access
- CWE-1125 Excessive Attack Surface
X02:2025 Сбои управления памятью
Общие сведения.
Языки Java, C#, JavaScript/TypeScript (node.js), Go и «безопасный» Rust являются памятобезопасными. Проблемы управления памятью, как правило, возникают в непамятобезопасных языках, таких как C и C++. Эта категория получила наименьшую оценку в опросе сообщества и низкую оценку в данных, несмотря на третье место по числу связанных CVE. Мы считаем, что это обусловлено преобладанием веб-приложений над традиционными настольными. Уязвимости управления памятью нередко имеют наибольшие оценки CVSS.
Таблица оценок.
| Число CWE | Макс. частота встречаемости | Ср. частота встречаемости | Макс. охват | Ср. охват | Ср. взвешенная эксплуатируемость | Ср. взвешенное воздействие | Общее число встречаемостей | Общее число CVE |
| 24 | 2,96% | 1,13% | 55,62% | 28,45% | 6,75 | 4,82 | 220 414 | 30 978 |
Описание.
Когда приложение вынуждено самостоятельно управлять памятью, очень легко допустить ошибки. Памятобезопасные языки используются всё чаще, однако по всему миру по-прежнему работает множество устаревших систем, создаются новые низкоуровневые системы, требующие непамятобезопасных языков, а веб-приложения взаимодействуют с мейнфреймами, устройствами IoT, прошивками и другими системами, которые могут быть вынуждены управлять собственной памятью. Типичные CWE: CWE-120 Копирование буфера без проверки размера входных данных ('Классическое переполнение буфера') и CWE-121 Переполнение стекового буфера.
Сбои управления памятью могут происходить при:
- Недостаточном выделении памяти для переменной.
- Отсутствии проверки входных данных, вызывающей переполнение кучи, стека или буфера.
- Хранении значения данных, превышающего максимум для типа переменной.
- Попытке использования невыделенной памяти или адресных пространств.
- Ошибках «на один» (счёт с 1 вместо 0).
- Попытке доступа к объекту после его освобождения.
- Использовании неинициализированных переменных.
- Утечках памяти или ином исчерпании доступной памяти до сбоя приложения.
Сбои управления памятью могут привести к сбою приложения или всей системы, см. также X01:2025 Недостаточная устойчивость приложений.
Как предотвратить.
Лучший способ предотвращения сбоев управления памятью — использовать памятобезопасный язык. Примеры: Rust, Java, Go, C#, Python, Swift, Kotlin, JavaScript и т.д. При создании новых приложений постарайтесь убедить организацию в том, что кривая обучения оправдывает переход на памятобезопасный язык. При полном рефакторинге добивайтесь переписывания на памятобезопасном языке, когда это возможно и целесообразно.
Если использование памятобезопасного языка невозможно:
- Включите следующие функции сервера, затрудняющие эксплуатацию ошибок управления памятью: рандомизация адресного пространства (ASLR), защита от выполнения данных (DEP) и защита от перезаписи обработчиков структурированных исключений (SEHOP).
- Отслеживайте утечки памяти в приложении.
- Очень тщательно проверяйте все входные данные системы и отклоняйте всё, что не соответствует ожиданиям.
- Изучите используемый язык и составьте список небезопасных и более безопасных функций, затем поделитесь этим списком со всей командой. По возможности включите его в руководство по безопасному кодированию. Например, в C предпочтительнее strncpy() перед strcpy() и strncat() перед strcat().
- Если язык или фреймворк предлагает библиотеки для безопасной работы с памятью — используйте их. Например: Safestringlib или SafeStr.
- Используйте управляемые буферы и строки вместо сырых массивов и указателей везде, где это возможно.
- Пройдите обучение безопасному кодированию с акцентом на проблемы памяти и/или выбранный язык.
- Выполняйте ревью кода и/или статический анализ.
- Используйте инструменты компилятора для управления памятью, такие как StackShield, StackGuard и Libsafe.
- Проводите фаззинг всех входных данных системы.
- При тестировании на проникновение сообщите тестировщику об обеспокоенности проблемами управления памятью и попросите уделить им особое внимание.
- Исправляйте все ошибки компилятора и предупреждения. Не игнорируйте предупреждения, если программа компилируется.
- Убедитесь, что базовая инфраструктура регулярно обновляется, сканируется и укрепляется.
- Специально мониторируйте базовую инфраструктуру на предмет потенциальных уязвимостей памяти и других сбоев.
- Рассмотрите использование канареек для защиты стека адресов от атак переполнения.
Примеры сценариев атак.
Сценарий №1: Переполнения буфера — наиболее известная уязвимость памяти: ситуация, когда злоумышленник передаёт в поле больше информации, чем оно может принять, что приводит к переполнению буфера для базовой переменной. При успешной атаке символы переполнения перезаписывают указатель стека, позволяя злоумышленнику вставить вредоносные инструкции в программу.
Сценарий №2: Use-After-Free (UAF) встречается достаточно часто, чтобы быть распространённой заявкой в программах bug bounty браузеров. Злоумышленник создаёт JavaScript-нагрузку, управляющую DOM-элементами. Через тщательную манипуляцию он заставляет браузер освободить память объекта, сохраняя при этом висячий указатель. До того как браузер осознаёт освобождение памяти, злоумышленник выделяет новый объект, занимающий то же пространство памяти. Когда браузер пытается использовать исходный указатель, он теперь указывает на данные под управлением злоумышленника. Если этот указатель указывал на таблицу виртуальных функций, злоумышленник может перенаправить выполнение кода на свою нагрузку.
Сценарий №3: Сетевой сервис, принимающий пользовательский ввод, не проверяет и не обеззараживает его, а затем передаёт напрямую в функцию журналирования. Ввод пользователя передаётся как syslog(user_input) вместо syslog("%s", user_input), не задавая формат. Злоумышленник отправляет вредоносные нагрузки со спецификаторами формата, такими как %x для чтения памяти стека или %n для записи по адресам памяти. Это уязвимость форматной строки (неконтролируемый формат строки).
Примечание: современные браузеры используют многоуровневую защиту, включая песочницу браузера, ASLR, DEP/NX, RELRO и PIE. Атака с использованием сбоя управления памятью на браузер — непростая задача.
Ссылки.
- OWASP community pages: Memory leak, Doubly freeing memory, & Buffer Overflow
- Awesome Fuzzing: a list of fuzzing resources
- Project Zero Blog
- Microsoft MSRC Blog
Список связанных CWE
- CWE-14 Compiler Removal of Code to Clear Buffers
- CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer
- CWE-120 Buffer Copy without Checking Size of Input ('Classic Buffer Overflow')
- CWE-121 Stack-based Buffer Overflow
- CWE-122 Heap-based Buffer Overflow
- CWE-124 Buffer Underwrite ('Buffer Underflow')
- CWE-125 Out-of-bounds Read
- CWE-126 Buffer Over-read
- CWE-190 Integer Overflow or Wraparound
- CWE-191 Integer Underflow (Wrap or Wraparound)
- CWE-196 Unsigned to Signed Conversion Error
- CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition
- CWE-415 Double Free
- CWE-416 Use After Free
- CWE-457 Use of Uninitialized Variable
- CWE-459 Incomplete Cleanup
- CWE-467 Use of sizeof() on a Pointer Type
- CWE-787 Out-of-bounds Write
- CWE-788 Access of Memory Location After End of Buffer
- CWE-824 Access of Uninitialized Pointer
X03:2025 Неуместное доверие к коду, сгенерированному ИИ («Вайб-кодинг»)
Общие сведения.
Сейчас весь мир говорит об ИИ и использует его — и разработчики программного обеспечения не исключение. Хотя на сегодняшний день нет CVE или CWE, связанных с кодом, сгенерированным ИИ, хорошо известно и задокументировано, что такой код нередко содержит больше уязвимостей, чем код, написанный людьми.
Описание.
Мы наблюдаем изменение практик разработки программного обеспечения: теперь это включает не только код, написанный с помощью ИИ, но и код, созданный и зафиксированный почти без участия человека (нередко называемый «вайб-кодингом»). Подобно тому как никогда не было хорошей идеей копировать фрагменты кода из блогов или сайтов без обдумывания, в данном случае проблема усугубляется. Хорошие и безопасные фрагменты кода всегда были редкостью и могут статистически игнорироваться ИИ из-за системных ограничений.
Как предотвратить.
Мы настоятельно рекомендуем всем, кто пишет код, учитывать следующее при использовании ИИ:
- Вы должны быть способны читать и полностью понимать весь код, который вы отправляете, даже если он написан ИИ или скопирован с онлайн-форума. Вы несёте ответственность за весь код, который вы коммитите.
- Тщательно проверяйте весь код с помощью ИИ на уязвимости — в идеале своими глазами и с использованием инструментов безопасности, предназначенных для этой цели (например, статического анализа). Рассмотрите использование классических методик ревью кода, описанных в OWASP Cheat Sheet Series: Secure Code Review.
- В идеале пишите собственный код, позволяйте ИИ предлагать улучшения, проверяйте код ИИ и позволяйте ИИ вносить исправления до тех пор, пока вы не будете удовлетворены результатом.
- Рассмотрите использование RAG-сервера (Retrieval Augmented Generation) с собственными собранными и проверенными безопасными примерами кода и документацией, такой как руководства, стандарты или политики безопасного кодирования вашей организации, и настройте RAG-сервер на соблюдение политик или стандартов.
- Рассмотрите приобретение инструментов, реализующих ограждения для конфиденциальности и безопасности при использовании выбранного ИИ.
- Рассмотрите приобретение частного ИИ, в идеале с договорным соглашением (включая соглашение о конфиденциальности) о том, что ИИ не будет обучаться на данных, запросах, коде или любой другой конфиденциальной информации вашей организации.
- Рассмотрите внедрение сервера Model Context Protocol (MCP) между IDE и ИИ и настройте его на принудительное использование выбранных инструментов безопасности.
- Реализуйте политики и процессы как часть SDLC для информирования разработчиков (и всех сотрудников) о том, как они должны и не должны использовать ИИ в вашей организации.
- Создайте список эффективных промптов, учитывающих лучшие практики безопасности ИТ. В идеале они должны также учитывать внутренние руководства по безопасному кодированию. Разработчики могут использовать эти промпты как отправную точку для своих программ.
- ИИ, вероятно, станет частью каждой фазы жизненного цикла разработки системы — как с точки зрения эффективного, так и безопасного использования. Используйте его мудро.
- На самом деле не рекомендуется использовать вайб-кодинг для сложных функций, бизнес-критичных программ или программ, используемых длительное время.
- Внедряйте технические проверки и защиту против использования теневого ИИ.
- Обучайте разработчиков своим политикам, а также безопасному использованию ИИ и лучшим практикам применения ИИ в разработке программного обеспечения.
Ссылки.
Список связанных CWE
-нет-