﻿# OWASP Top 10 2025 — от кода к цепочке поставок: расширение границ безопасности

Разбираем изменения в OWASP Top 10 версии 2025 года на примерах и рассматриваем, как SAST может помочь избежать уязвимостей\.

![1343_OWASP_top_ten_2025_ru/image1.png](https://import.viva64.com/docx/blog/1343_OWASP_top_ten_2025_ru/image1.png)

OWASP Top 10 — это список десяти наиболее опасных угроз безопасности веб\-приложений\. Он служит ориентиром для разработчиков, архитекторов и специалистов по информационной безопасности, помогая сосредоточиться на самых критических рисках при создании веб\-приложений\.

С момента выхода предыдущей версии списка в 2021 году ландшафт угроз существенно изменился, и в 2025 году OWASP представил его обновлённую редакцию: [OWASP Top 10:2025](https://owasp.org/Top10/2025/)\.

В этой статье мы рассмотрим новые категории уязвимостей из обновлённого списка и покажем, как некоторые из этих угроз можно выявить с помощью статического анализатора PVS\-Studio\. Для OWASP, кстати, у нас есть отдельная категория диагностических правил\. Подробнее об этом можно прочитать [в нашей документации](https://pvs-studio.ru/ru/docs/manual/6536/)\.

О предыдущей версии OWASP Top 10 \(2021\) мы уже писали — ознакомиться со статьёй [можно по этой ссылке](https://pvs-studio.ru/ru/blog/posts/java/1287/)\.

## Что поменялось?

Как и было сказано ранее, OWASP Top 10 обновляется не только ради новизны — изменения в списке отражают эволюцию реальных угроз\. По сравнению с версией 2021 года новый перечень не только сохранил большинство категорий, но также существенно переработал их приоритеты и внёс две новые: [A03:2025 Software Supply Chain Failures](https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/) и [A10:2025 Mishandling of Exceptional Conditions](https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/)\.

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

## A01: Broken Access Control

[Данная категория](https://owasp.org/Top10/2025/A01_2025-Broken_Access_Control/) объединяет в себе уязвимости, приводящие к несанкционированному раскрытию информации, изменению или уничтожению всех данных или выполнению бизнес\-функций за пределами полномочий пользователя\.

В OWASP Top 10:2025 эта категория дополнительно включает риски, ранее выделенные как Server\-Side Request Forgery \(SSRF\) — в предыдущей версии \(2021\) SSRF [занимала отдельную позицию A10](https://owasp.org/Top10/2021/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/)\. Такое объединение подчёркивает общую природу этих угроз: неконтролируемый доступ к ресурсам, будь то внутренние файлы, сетевые сервисы или данные других пользователей\.

Broken Access Control по\-прежнему остаётся на первом месте, что подтверждает: ошибки контроля доступа — одна из самых критичных и распространённых проблем в современных веб\-приложениях\.

Например, вот такой фрагмент кода из проекта [Power\-Fx](https://github.com/microsoft/Power-Fx):

```cpp
public static void Check(Engine engine, string pathInput)
{
  EngineSchema schema;
  if (pathInput != null)
  {
    var json = File.ReadAllText(pathInput);
    schema = JsonSerializer.Deserialize<EngineSchema>(json);
  }
  ....
}
```

Предупреждение PVS\-Studio: [V5609](https://pvs-studio.ru/ru/docs/warnings/v5609/) Possible path traversal vulnerability\. Potentially tainted data from the 'pathInput' variable is used as path\. 

Здесь путь к файлу передаётся напрямую от пользователя через параметр `pathInput`, проходит только проверку на `null` и сразу используется для чтения файла\. Это классическая [path traversal](https://pvs-studio.ru/ru/blog/terms/6470/)\-уязвимость: злоумышленник может передать значение вроде `../../../etc/passwd` и получить несанкционированный доступ к произвольным файлам на сервере\.

Проблемы Broken Access Control не ограничиваются только файловой системой\. Они также возникают, например, и на уровне логики авторизации\.

Так, в Spring метод `vote` из [`AccessDecisionVoter`](https://docs.spring.io/spring-security/site/docs/4.2.x/apidocs/org/springframework/security/access/AccessDecisionVoter.html) можно реализовать следующим образом:

```cpp
@Override
public int vote(Authentication authentication, 
                FilterInvocation filterInvocation, 
                Collection<ConfigAttribute> attributes) {
  boolean isAdmin = hasAdminRole(authentication);
  String requestMethod = filterInvocation.getRequest().getMethod();
  if ("DELETE".equals(requestMethod) && !isAdmin) {
    return ACCESS_GRANTED;
  }
  return ACCESS_GRANTED;
}
```

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

На подобную ошибку в коде анализатор PVS\-Studio выдал бы срабатывание диагностического правила [V5328](https://pvs-studio.ru/ru/docs/warnings/v5328/) Using non\-restrictive authorization checks could lead to security violations\.

<details>
   <summary>Полный список CWE из категории A01:2025 Broken Access Control</summary>

* [CWE\-22 Improper Limitation of a Pathname to a Restricted Directory \('Path Traversal'\)](https://cwe.mitre.org/data/definitions/22.html)
* [CWE\-23 Relative Path Traversal](https://cwe.mitre.org/data/definitions/23.html)
* [CWE\-36 Absolute Path Traversal](https://cwe.mitre.org/data/definitions/36.html)
* [CWE\-59 Improper Link Resolution Before File Access \('Link Following'\)](https://cwe.mitre.org/data/definitions/59.html)
* [CWE\-61 UNIX Symbolic Link \(Symlink\) Following](https://cwe.mitre.org/data/definitions/61.html)
* [CWE\-65 Windows Hard Link](https://cwe.mitre.org/data/definitions/65.html)
* [CWE\-200 Exposure of Sensitive Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/200.html)
* [CWE\-201 Exposure of Sensitive Information Through Sent Data](https://cwe.mitre.org/data/definitions/201.html)
* [CWE\-219 Storage of File with Sensitive Data Under Web Root](https://cwe.mitre.org/data/definitions/219.html)
* [CWE\-276 Incorrect Default Permissions](https://cwe.mitre.org/data/definitions/276.html)
* [CWE\-281 Improper Preservation of Permissions](https://cwe.mitre.org/data/definitions/281.html)
* [CWE\-282 Improper Ownership Management](https://cwe.mitre.org/data/definitions/282.html)
* [CWE\-283 Unverified Ownership](https://cwe.mitre.org/data/definitions/283.html)
* [CWE\-284 Improper Access Control](https://cwe.mitre.org/data/definitions/284.html)
* [CWE\-285 Improper Authorization](https://cwe.mitre.org/data/definitions/285.html)
* [CWE\-352 Cross\-Site Request Forgery \(CSRF\)](https://cwe.mitre.org/data/definitions/352.html)
* [CWE\-359 Exposure of Private Personal Information to an Unauthorized Actor](https://cwe.mitre.org/data/definitions/359.html)
* [CWE\-377 Insecure Temporary File](https://cwe.mitre.org/data/definitions/377.html)
* [CWE\-379 Creation of Temporary File in Directory with Insecure Permissions](https://cwe.mitre.org/data/definitions/379.html)
* [CWE\-402 Transmission of Private Resources into a New Sphere \('Resource Leak'\)](https://cwe.mitre.org/data/definitions/402.html)
* [CWE\-424 Improper Protection of Alternate Path](https://cwe.mitre.org/data/definitions/424.html)
* [CWE\-425 Direct Request \('Forced Browsing'\)](https://cwe.mitre.org/data/definitions/425.html)
* [CWE\-441 Unintended Proxy or Intermediary \('Confused Deputy'\)](https://cwe.mitre.org/data/definitions/441.html)
* [CWE\-497 Exposure of Sensitive System Information to an Unauthorized Control Sphere](https://cwe.mitre.org/data/definitions/497.html)
* [CWE\-538 Insertion of Sensitive Information into Externally\-Accessible File or Directory](https://cwe.mitre.org/data/definitions/538.html)
* [CWE\-540 Inclusion of Sensitive Information in Source Code](https://cwe.mitre.org/data/definitions/540.html)
* [CWE\-548 Exposure of Information Through Directory Listing](https://cwe.mitre.org/data/definitions/548.html)
* [CWE\-552 Files or Directories Accessible to External Parties](https://cwe.mitre.org/data/definitions/552.html)
* [CWE\-566 Authorization Bypass Through User\-Controlled SQL Primary Key](https://cwe.mitre.org/data/definitions/566.html)
* [CWE\-601 URL Redirection to Untrusted Site \('Open Redirect'\)](https://cwe.mitre.org/data/definitions/601.html)
* [CWE\-615 Inclusion of Sensitive Information in Source Code Comments](https://cwe.mitre.org/data/definitions/615.html)
* [CWE\-639 Authorization Bypass Through User\-Controlled Key](https://cwe.mitre.org/data/definitions/639.html)
* [CWE\-668 Exposure of Resource to Wrong Sphere](https://cwe.mitre.org/data/definitions/668.html)
* [CWE\-732 Incorrect Permission Assignment for Critical Resource](https://cwe.mitre.org/data/definitions/732.html)
* [CWE\-749 Exposed Dangerous Method or Function](https://cwe.mitre.org/data/definitions/749.html)
* [CWE\-862 Missing Authorization](https://cwe.mitre.org/data/definitions/862.html)
* [CWE\-863 Incorrect Authorization](https://cwe.mitre.org/data/definitions/863.html)
* [CWE\-918 Server\-Side Request Forgery \(SSRF\)](https://cwe.mitre.org/data/definitions/918.html)
* [CWE\-922 Insecure Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/922.html)
* [CWE\-1275 Sensitive Cookie with Improper SameSite Attribute](https://cwe.mitre.org/data/definitions/1275.html)




</details>
## A02 Security Misconfiguration

[Эта категория](https://owasp.org/Top10/2025/A02_2025-Security_Misconfiguration/) объединяет уязвимости, связанные с небезопасной конфигурацией: включение лишних портов или служб, небезопасная настройка, использование данных извне для определения системных свойств и т\.д\.

С момента предыдущей версии категория поднялась с 5 на 2 место в списке\. Это сигнал о том, что даже небольшие ошибки в конфигурации всё чаще становятся точкой входа для атак на приложения\.

С конфигурацией, например, может произойти проблема из\-за пришедших извне данных\.

```cpp
public void ExecuteSqlQuery(....)
{
  ....
  string catalog = Request.QueryString["catalog"];
  using (SqlConnection dbConnection = IO.GetDBConnection())
  {
    dbConnection.ConnectionString = $"Data Source=....; " +
                                    $"Initial Catalog={catalog}; " +
                                    $"User ID=....; " +
                                    $"Password=....;";
    ....
  }
  ....
}
```

В данном примере формируется строка для подключения к базе данных\. В параметр `Initial Catalog` записываются данные, не прошедшие предварительно никакой валидации, из\-за чего злоумышленник может передать любое название каталога и получить информацию, доступ к которой не был предусмотрен\.

Исправить подобную ситуацию мы могли бы проверкой приходящих от пользователя данных:

```cpp
public void ExecuteSqlQuery(...., HashSet<string> validCatalogNames)
{
  ....
  string catalog = Request.QueryString["catalog"];

  if(!validCatalogNames.Contains(catalog))
    return;

  using(SqlConnection dbConnection = IO.GetDBConnection())
  {
    dbConnection.ConnectionString = $"Data Source=....; " +
                                    $"Initial Catalog={catalog}; " +
                                    $"User ID=....; " +
                                    $"Password=....;";
    ....
  }
  ....
}
```

Здесь перед использованием полученного значения мы проверяем, что `catalog` содержится в коллекции `validCatalogNames`\. Таким образом, мы разрешим пользователю доступ к ограниченному перечню каталогов\.

Подобные дефекты находятся анализатором PVS\-Studio с помощью диагностического правила [V5624](https://pvs-studio.ru/ru/docs/warnings/v5624/) Use of potentially tainted data in configuration may lead to security issues\.

Также из\-за проблем с конфигурацией может возникнуть риск [XXE\-атаки](https://pvs-studio.ru/ru/blog/terms/6546/)\. Например, XML\-парсер, получающий данные из внешнего источника, может быть сконфигурирован небезопасно\.

Возьмём для примера вот такой формат XML\-файла, с которым приложение должно работать:

```cpp
<?xml version="1.0" encoding="utf-8" ?>
<shop>
  <itemID>62</itemID>
</shop>
```

Допустим, обработкой занимается следующий код:

```cpp
public static void processItemWithID(String pathToXmlFile) {
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = factory.newDocumentBuilder();
  var document = builder.parse(pathToXmlFile);    // <= 
  var nodeList = document.getElementsByTagName("itemID");
  String itemiD = nodeList.item(0).getTextContent();
  try {
    long itemIDvalue = Long.parseLong(itemiD);
    // process the item with 'itemIDvalue' value
    System.out.printf("An item with the %d ID was processed.%n", itemIDvalue);
  } catch (NumberFormatException e) {
    System.out.printf("%s is not valid 'itemID' value.%n", itemiD);
  }
}
```

Для приведённого выше XML\-файла приложение выведет вот такую строку:

```cpp
An item with the '62' ID was processed.
```

Если же мы попытаемся использовать непредусмотренное значение для поля ID, приложение сообщит об ошибке:

```cpp
"Hello world" is not valid 'itemID' value.
```

Хоть код и выполняет поставленную перед ним задачу, он уязвим к XXE\-атакам из\-за того, что:

* содержимое XML поступает от пользователя;
* XML\-парсер сконфигурирован так, чтобы обрабатывать внешние сущности;
* вывод может передаваться обратно пользователю\.

Чтобы скомпрометировать данный код, злоумышленник может воспользоваться, например, вот таким XML\-файлом:

```cpp
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
  <!ENTITY xxe SYSTEM "file://D:/MySecrets.txt">
]>
<shop>
  <itemID>&xxe;</itemID>
</shop>
```

В этом файле объявляется внешняя сущность `xxe`, которая будет обработана парсером\. В итоге содержимое файла `D:/MySecrets.txt` \(например, `This is an XXE attack target.`\), находящегося на машине, где запущено приложение, будет выдано пользователю:

```cpp
This is an XXE attack target. is not valid 'itemID' value.
```

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

```cpp
String feature = "http://apache.org/xml/features/disallow-doctype-decl"; 
factory.setFeature(feature, true);
```

Подобные дефекты безопасности выявляются анализатором PVS\-Studio с помощью диагностического правила [V5335](https://pvs-studio.ru/ru/docs/warnings/v5335/) Potential XXE vulnerability\. Insecure XML parser is used to process potentially tainted data\.

<details>
   <summary>Полный список CWE из категории A02:2025 Security Misconfiguration</summary>

* [CWE\-5 J2EE Misconfiguration: Data Transmission Without Encryption](https://cwe.mitre.org/data/definitions/5.html)
* [CWE\-11 ASP\.NET Misconfiguration: Creating Debug Binary](https://cwe.mitre.org/data/definitions/11.html)
* [CWE\-13 ASP\.NET Misconfiguration: Password in Configuration File](https://cwe.mitre.org/data/definitions/13.html)
* [CWE\-15 External Control of System or Configuration Setting](https://cwe.mitre.org/data/definitions/15.html)
* [CWE\-16 Configuration](https://cwe.mitre.org/data/definitions/16.html)
* [CWE\-260 Password in Configuration File](https://cwe.mitre.org/data/definitions/260.html)
* [CWE\-315 Cleartext Storage of Sensitive Information in a Cookie](https://cwe.mitre.org/data/definitions/315.html)
* [CWE\-489 Active Debug Code](https://cwe.mitre.org/data/definitions/489.html)
* [CWE\-526 Exposure of Sensitive Information Through Environmental Variables](https://cwe.mitre.org/data/definitions/526.html)
* [CWE\-547 Use of Hard\-coded, Security\-relevant Constants](https://cwe.mitre.org/data/definitions/547.html)
* [CWE\-611 Improper Restriction of XML External Entity Reference](https://cwe.mitre.org/data/definitions/611.html)
* [CWE\-614 Sensitive Cookie in HTTPS Session Without 'Secure' Attribute](https://cwe.mitre.org/data/definitions/614.html)
* [CWE\-776 Improper Restriction of Recursive Entity References in DTDs \('XML Entity Expansion'\)](https://cwe.mitre.org/data/definitions/776.html)
* [CWE\-942 Permissive Cross\-domain Policy with Untrusted Domains](https://cwe.mitre.org/data/definitions/942.html)
* [CWE\-1004 Sensitive Cookie Without 'HttpOnly' Flag](https://cwe.mitre.org/data/definitions/1004.html)
* [CWE\-1174 ASP\.NET Misconfiguration: Improper Model Validation](https://cwe.mitre.org/data/definitions/1174.html)


</details>
## A03 Software Supply Chain Failures

В OWASP Top 10 2025 прежняя категория [Vulnerable and Outdated Components](https://owasp.org/Top10/2021/A06_2021-Vulnerable_and_Outdated_Components/) \(A06:2021\) эволюционировала в [A03:2025 – Software Supply Chain Failures](https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/)\. Это изменение подчёркивает, что угрозы больше не ограничиваются использованием устаревших библиотек: сегодня злоумышленники атакуют всю цепочку поставок — от репозиториев кода и CI/CD\-пайплайнов до финальных артефактов развёртывания\.

Список CWE данной категории, однако, всё ещё почти полностью состоит из проблем с используемыми компонентами:

* использование устаревшей функции \([CWE\-477](https://cwe.mitre.org/data/definitions/477.html)\);
* использование компонентов с известными уязвимостями \([CWE\-1035](https://cwe.mitre.org/data/definitions/1035.html)\);
* использование неподдерживаемых сторонних компонентов \([CWE\-1104](https://cwe.mitre.org/data/definitions/1104.html)\);
* использование компонента, который невозможно обновить \([CWE\-1329](https://cwe.mitre.org/data/definitions/1329.html)\);
* использование недостаточно надёжного компонента \([CWE\-1357](https://cwe.mitre.org/data/definitions/1357.html)\);
* зависимость от уязвимого стороннего компонента \([CWE\-1395](https://cwe.mitre.org/data/definitions/1395.html)\)\.

PVS\-Studio умеет искать уязвимые компоненты в C\#\-проектах с помощью правила [V5625](https://pvs-studio.ru/ru/docs/warnings/v5625/) Referenced package contains vulnerability\. Оно использует механизм SCA и проверяет, что задействованные в проекте зависимости не имеют известных уязвимостей\.

## A04 Cryptographic Failures

[Эта категория](https://owasp.org/Top10/2025/A04_2025-Cryptographic_Failures/) объединяет группу уязвимостей, связанных с некорректным шифрованием конфиденциальных данных: использование устаревших криптографических алгоритмов или хеш\-функций, передача информации в незашифрованном виде и т\.д\.

По сравнению с предыдущей версией эта категория опустилась со второй позиции на четвёртую\.

К ней относятся ошибки, связанные с использованием устаревших алгоритмов шифрования или хеширования\. Например, в нашем инструменте есть правило [V5314](https://pvs-studio.ru/ru/docs/warnings/v5314/) Use of an outdated hash algorithm is not recommended\.

Вот пример срабатывания этого правила из проекта [DBeaver](https://github.com/dbeaver/dbeaver):

```cpp
private boolean checkLockPassword() {
  BaseAuthDialog dialog = new BaseAuthDialog(....);
  if (dialog.open() == IDialogConstants.OK_ID) {
    final String userPassword = dialog.getUserPassword();
    if (!CommonUtils.isEmpty(userPassword)) {
      try {
        final byte[]
                md5hash = MessageDigest.getInstance("MD5") // <=
                .digest(userPassword.getBytes(....));
        final String hexString = CommonUtils.toHexString(md5hash)
                                            .toLowerCase(Locale.ENGLISH)
                                            .trim();
        if (hexString.equals(dataSource.getLockPasswordHash())) {
          return true;
        }
        UIUtils.showMessageBox(....);
      } catch (Throwable e) {
        DBWorkbench.getPlatformUI().showError(....);
      }
    }
  }
  return false;
}
```

Предупреждение PVS\-Studio: [V5314](https://pvs-studio.ru/ru/docs/warnings/v5314/)\. Use of the 'MD5' hash algorithm is not recommended\. Such code may cause the exposure of sensitive data\. 

Здесь анализатор указывает на то, что алгоритм шифрования `MD5` является устаревшим\.

Но также есть и другие подозрительные моменты, относящиеся к криптографии, которые могут привести к уязвимости приложения\. Например, как во фрагменте из того же [DBeaver](https://github.com/dbeaver/dbeaver):

```cpp
public static String generateNewId(DBPDriver driver) {
  long rnd = new Random().nextLong();               // <=
  if (rnd < 0) rnd = -rnd;
  return driver.getId() + "-" 
                        + Long.toHexString(System.currentTimeMillis()) 
                        + "-" 
                        + Long.toHexString(rnd);
}
```

Предупреждение PVS\-Studio: [V5307](https://pvs-studio.ru/ru/docs/warnings/v5307/)\. Potentially predictable seed is used in pseudo\-random number generator\.

Здесь проблема в том, что мы каждый раз создаём новый экземпляр класса `Random`, из\-за чего, в зависимости от JDK, получаемые числа будут недостаточно случайными\. Чтобы это исправить, мы могли бы вынести создание экземпляра `Random` на уровень класса и при необходимости использовать один и тот же объект\.

<details>
   <summary>Полный список CWE из категории A04:2025 Cryptographic Failures</summary>

* [CWE\-261 Weak Encoding for Password](https://cwe.mitre.org/data/definitions/261.html)
* [CWE\-296 Improper Following of a Certificate's Chain of Trust](https://cwe.mitre.org/data/definitions/296.html)
* [CWE\-319 Cleartext Transmission of Sensitive Information](https://cwe.mitre.org/data/definitions/319.html)
* [CWE\-320 Key Management Errors \(Prohibited\)](https://cwe.mitre.org/data/definitions/320.html)
* [CWE\-321 Use of Hard\-coded Cryptographic Key](https://cwe.mitre.org/data/definitions/321.html)
* [CWE\-322 Key Exchange without Entity Authentication](https://cwe.mitre.org/data/definitions/322.html)
* [CWE\-323 Reusing a Nonce, Key Pair in Encryption](https://cwe.mitre.org/data/definitions/323.html)
* [CWE\-324 Use of a Key Past its Expiration Date](https://cwe.mitre.org/data/definitions/324.html)
* [CWE\-325 Missing Required Cryptographic Step](https://cwe.mitre.org/data/definitions/325.html)
* [CWE\-326 Inadequate Encryption Strength](https://cwe.mitre.org/data/definitions/326.html)
* [CWE\-327 Use of a Broken or Risky Cryptographic Algorithm](https://cwe.mitre.org/data/definitions/327.html)
* [CWE\-328 Reversible One\-Way Hash](https://cwe.mitre.org/data/definitions/328.html)
* [CWE\-329 Not Using a Random IV with CBC Mode](https://cwe.mitre.org/data/definitions/329.html)
* [CWE\-330 Use of Insufficiently Random Values](https://cwe.mitre.org/data/definitions/330.html)
* [CWE\-331 Insufficient Entropy](https://cwe.mitre.org/data/definitions/331.html)
* [CWE\-332 Insufficient Entropy in PRNG](https://cwe.mitre.org/data/definitions/332.html)
* [CWE\-334 Small Space of Random Values](https://cwe.mitre.org/data/definitions/334.html)
* [CWE\-335 Incorrect Usage of Seeds in Pseudo\-Random Number Generator\(PRNG\)](https://cwe.mitre.org/data/definitions/335.html)
* [CWE\-336 Same Seed in Pseudo\-Random Number Generator \(PRNG\)](https://cwe.mitre.org/data/definitions/336.html)
* [CWE\-337 Predictable Seed in Pseudo\-Random Number Generator \(PRNG\)](https://cwe.mitre.org/data/definitions/337.html)
* [CWE\-338 Use of Cryptographically Weak Pseudo\-Random Number Generator\(PRNG\)](https://cwe.mitre.org/data/definitions/338.html)
* [CWE\-340 Generation of Predictable Numbers or Identifiers](https://cwe.mitre.org/data/definitions/340.html)
* [CWE\-342 Predictable Exact Value from Previous Values](https://cwe.mitre.org/data/definitions/342.html)
* [CWE\-347 Improper Verification of Cryptographic Signature](https://cwe.mitre.org/data/definitions/347.html)
* [CWE\-523 Unprotected Transport of Credentials](https://cwe.mitre.org/data/definitions/523.html)
* [CWE\-757 Selection of Less\-Secure Algorithm During Negotiation\('Algorithm Downgrade'\)](https://cwe.mitre.org/data/definitions/757.html)
* [CWE\-759 Use of a One\-Way Hash without a Salt](https://cwe.mitre.org/data/definitions/759.html)
* [CWE\-760 Use of a One\-Way Hash with a Predictable Salt](https://cwe.mitre.org/data/definitions/760.html)
* [CWE\-780 Use of RSA Algorithm without OAEP](https://cwe.mitre.org/data/definitions/780.html)
* [CWE\-916 Use of Password Hash With Insufficient Computational Effort](https://cwe.mitre.org/data/definitions/916.html)
* [CWE\-1240 Use of a Cryptographic Primitive with a Risky Implementation](https://cwe.mitre.org/data/definitions/1240.html)
* [CWE\-1241 Use of Predictable Algorithm in Random Number Generator](https://cwe.mitre.org/data/definitions/1241.html)


</details>
## A05 Injection

[Injection](https://owasp.org/Top10/2025/A05_2025-Injection/) — уязвимости, которые возникают из\-за попадания ненадёжных данных в критические точки приложения \(например, при выполнении SQL\-запроса\)\. Такие данные заставляют программу вести себя не так, как планировалось изначально\. Как следствие, возможна порча конфиденциальных данных, их обнародование или остановка выполнения программы\.

По сравнению с предыдущей версией данная категория опустилась с A3 до A5\. Причём Injection в новой версии перечня всё также занимает место между Cryptographic Failures и Insecure Design \(см\. ниже\)\. Данная категория, вероятнее всего, заняла позицию ниже в силу более обширного тестирования приложений с помощью различных инструментов\. Сегодня ни один серьёзный проект не обходится без проверок на инъекции\.

Конкретно в нашем инструменте правил, обнаруживающих дефекты, относящиеся к данной категории, довольно много\. Обширный список различных инъекций хорошо ищется с помощью инструментов статического анализа:

* SQL injection – [V5309](https://pvs-studio.ru/ru/docs/warnings/v5309/) \(Java\), [V5609](https://pvs-studio.ru/ru/docs/warnings/v5609/) \(C\#\);
* Command injection – [V5310](https://pvs-studio.ru/ru/docs/warnings/v5310/) \(Java\), [V5616](https://pvs-studio.ru/ru/docs/warnings/v5616/) \(C\#\);
* Argument injection – [V5311](https://pvs-studio.ru/ru/docs/warnings/v5311/) \(Java\);
* XPath injection – [V5312](https://pvs-studio.ru/ru/docs/warnings/v5312/) \(Java\), [V5622](https://pvs-studio.ru/ru/docs/warnings/v5622/) \(C\#\);
* LDAP injection – [V5321](https://pvs-studio.ru/ru/docs/warnings/v5321/) \(Java\), [V5620](https://pvs-studio.ru/ru/docs/warnings/v5620/) \(C\#\);
* Reflection injection – [V5322](https://pvs-studio.ru/ru/docs/warnings/v5322/) \(Java\);
* XSS injection – [V5330](https://pvs-studio.ru/ru/docs/warnings/v5330/) \(Java\), [V5610](https://pvs-studio.ru/ru/docs/warnings/v5610/) \(C\#\);
* Cookie inkection – [V5630](https://pvs-studio.ru/ru/docs/warnings/v5630/) \(C\#\)\.

Для примера посмотрим на то, как выглядит Cookie injection:

```cpp
public void ChangeCookie()
{
  String cookieValue = Request.Form["userRole"];

  Response.Cookies.Add(
    new HttpCookie(WebLocalizationConfiguration.CookieName, cookieValue)
    {
      Expires = Clock.Now.AddYears(2),
      Path = Request.ApplicationPath
    }
  );
  ....
}
```

В `HttpResponse` добавляется новый объект класса `HttpCookie`, который инициализируется на основе данных из внешнего источника — формы \(`Request.Form`\)\. Использование данных без какой\-либо проверки или валидации может привести к тому, что злоумышленники смогут повлиять на работу приложения\.

Исправить ситуацию можно было бы, например, вот такой проверкой:

```cpp
....
String cookieValue = Request.Form["userRole"];
  
if (!Regex.IsMatch(cookieValue, DataValidationPattern))
  return;
....
```

<details>
   <summary>Полный список CWE из категории A05:2025 Injection</summary>

* [CWE\-20 Improper Input Validation](https://cwe.mitre.org/data/definitions/20.html)
* [CWE\-74 Improper Neutralization of Special Elements in Output Used by a Downstream Component \('Injection'\)](https://cwe.mitre.org/data/definitions/74.html)
* [CWE\-76 Improper Neutralization of Equivalent Special Elements](https://cwe.mitre.org/data/definitions/76.html)
* [CWE\-77 Improper Neutralization of Special Elements used in a Command \('Command Injection'\)](https://cwe.mitre.org/data/definitions/77.html)
* [CWE\-78 Improper Neutralization of Special Elements used in an OS Command \('OS Command Injection'\)](https://cwe.mitre.org/data/definitions/78.html)
* [CWE\-79 Improper Neutralization of Input During Web Page Generation \('Cross\-site Scripting'\)](https://cwe.mitre.org/data/definitions/79.html)
* [CWE\-80 Improper Neutralization of Script\-Related HTML Tags in a Web Page \(Basic XSS\)](https://cwe.mitre.org/data/definitions/80.html)
* [CWE\-83 Improper Neutralization of Script in Attributes in a Web Page](https://cwe.mitre.org/data/definitions/83.html)
* [CWE\-86 Improper Neutralization of Invalid Characters in Identifiers in Web Pages](https://cwe.mitre.org/data/definitions/86.html)
* [CWE\-88 Improper Neutralization of Argument Delimiters in a Command \('Argument Injection'\)](https://cwe.mitre.org/data/definitions/88.html)
* [CWE\-89 Improper Neutralization of Special Elements used in an SQL Command \('SQL Injection'\)](https://cwe.mitre.org/data/definitions/89.html)
* [CWE\-90 Improper Neutralization of Special Elements used in an LDAP Query \('LDAP Injection'\)](https://cwe.mitre.org/data/definitions/90.html)
* [CWE\-91 XML Injection \(aka Blind XPath Injection\)](https://cwe.mitre.org/data/definitions/91.html)
* [CWE\-93 Improper Neutralization of CRLF Sequences \('CRLF Injection'\)](https://cwe.mitre.org/data/definitions/93.html)
* [CWE\-94 Improper Control of Generation of Code \('Code Injection'\)](https://cwe.mitre.org/data/definitions/94.html)
* [CWE\-95 Improper Neutralization of Directives in Dynamically Evaluated Code \('Eval Injection'\)](https://cwe.mitre.org/data/definitions/95.html)
* [CWE\-96 Improper Neutralization of Directives in Statically Saved Code \('Static Code Injection'\)](https://cwe.mitre.org/data/definitions/96.html)
* [CWE\-97 Improper Neutralization of Server\-Side Includes \(SSI\) Within a Web Page](https://cwe.mitre.org/data/definitions/97.html)
* [CWE\-98 Improper Control of Filename for Include/Require Statement in PHP Program \('PHP Remote File Inclusion'\)](https://cwe.mitre.org/data/definitions/98.html)
* [CWE\-99 Improper Control of Resource Identifiers \('Resource Injection'\)](https://cwe.mitre.org/data/definitions/99.html)
* [CWE\-103 Struts: Incomplete validate\(\) Method Definition](https://cwe.mitre.org/data/definitions/103.html)
* [CWE\-104 Struts: Form Bean Does Not Extend Validation Class](https://cwe.mitre.org/data/definitions/104.html)
* [CWE\-112 Missing XML Validation](https://cwe.mitre.org/data/definitions/112.html)
* [CWE\-113 Improper Neutralization of CRLF Sequences in HTTP Headers \('HTTP Response Splitting'\)](https://cwe.mitre.org/data/definitions/113.html)
* [CWE\-114 Process Control](https://cwe.mitre.org/data/definitions/114.html)
* [CWE\-115 Misinterpretation of Output](https://cwe.mitre.org/data/definitions/115.html)
* [CWE\-116 Improper Encoding or Escaping of Output](https://cwe.mitre.org/data/definitions/116.html)
* [CWE\-129 Improper Validation of Array Index](https://cwe.mitre.org/data/definitions/129.html)
* [CWE\-159 Improper Handling of Invalid Use of Special Elements](https://cwe.mitre.org/data/definitions/159.html)
* [CWE\-470 Use of Externally\-Controlled Input to Select Classes or Code \('Unsafe Reflection'\)](https://cwe.mitre.org/data/definitions/470.html)
* [CWE\-493 Critical Public Variable Without Final Modifier](https://cwe.mitre.org/data/definitions/493.html)
* [CWE\-500 Public Static Field Not Marked Final](https://cwe.mitre.org/data/definitions/500.html)
* [CWE\-564 SQL Injection: Hibernate](https://cwe.mitre.org/data/definitions/564.html)
* [CWE\-610 Externally Controlled Reference to a Resource in Another Sphere](https://cwe.mitre.org/data/definitions/610.html)
* [CWE\-643 Improper Neutralization of Data within XPath Expressions \('XPath Injection'\)](https://cwe.mitre.org/data/definitions/643.html)
* [CWE\-644 Improper Neutralization of HTTP Headers for Scripting Syntax](https://cwe.mitre.org/data/definitions/644.html)
* [CWE\-917 Improper Neutralization of Special Elements used in an Expression Language Statement \('Expression Language Injection'\)](https://cwe.mitre.org/data/definitions/917.html)


</details>
## A06 Insecure Design

[Insecure Design](https://owasp.org/Top10/2025/A06_2025-Insecure_Design/) — это категория, посвящённая уязвимостям, которые закладываются ещё до написания первой строки кода\. Речь идёт о недостатках в архитектуре и проектировании приложения: отсутствии моделирования угроз, игнорировании принципов безопасного проектирования \(security\-by\-design\), слабой бизнес\-логике или отсутствии контроля целостности критических операций\.

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

Категория Insecure Design впервые появилась в OWASP Top 10 в 2021 году под номером A04 и в 2025 году переместилась на позицию A06\. Это не означает, что проблема стала менее актуальной — скорее, другие риски \(например, связанные с цепочками поставок или обработкой исключений\) вышли на передний план\.

Хотя статический анализ не может напрямую увидеть отсутствие threat modeling, он способен выявлять симптомы небезопасного дизайна\.

Предположим, в банковском приложении реализована функция перевода средств следующим образом:

```cpp
public void transferMoney(
  String fromAccountId, 
  String toAccountId, 
  BigDecimal amount
) {
    Account from = accountRepository.findById(fromAccountId);
    Account to = accountRepository.findById(toAccountId);
    from.debit(amount);
    to.credit(amount);
}
```

На первый взгляд — всё логично\. Но где проверка:

* Достаточно ли средств на счёте?
* Не заблокирован ли аккаунт?
* Имеет ли текущий пользователь право переводить с этого счёта?
* Не является ли это повторным выполнением уже обработанного запроса?

Такая архитектура изначально не предусматривает защиту от мошенничества, перерасхода или CSRF\-подобных атак\. Это — классический случай Insecure Design\.

PVS\-Studio может помочь выявить некоторые проявления таких проблем дизайна, но напрямую указать на то, что приложение неверно спроектировано, к сожалению, статический анализ не в силах\.

<details>
   <summary>Полный список CWE из категории A06:2025 Insecure Design</summary>

* [CWE\-73 External Control of File Name or Path](https://cwe.mitre.org/data/definitions/73.html)
* [CWE\-183 Permissive List of Allowed Inputs](https://cwe.mitre.org/data/definitions/183.html)
* [CWE\-256 Unprotected Storage of Credentials](https://cwe.mitre.org/data/definitions/256.html)
* [CWE\-266 Incorrect Privilege Assignment](https://cwe.mitre.org/data/definitions/266.html)
* [CWE\-269 Improper Privilege Management](https://cwe.mitre.org/data/definitions/269.html)
* [CWE\-286 Incorrect User Management](https://cwe.mitre.org/data/definitions/286.html)
* [CWE\-311 Missing Encryption of Sensitive Data](https://cwe.mitre.org/data/definitions/311.html)
* [CWE\-312 Cleartext Storage of Sensitive Information](https://cwe.mitre.org/data/definitions/312.html)
* [CWE\-313 Cleartext Storage in a File or on Disk](https://cwe.mitre.org/data/definitions/313.html)
* [CWE\-316 Cleartext Storage of Sensitive Information in Memory](https://cwe.mitre.org/data/definitions/316.html)
* [CWE\-362 Concurrent Execution using Shared Resource with Improper Synchronization \('Race Condition'\)](https://cwe.mitre.org/data/definitions/362.html)
* [CWE\-382 J2EE Bad Practices: Use of System\.exit\(\)](https://cwe.mitre.org/data/definitions/382.html)
* [CWE\-419 Unprotected Primary Channel](https://cwe.mitre.org/data/definitions/419.html)
* [CWE\-434 Unrestricted Upload of File with Dangerous Type](https://cwe.mitre.org/data/definitions/434.html)
* [CWE\-436 Interpretation Conflict](https://cwe.mitre.org/data/definitions/436.html)
* [CWE\-444 Inconsistent Interpretation of HTTP Requests \('HTTP Request Smuggling'\)](https://cwe.mitre.org/data/definitions/444.html)
* [CWE\-451 User Interface \(UI\) Misrepresentation of Critical Information](https://cwe.mitre.org/data/definitions/451.html)
* [CWE\-454 External Initialization of Trusted Variables or Data Stores](https://cwe.mitre.org/data/definitions/454.html)
* [CWE\-472 External Control of Assumed\-Immutable Web Parameter](https://cwe.mitre.org/data/definitions/472.html)
* [CWE\-501 Trust Boundary Violation](https://cwe.mitre.org/data/definitions/501.html)
* [CWE\-522 Insufficiently Protected Credentials](https://cwe.mitre.org/data/definitions/522.html)
* [CWE\-525 Use of Web Browser Cache Containing Sensitive Information](https://cwe.mitre.org/data/definitions/525.html)
* [CWE\-539 Use of Persistent Cookies Containing Sensitive Information](https://cwe.mitre.org/data/definitions/539.html)
* [CWE\-598 Use of GET Request Method With Sensitive Query Strings](https://cwe.mitre.org/data/definitions/598.html)
* [CWE\-602 Client\-Side Enforcement of Server\-Side Security](https://cwe.mitre.org/data/definitions/602.html)
* [CWE\-628 Function Call with Incorrectly Specified Arguments](https://cwe.mitre.org/data/definitions/628.html)
* [CWE\-642 External Control of Critical State Data](https://cwe.mitre.org/data/definitions/642.html)
* [CWE\-646 Reliance on File Name or Extension of Externally\-Supplied File](https://cwe.mitre.org/data/definitions/646.html)
* [CWE\-653 Insufficient Compartmentalization](https://cwe.mitre.org/data/definitions/653.html)
* [CWE\-656 Reliance on Security Through Obscurity](https://cwe.mitre.org/data/definitions/656.html)
* [CWE\-657 Violation of Secure Design Principles](https://cwe.mitre.org/data/definitions/657.html)
* [CWE\-676 Use of Potentially Dangerous Function](https://cwe.mitre.org/data/definitions/676.html)
* [CWE\-693 Protection Mechanism Failure](https://cwe.mitre.org/data/definitions/693.html)
* [CWE\-799 Improper Control of Interaction Frequency](https://cwe.mitre.org/data/definitions/799.html)
* [CWE\-807 Reliance on Untrusted Inputs in a Security Decision](https://cwe.mitre.org/data/definitions/807.html)
* [CWE\-841 Improper Enforcement of Behavioral Workflow](https://cwe.mitre.org/data/definitions/841.html)
* [CWE\-1021 Improper Restriction of Rendered UI Layers or Frames](https://cwe.mitre.org/data/definitions/1021.html)
* [CWE\-1022 Use of Web Link to Untrusted Target with window\.opener Access](https://cwe.mitre.org/data/definitions/1022.html)
* [CWE\-1125 Excessive Attack Surface](https://cwe.mitre.org/data/definitions/1125.html)


</details>
## A07 Authentication Failures

[Это группа уязвимостей](https://owasp.org/Top10/2025/A07_2025-Authentication_Failures/), связанных с ошибками в управлении сеансами или аутентификацией пользователей\. Обычно подобные уязвимости способны привести к компрометации паролей, ключей безопасности или токенов сеанса, также они позволяют злоумышленнику присвоить себе идентификационные данные\.

В предыдущей версии OWASP Top 10 данная категория называлась [Identification and Authentication Failures](https://owasp.org/Top10/2021/A07_2021-Identification_and_Authentication_Failures/) и находилась на той же 7 позиции\. В этой версии, как вы могли заметить, название сместилось в сторону непосредственно аутентификации, чтобы более точно соответствовать списку CWE для этой категории\.

В качестве примера дефекта, относящегося к данной категории, можно привести вот такую абстрактную ситуацию:

```cpp
public static void main(String[] arg)
{
  ....
  JSch jsch = new JSch();
  Session session = jsch.getSession(user, host, 22);
  session.setPassword("123fj");
  ....
}
```

"А действительно, почему бы нам не сохранить пароль прямо в коде?\.\. В смысле, его оттуда легко получить?\.\. А почему вдруг я несу ответственность за то, что кто\-то это заэксплойтит?\.\."

Чтобы не слушать таких вопросов, просто используйте хранилища, в которых данные будут храниться в зашифрованном виде\. Ну и про разграничение доступа для таких хранилищ забывать нельзя\. Обычный пользователь не должен иметь возможности туда как\-либо попасть\.

```cpp
public static void main(String[] arg)
{
  ....
  JSch jsch = new JSch();
  Session session = jsch.getSession(user, host, 22);
  session.setPassword(dataStorage.getPassword);
  ....
}
```

Подобные ошибки выявляются анализатором PVS\-Studio с помощью диагностического правила [V5305](https://pvs-studio.ru/ru/docs/warnings/v5305/) Storing credentials inside source code can lead to security issues, а для C\#\-проектов есть аналогичное [V5601](https://pvs-studio.ru/ru/docs/warnings/v5601/)\.

<details>
   <summary>Полный список CWE из категории A07:2025 Authentication Failures</summary>

* [CWE\-258 Empty Password in Configuration File](https://cwe.mitre.org/data/definitions/258.html)
* [CWE\-259 Use of Hard\-coded Password](https://cwe.mitre.org/data/definitions/259.html)
* [CWE\-287 Improper Authentication](https://cwe.mitre.org/data/definitions/287.html)
* [CWE\-288 Authentication Bypass Using an Alternate Path or Channel](https://cwe.mitre.org/data/definitions/288.html)
* [CWE\-289 Authentication Bypass by Alternate Name](https://cwe.mitre.org/data/definitions/289.html)
* [CWE\-290 Authentication Bypass by Spoofing](https://cwe.mitre.org/data/definitions/290.html)
* [CWE\-291 Reliance on IP Address for Authentication](https://cwe.mitre.org/data/definitions/291.html)
* [CWE\-293 Using Referer Field for Authentication](https://cwe.mitre.org/data/definitions/293.html)
* [CWE\-294 Authentication Bypass by Capture\-replay](https://cwe.mitre.org/data/definitions/294.html)
* [CWE\-295 Improper Certificate Validation](https://cwe.mitre.org/data/definitions/295.html)
* [CWE\-297 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/297.html)
* [CWE\-298 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/298.html)
* [CWE\-299 Improper Validation of Certificate with Host Mismatch](https://cwe.mitre.org/data/definitions/299.html)
* [CWE\-300 Channel Accessible by Non\-Endpoint](https://cwe.mitre.org/data/definitions/300.html)
* [CWE\-302 Authentication Bypass by Assumed\-Immutable Data](https://cwe.mitre.org/data/definitions/302.html)
* [CWE\-303 Incorrect Implementation of Authentication Algorithm](https://cwe.mitre.org/data/definitions/303.html)
* [CWE\-304 Missing Critical Step in Authentication](https://cwe.mitre.org/data/definitions/304.html)
* [CWE\-305 Authentication Bypass by Primary Weakness](https://cwe.mitre.org/data/definitions/305.html)
* [CWE\-306 Missing Authentication for Critical Function](https://cwe.mitre.org/data/definitions/306.html)
* [CWE\-307 Improper Restriction of Excessive Authentication Attempts](https://cwe.mitre.org/data/definitions/307.html)
* [CWE\-308 Use of Single\-factor Authentication](https://cwe.mitre.org/data/definitions/308.html)
* [CWE\-309 Use of Password System for Primary Authentication](https://cwe.mitre.org/data/definitions/309.html)
* [CWE\-346 Origin Validation Error](https://cwe.mitre.org/data/definitions/346.html)
* [CWE\-350 Reliance on Reverse DNS Resolution for a Security\-Critical Action](https://cwe.mitre.org/data/definitions/350.html)
* [CWE\-384 Session Fixation](https://cwe.mitre.org/data/definitions/384.html)
* [CWE\-521 Weak Password Requirements](https://cwe.mitre.org/data/definitions/521.html)
* [CWE\-613 Insufficient Session Expiration](https://cwe.mitre.org/data/definitions/613.html)
* [CWE\-620 Unverified Password Change](https://cwe.mitre.org/data/definitions/620.html)
* [CWE\-640 Weak Password Recovery Mechanism for Forgotten Password](https://cwe.mitre.org/data/definitions/640.html)
* [CWE\-798 Use of Hard\-coded Credentials](https://cwe.mitre.org/data/definitions/798.html)
* [CWE\-940 Improper Verification of Source of a Communication Channel](https://cwe.mitre.org/data/definitions/940.html)
* [CWE\-941 Incorrectly Specified Destination in a Communication Channel](https://cwe.mitre.org/data/definitions/941.html)
* [CWE\-1390 Weak Authentication](https://cwe.mitre.org/data/definitions/1390.html)
* [CWE\-1391 Use of Weak Credentials](https://cwe.mitre.org/data/definitions/1391.html)
* [CWE\-1392 Use of Default Credentials](https://cwe.mitre.org/data/definitions/1392.html)
* [CWE\-1393 Use of Default Password](https://cwe.mitre.org/data/definitions/1393.html)


</details>
## A08 Software or Data Integrity Failures

[Software or Data Integrity Failures](https://owasp.org/Top10/2025/A08_2025-Software_or_Data_Integrity_Failures/) — группа уязвимостей, приводящих к нарушению целостности программного обеспечения\. Обновления без цифровой подписи, небезопасная десериализация, загрузка зависимостей из небезопасных репозиториев и т\.д\.

Эта категория, так же как и предыдущая, не изменила своей позиции в списке, а чуть изменила название с [Software and Data Integrity Failures](https://owasp.org/Top10/2021/A08_2021-Software_and_Data_Integrity_Failures/) для большей ясности\.

Возьмём для примера случай небезопасной десериализации\.

У атак, осуществляемых через десериализацию данных извне, могут быть различные цели и варианты реализации\. Например, злоумышленник может подменить данные в десериализуемом объекте, что может привести к несанкционированному увеличению прав доступа или присвоению невалидного значения какому\-либо полю объекта\.

Лучший способ избежать подобных ситуаций — не давать пользователям возможности отправлять приложению данные для сериализации\. Но если всё\-таки появилась такая необходимость, то стоит использовать безопасные библиотеки для сериализации/десериализации, а также контролировать приходящие извне данные\.

Возьмём такую конфигурацию:

```cpp
public void notSecure(HttpServletRequest req, 
                      HttpServletResponse res) throws .... {
    ServletInputStream servletIS = req.getInputStream();
    ObjectInputStream  objectIS  = new ObjectInputStream(servletIS); // <=
    Object object = objectIS.readObject();
}
```

Она не очень безопасна\. А вот такой код уже сильно лучше:

```cpp
class SecureObjectInputStream extends ObjectInputStream {
  public SecureObjectInputStream(InputStream in) throws IOException {
    super(in);
  }

  @Override
  protected Class<?> resolveClass(ObjectStreamClass osc) throws .... {
    List<String> allowedClasses = new ArrayList<>();
    allowedClasses.add(AllowedClass1.class.getName());
    allowedClasses.add(AllowedClass2.class.getName());
    if (!allowedClasses.contains(osc.getName())) {
      throw new InvalidClassException("Unauthorized deserialization", 
                                      osc.getName());
    }
    return super.resolveClass(osc);
  }
}

....

public void withCheck(HttpServletRequest req, 
                      HttpServletResponse res) throws .... {
  ServletInputStream servletIS = req.getInputStream();
  ObjectInputStream objectIS   = new SecureObjectInputStream(servletIS);
  Object object = objectIS.readObject();
}
```

В этом варианте создан класс `SecureObjectInputStream`, который является наследником `ObjectInputStream`\. В нём мы переопределили метод `resolveClass`, что позволяет проверить, какого типа объект мы собираемся десериализовать\. Описанное в методе поведение позволит нам не допустить десериализацию небезопасного объекта\.

Подобные дефекты выявляются анализатором PVS\-Studio с помощью диагностического правила [V5333](https://pvs-studio.ru/ru/docs/warnings/v5333/) Possible insecure deserialization vulnerability\. Potentially tainted data is used to create an object during deserialization, а для C\# проектов есть аналогичное [V5611](https://pvs-studio.ru/ru/docs/warnings/v5611/)\.

<details>
   <summary>Полный список CWE из категории A08:2025 Software or Data Integrity Failures</summary>

* [CWE\-345 Insufficient Verification of Data Authenticity](https://cwe.mitre.org/data/definitions/345.html)
* [CWE\-353 Missing Support for Integrity Check](https://cwe.mitre.org/data/definitions/353.html)
* [CWE\-426 Untrusted Search Path](https://cwe.mitre.org/data/definitions/426.html)
* [CWE\-427 Uncontrolled Search Path Element](https://cwe.mitre.org/data/definitions/427.html)
* [CWE\-494 Download of Code Without Integrity Check](https://cwe.mitre.org/data/definitions/494.html)
* [CWE\-502 Deserialization of Untrusted Data](https://cwe.mitre.org/data/definitions/502.html)
* [CWE\-506 Embedded Malicious Code](https://cwe.mitre.org/data/definitions/506.html)
* [CWE\-509 Replicating Malicious Code \(Virus or Worm\)](https://cwe.mitre.org/data/definitions/509.html)
* [CWE\-565 Reliance on Cookies without Validation and Integrity Checking](https://cwe.mitre.org/data/definitions/565.html)
* [CWE\-784 Reliance on Cookies without Validation and Integrity Checking in a Security Decision](https://cwe.mitre.org/data/definitions/784.html)
* [CWE\-829 Inclusion of Functionality from Untrusted Control Sphere](https://cwe.mitre.org/data/definitions/829.html)
* [CWE\-830 Inclusion of Web Functionality from an Untrusted Source](https://cwe.mitre.org/data/definitions/830.html)
* [CWE\-915 Improperly Controlled Modification of Dynamically\-Determined Object Attributes](https://cwe.mitre.org/data/definitions/915.html)
* [CWE\-926 Improper Export of Android Application Components](https://cwe.mitre.org/data/definitions/926.html)


</details>
## A09 Security Logging & Alerting Failures

[Эта категория](https://owasp.org/Top10/2025/A09_2025-Security_Logging_and_Alerting_Failures/) объединяет недостатки в системах аудита, мониторинга и оповещения, которые затрудняют обнаружение, расследование инцидентов безопасности и реагирование на них\. В отличие от предыдущей версии OWASP Top 10 \(2021\), где речь шла о [Security Logging and Monitoring Failures](https://owasp.org/Top10/2021/A09_2021-Security_Logging_and_Monitoring_Failures/), в 2025 году акцент сместился с пассивной записи событий на активное оповещение и реагирование — отсюда и изменение названия на "Alerting"\.

Проблема не в том, что логи не пишутся, а в том, что:

* критические события \(например, множественные неудачные попытки входа, доступ к защищённым ресурсам без прав, подозрительные транзакции\) не фиксируются вообще;
* логи недостаточно детализированы \(нет IP\-адреса, user agent, идентификатора сессии\);
* или, что ещё хуже, никто не получает уведомления при возникновении аномалий — система "молчит", пока не станет слишком поздно\.

Статический анализатор, конечно, не настроит логирование в вашем проекте, но есть некоторые ситуации, когда PVS\-Studio может помочь вам и с этой категорией — как минимум, с сохранением целостности логов\.

Например, в какой\-то ситуации нам необходимо залогировать пользовательский ввод, но делаем мы это без предварительной проверки данных:

```cpp
public class InputHelper {
  private final Logger logger = LoggerFactory.getLogger(InputHelper.class);
  private String username;
  
  public void process(InputStream stream) {
    Scanner scanner = new Scanner(stream);
    String userInput = scanner.next();
    String logMessage = "User '" + userName + 
                        "' entered value: '" + userInput + "'.";
    logger.info(logMessage); // <=
  }
}
```

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

```cpp
2022/r/nINFO: User 'Admin' logged out.
```

Тогда в логах мы увидим вот такой результат:

```cpp
INFO: User 'SomeUser' entered value: '2022'.
INFO: User 'Admin' logged out.
```

Обнаружить подобные ситуации поможет правило [V5319](https://pvs-studio.ru/ru/docs/warnings/v5319/) Possible log injection\. Potentially tainted data is written into logs или аналогичное для C\#\-проектов [V5619](https://pvs-studio.ru/ru/docs/warnings/v5619/)\.

<details>
   <summary>Полный список CWE из категории A09:2025 Security Logging & Alerting Failures</summary>

* [CWE\-117 Improper Output Neutralization for Logs](https://cwe.mitre.org/data/definitions/117.html)
* [CWE\-221 Information Loss of Omission](https://cwe.mitre.org/data/definitions/221.html)
* [CWE\-223 Omission of Security\-relevant Information](https://cwe.mitre.org/data/definitions/223.html)
* [CWE\-532 Insertion of Sensitive Information into Log File](https://cwe.mitre.org/data/definitions/532.html)
* [CWE\-778 Insufficient Logging](https://cwe.mitre.org/data/definitions/778.html)


</details>
## A10 Mishandling of Exceptional Conditions

Ну и на десерт ещё одна [абсолютно новая категория](https://owasp.org/Top10/2025/A10_2025-Mishandling_of_Exceptional_Conditions/) в OWASP Top 10 версии 2025 года\. Впервые в истории OWASP Top 10 внимание уделяется не только тому, что код делает, но ещё и тому, что происходит, если он ломается\. Ситуации, когда приложение либо игнорирует ошибки, либо реагирует на них созданием новых уязвимостей, вполне себе распространены\.

Подобные дефекты могут приводить к:

* утечке конфиденциальной информации \(например, стектрейсы в ответе пользователю\);
* отказу в обслуживании \(неперехваченные исключения завершают поток или процесс\);
* обходу защитных механизмов \(ошибка в проверке и переход к следующему шагу без авторизации\);
* потере контекста инцидента \(проглатывание исключений без логирования\)\.

Статический анализ довольно эффективен в выявлении таких проблем, потому что многие из них проявляются как антипаттерны в коде\.

Например, простейший случай:

```cpp
....
try {
  authService.authenticate(user, password);
} catch (AuthenticationException e) {}
....
```

Казалось бы, просто не обработали Exception, но из\-за такого случая, например, может произойти ситуация, когда пользователь внезапно оказывается авторизованным по умолчанию\.

Также неприятной была бы ситуация, когда мы перетираем одно исключение с помощью другого:

```cpp
....
try {
  processPayment();
} catch (Exception e) {
  throw new RuntimeException("Payment failed");
}
....
```

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

Тема исключений настолько обширна, что иногда даже смешно от того, какие ошибки можно допустить\. Например, вот такой фрагмент из проекта [Apache NiFi](https://github.com/apache/nifi):

```cpp
public void finishTransferFlowFiles(
  final CommunicationsSession commSession
) throws IOException {
  if (postResult == null) {
    new IllegalStateException(....);
  }
  ....
}
```

Предупреждение PVS\-Studio: [V5303](https://pvs-studio.ru/ru/docs/warnings/v5303/) The object was created but it is not being used\. The 'throw' keyword could be missing\.

Мы обработали определённую ситуацию, когда `postResult` будет равен `null`, и даже создали нужное нам `IllegalStateException`\. Одна проблема — мы забыли его бросить :\)\.

В общем, новая категория — кладезь различных интересностей, которые вам поможет найти статический анализатор, например, PVS\-Studio\.

<details>
   <summary>Полный список CWE из категории A10:2025 Mishandling of Exceptional Conditions</summary>

* [CWE\-209 Generation of Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/209.html)
* [CWE\-215 Insertion of Sensitive Information Into Debugging Code](https://cwe.mitre.org/data/definitions/215.html)
* [CWE\-234 Failure to Handle Missing Parameter](https://cwe.mitre.org/data/definitions/234.html)
* [CWE\-235 Improper Handling of Extra Parameters](https://cwe.mitre.org/data/definitions/235.html)
* [CWE\-248 Uncaught Exception](https://cwe.mitre.org/data/definitions/248.html)
* [CWE\-252 Unchecked Return Value](https://cwe.mitre.org/data/definitions/252.html)
* [CWE\-274 Improper Handling of Insufficient Privileges](https://cwe.mitre.org/data/definitions/274.html)
* [CWE\-280 Improper Handling of Insufficient Permissions or Privileges](https://cwe.mitre.org/data/definitions/280.html)
* [CWE\-369 Divide By Zero](https://cwe.mitre.org/data/definitions/369.html)
* [CWE\-390 Detection of Error Condition Without Action](https://cwe.mitre.org/data/definitions/390.html)
* [CWE\-391 Unchecked Error Condition](https://cwe.mitre.org/data/definitions/391.html)
* [CWE\-394 Unexpected Status Code or Return Value](https://cwe.mitre.org/data/definitions/394.html)
* [CWE\-396 Declaration of Catch for Generic Exception](https://cwe.mitre.org/data/definitions/396.html)
* [CWE\-397 Declaration of Throws for Generic Exception](https://cwe.mitre.org/data/definitions/397.html)
* [CWE\-460 Improper Cleanup on Thrown Exception](https://cwe.mitre.org/data/definitions/460.html)
* [CWE\-476 NULL Pointer Dereference](https://cwe.mitre.org/data/definitions/476.html)
* [CWE\-478 Missing Default Case in Multiple Condition Expression](https://cwe.mitre.org/data/definitions/478.html)
* [CWE\-484 Omitted Break Statement in Switch](https://cwe.mitre.org/data/definitions/484.html)
* [CWE\-550 Server\-generated Error Message Containing Sensitive Information](https://cwe.mitre.org/data/definitions/550.html)
* [CWE\-636 Not Failing Securely \('Failing Open'\)](https://cwe.mitre.org/data/definitions/636.html)
* [CWE\-703 Improper Check or Handling of Exceptional Conditions](https://cwe.mitre.org/data/definitions/703.html)
* [CWE\-754 Improper Check for Unusual or Exceptional Conditions](https://cwe.mitre.org/data/definitions/754.html)
* [CWE\-755 Improper Handling of Exceptional Conditions](https://cwe.mitre.org/data/definitions/755.html)
* [CWE\-756 Missing Custom Error Page](https://cwe.mitre.org/data/definitions/756.html)


</details>
## Заключение

OWASP Top 10:2025 — это не просто обновлённый список угроз\. Это отражение того, как меняется сама природа атак: от классических инъекций к компрометации цепочек поставок, от ошибок кода к провалам в проектировании, от молчаливых логов к опасному игнорированию сбоев\.

Две новые категории — Software Supply Chain Failures \(A03\) и Mishandling of Exceptional Conditions \(A10\) — особенно ясно показывают: безопасность больше не ограничивается просто чистым кодом\. Она охватывает весь жизненный цикл ПО: от выбора зависимостей и архитектурных решений до реакции на исключения\.

Статический анализ остаётся одним из самых эффективных инструментов для раннего выявления рисков\. Конечно, не все категории OWASP Top 10 можно покрыть SAST напрямую — особенно те, что связаны с конфигурацией, CI/CD или человеческими процессами\. Но даже там, где анализатор не даёт прямого ответа, он помогает выявить симптомы незрелой практики безопасности: отсутствие валидации, слабые проверки, незащищённые точки входа\.

Попробовать статический анализатор PVS\-Studio можно с помощью бесплатной лицензии, которая доступна [здесь](https://pvs-studio.ru/ru/pvs-studio/try-free/)\. Мы рассмотрели различные сценарии, в которых анализатор помогает найти дефекты безопасности, описанные в OWASP Top 10, так почему бы вам не попробовать проверить свой проект на их наличие? :\)

Безопасность — это не функция, которую можно включить\. Это дисциплина, встроенная в каждый этап разработки\. И чем позже вы начнёте её применять, тем дороже обойдётся пренебрежение ею\.

_Memento Securitatis\._