> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Коды предупреждений анализа устройств и IP

> Все коды предупреждений анализа устройства и IP в Didit: VPN, Tor, несовпадение стран, списки блокировок, дубликаты и несовпадение ожидаемого IP.

## Обзор

Анализ устройства и IP добавляет теги предупреждений в `ip_analyses[].warnings[]` при обнаружении подозрительного поведения устройства, сети или местоположения. Девять тегов имеют настраиваемое действие (Отклонение / Проверка / Нет действия) для каждого узла сценария; два тега списка блокировки всегда принудительно устанавливают статус `Declined`, а два тега списка разрешений всегда носят информационный характер. Поле `log_type` каждого предупреждения отражает примененное действие: `error` (Отклонение), `warning` (Проверка) или `information` (Нет действия). Каждый риск срабатывает не более одного раза за сессию.

Каждый описанный ниже риск проверяется в реальном конвейере принятия решений; предупреждения содержат тег функции `LOCATION` и стандартную структуру [объекта предупреждения](https://docs.didit.me/ru/reference/data-models.md#объект-предупреждения).

Предупреждения о цифровом отпечатке устройства намеренно разделены на точные и восстановленные сигналы:

* `DUPLICATED_DEVICE_FINGERPRINT` означает, что один и тот же детерминированный идентификатор устройства (`match_source` `persistent_id` или `legacy_fp`) повторно использовался в сессиях с разными значениями `vendor_data`.
* `DEVICE_RECOVERED_HIGH_CONFIDENCE` означает, что восстановление отпечатка v2 сопоставило сессию с ранее зафиксированным устройством **после** изменения постоянного ID (очистка хранилища, режим инкогнито, переустановка приложения). Предупреждение появляется только тогда, когда совпадение превышает порог сходства для высокой уверенности и проходит жесткие критерии проверки.

![Пример предупреждений анализа устройства и IP в Didit с оповещениями об устройстве, VPN, прокси и несовпадении местоположения](https://mintcdn.com/didit-0f962782/z6T2GHM4Zh-iSj-K/images/ip-analysis-warning-example.png?fit=max\&auto=format\&n=z6T2GHM4Zh-iSj-K\&q=85\&s=370f87af45a6138ebd7454abe9131665)

## Формируемые предупреждения

| Риск | Причина | `log_type` | Влияние на статус | Рекомендуемые действия |
| - | - | - | - | - |
| `PRIVATE_NETWORK_DETECTED` | `is_vpn_or_tor` имел значение `true`: сессия была открыта через VPN, прокси или выходной узел Tor. Поле `additional_data` имеет значение `null`. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Решите, позволяет ли приемлемый для вас уровень риска маскированный трафик. Если вы его допускаете, оставьте «Без действия». |
| `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | ISO-код страны из документа, удостоверяющего личность, отличается от страны, определенной по IP-адресу. В `additional_data` передаются оба кода ISO-3: `document_country_code`, `ip_country_code`. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Отправляйте на проверку, если пользователь путешествует на законных основаниях. Отклоняйте при сочетании с сигналами об использовании VPN или дублирующегося устройства. |
| `EXPECTED_IP_ADDRESS_MISMATCH` | Сессия была создана с ожидаемым IP-адресом, но фактический IP отличается. В `additional_data` передаются `expected_ip_address` и `actual_ip_address`. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Используйте, если вы заранее фиксируете IP при создании сессии. Отклоняйте сессию или запрашивайте усиленную аутентификацию при несовпадении. |
| `IP_ADDRESS_IN_BLOCKLIST` | IP-адрес сессии совпадает с записью в списке блокировки IP приложения. `additional_data`: `ip_address`. | всегда `error` | Принудительно устанавливает статус `Declined`. | Отклоняйте сессию. При необходимости проверьте источник списка блокировки на наличие ложных срабатываний. |
| `DEVICE_FINGERPRINT_IN_BLOCKLIST` | Цифровой отпечаток устройства сессии совпадает с записью в списке блокировки устройств. `additional_data`: `device_fingerprint`. | всегда `error` | Принудительно устанавливает статус `Declined`. | Отклоняйте сессию. |
| `IP_ADDRESS_IN_ALLOWLIST` | По IP-адресу сессии обнаружены дубликаты, но он находится в списке разрешений IP приложения, поэтому предупреждение о дублирующемся IP было пропущено. `additional_data`: `ip_address`. | всегда `information` | Нет. | Используйте для доверенных корпоративных NAT, тестовых сетей (QA) или известных общих точек доступа. |
| `DEVICE_FINGERPRINT_IN_ALLOWLIST` | Для цифрового отпечатка устройства сессии обнаружены детерминированные совпадения с дубликатами, но он находится в списке разрешений устройств, поэтому предупреждение о дублирующемся устройстве было пропущено. `additional_data`: `device_fingerprint`. | всегда `information` | Нет. | Используйте только для доверенных общих устройств. Списки блокировки по-прежнему имеют приоритет. |
| `DUPLICATED_IP_ADDRESS` | Тот же IP использовался в другой сессии с другим `vendor_data`. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`. Пропускается, если IP находится в списке разрешений. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Обычное явление для корпоративных или общих NAT. Прежде чем отклонять, сопоставляйте с другими сигналами (дубликат устройства, несовпадение страны). |
| `DUPLICATED_DEVICE_FINGERPRINT` | Один и тот же детерминированный идентификатор устройства повторно использовался в сессиях с разными `vendor_data`. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`persistent_id` или `legacy_fp`). Пропускается, если отпечаток находится в списке разрешений. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Веское свидетельство злоупотребления с созданием нескольких аккаунтов. Отправляйте на проверку или отклоняйте в зависимости от допустимого уровня мошенничества. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Модель восстановления устройств v2 с высокой уверенностью сопоставила сессию с ранее наблюдавшимся устройством, даже после смены постоянного идентификатора. `additional_data`: `duplicated_session_id`, `duplicated_session_number`, `api_service`, `match_source` (`recovered_high`), `recovery_similarity`, `recovery_match_device_uuid`. Не подавляется списком разрешений устройств. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Начните с «На проверку», измерьте долю ложных срабатываний, затем ужесточите действие. Четкий сигнал о попытках сброса хранилища или использования режима инкогнито. |
| `DEVICE_LINKED_TO_LIVENESS_ATTACK` | То же устройство (сопоставленное по постоянному ID устройства) использовалось в более ранней сессии другого пользователя, съёмка которого при проверке живости была расценена как атака. Устройство, ранее использовавшееся для атаки на проверку живости, служит серьезным индикатором того, что текущий захват исходит от того же злоумышленника. `additional_data`: `liveness_attack_session_id`, `liveness_attack_session_number`, `liveness_attack_sessions_count`, `match_source` (`persistent_id`). | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Начните с «На проверку» и измерьте долю ложных срабатываний, прежде чем ужесточать действие до «Отклонить». |
| `DEVICE_MODEL_INCONSISTENT` | То же устройство (сопоставленное по постоянному ID устройства) в более ранней сессии определялось как другая модель устройства. Одно физическое устройство не меняет модель, поэтому переданная модель, скорее всего, подделана (спуфинг) или идентификатор устройства был скопирован на другое устройство. Типовые строки моделей никогда не сравниваются. `additional_data`: `device_model`, `earlier_device_model`, `earlier_session_id`, `earlier_session_number`, `match_source`. | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Без действия). | Прежде чем предпринимать действия, сравните две переданные модели и изучите более раннюю сессию. |
| `IP_LOCATION_NOT_ALLOWED` | Геозонирование по IP включено, и IP-адрес сессии находится в стране или штате/регионе, отмеченном как недопустимый. `additional_data`: `ip_country_code` (ISO-3), `ip_country`, `ip_state`, `restricted_by` (`country` или `state`). | соответствует настроенному действию | Настраивается: Отклонить / На проверку / Без действия (по умолчанию: Отклонить). | Используйте для соблюдения юрисдикционных ограничений. Объединяйте с `vpn_detection_action`, чтобы маскированный трафик не мог обойти геозону. |

Когда у восстановленного устройства еще нет подходящих связанных сессий (и в `matches[]` ничего не попадает), `DEVICE_RECOVERED_HIGH_CONFIDENCE` все равно срабатывает с резервной структурой `additional_data`: `recovery_match_device_uuid`, `recovery_match_similarity`, `recovery_match_band`, `recovery_gate_reason`.

Предупреждение `IP_LOCATION_NOT_ALLOWED` срабатывает, когда включено геозонирование по IP (`is_ip_geofencing_enabled`), а IP-адрес сессии находится в стране или штате/регионе, отмеченном как недопустимый в `ip_geofencing_by_country`. Поле `additional_data` содержит `ip_country_code` (ISO-3), `ip_country`, `ip_state` и `restricted_by` (`country` или `state`). Записи штатов/регионов переопределяют флаг страны и сопоставляются без учета регистра с названием региона поставщика IP (например, `"California"`); страны, не указанные в конфигурации, разрешены.

## Целостность устройства и среды выполнения

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

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

| Риск | Причина | Ключ конфигурации | По умолчанию |
| - | - | - | - |
| `DEVICE_APP_TAMPERED` | Платформенная аттестация не смогла подтвердить, что запрос поступил от подлинной, немодифицированной сборки приложения на настоящем устройстве. | `device_app_tampered_action` | `NO_ACTION` |
| `DEVICE_RUNTIME_HOOKING_DETECTED` | В процессе приложения обнаружен фреймворк для динамического анализа или перехвата вызовов (Frida, Xposed, LSPosed, Substrate). | `device_hooking_action` | `NO_ACTION` |
| `DEVICE_ROOTED_OR_JAILBROKEN` | На устройстве обнаружены признаки root или jailbreak, которые отключают механизмы защиты операционной системы, предотвращающие перехват камеры. | `device_rooted_action` | `NO_ACTION` |
| `DEVICE_EMULATOR_DETECTED` | Сессия была запущена из эмулятора или симулятора, а не с физического устройства. | `device_emulator_action` | `NO_ACTION` |
| `DEVICE_DEBUGGER_ATTACHED` | Во время верификации к приложению был подключен отладчик или трассировщик процессов. | `device_debugger_action` | `NO_ACTION` |
| `AUTOMATION_FRAMEWORK_DETECTED` | Сессия управлялась фреймворком автоматизации браузера или headless-браузером, а не человеком. | `automation_detected_action` | `NO_ACTION` |
| `DEVICE_INTEGRITY_SIGNALS_MISSING` | Клиент сообщил версию SDK с поддержкой сигналов целостности, но сами сигналы не поступили — это может указывать на то, что они были удалены при передаче. | `device_integrity_missing_action` | `NO_ACTION` |

> [!NOTE]
>
> Каждая проверка выполняется по возможности. Если проверку невозможно выполнить, возвращается статус **not determined**, а не результат без признаков нарушений, поэтому сбой проверки никогда не приводит к ложному срабатыванию в отношении легитимного пользователя. Сигналы передаются начиная с нативного SDK версии **4.4.0**; сессии из более ранних версий SDK корректно ничего не отправляют и никогда не вызывают предупреждение `DEVICE_INTEGRITY_SIGNALS_MISSING`.

> [!WARNING]
>
> Сигналы root и эмулятора часто встречаются у легитимных пользователей на модифицированных устройствах, не связанных с мошенничеством. Начните с действия Review вместо Decline и отслеживайте собственный процент отклонений, прежде чем ужесточать правила.

## Настраиваемые параметры

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

| Параметр | Управляет | По умолчанию |
| - | - | - |
| `vpn_detection_action` | `PRIVATE_NETWORK_DETECTED` | Без действия |
| `ip_mismatch_action` | `COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP` | Без действия |
| `expected_ip_mismatch_action` | `EXPECTED_IP_ADDRESS_MISMATCH` | Без действия |
| `duplicated_ip_action` | `DUPLICATED_IP_ADDRESS` | Без действия |
| `duplicated_device_action` | `DUPLICATED_DEVICE_FINGERPRINT` | Без действия |
| `recovered_device_action` | `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Без действия |
| `device_liveness_attack_history_action` | `DEVICE_LINKED_TO_LIVENESS_ATTACK` | Без действия |
| `device_model_inconsistency_action` | `DEVICE_MODEL_INCONSISTENT` | Без действия |
| `ip_geofencing_action` | `IP_LOCATION_NOT_ALLOWED` | Decline |

Белые списки IP-адресов и устройств подавляют только предупреждение о дублировании IP для значения из белого списка или предупреждение о детерминированном дублировании устройства для значения из белого списка. Они не подавляют предупреждения о VPN/прокси, несовпадении стран, несовпадении ожидаемого адреса, восстановленном устройстве или наличии в списке блокировки.

Предупреждения о восстановленном устройстве полезны для обнаружения мошеннических групп, которые чередуют аккаунты и сессии с одного и того же оборудования, но Didit консервативен по своей архитектуре: система скорее не выявит некоторых дублирующихся пользователей, чем объединит несвязанные устройства при недостатке убедительных доказательств. **Рекомендуемый порядок внедрения**: начните с действия Review, отслеживайте объем в течение двух недель, а затем ужесточите действие, если уровень ложных срабатываний остается низким.

## Дубликат устройства и восстановленное устройство

Относитесь к этим двум предупреждениям по-разному — они срабатывают на основе разных данных:

| Предупреждение | Триггер | Типичное значение | Рекомендуемое первое действие |
| - | - | - | - |
| `DUPLICATED_DEVICE_FINGERPRINT` | Точное совпадение постоянного идентификатора устройства (`persistent_id`) или устаревшего хэша цифрового отпечатка (`legacy_fp`). | Веское доказательство того, что одно и то же устройство используется разными пользователями. | Review или Decline, в зависимости от допустимого для вас уровня мошенничества. |
| `DEVICE_RECOVERED_HIGH_CONFIDENCE` | Восстановление v2 с высокой степенью уверенности (`recovered_high`) после изменения хранилища, сессии или идентификатора приложения. | Сильный сигнал о попытках использования режима инкогнито, очистки хранилища или переустановки приложения. Намеренно вынесено отдельно, чтобы вы могли отслеживать его независимо. | Сначала Review, затем ужесточите действие после оценки доли ложных срабатываний. |

## Совпадения между сессиями

Когда один и тот же IP-адрес, точный идентификатор устройства или восстановленное устройство обнаруживаются в сессиях, принадлежащих **разным пользователям**, Didit фиксирует их как `matches[]` в `ip_analyses[]`. Сессии группируются по `vendor_data`: сессии с одинаковым `vendor_data` считаются принадлежащими одному пользователю и исключаются из совпадений. Без `vendor_data` каждая сессия рассматривается как отдельный уникальный пользователь, и отображаются все потенциальные дубликаты — мы настоятельно рекомендуем всегда передавать `vendor_data`, чтобы уменьшить уровень шума.

Каждое совпадение включает в себя:

* `session_id`, `session_number`, `vendor_data` и `verification_date` совпадающей сессии, а также её статус жизненного цикла `status` и `api_service` (`null` для сессий сценариев); `source` всегда равен `session`
* `match_type` — `ip_address` или `device_fingerprint`
* `match_source` — `ip_address`, `persistent_id`, `legacy_fp` или `recovered_high`
* `matched_value` — общий IP-адрес, идентификатор устройства или (для восстановленных совпадений) UUID восстановленного устройства
* `confidence` (0–1, `1 - P(false positive)`) и `match_mode` (`deterministic` / `probabilistic` / `co_occurrence`)
* `device_info` — `device_brand`, `device_model`, `browser_family`, `os_family`, `platform`, `device_fingerprint`
* `location_info` — `ip_address`, `ip_country`, `ip_country_code`, `ip_state`, `ip_city`, `is_vpn_or_tor`, `is_data_center`
* Дополнительные поля для восстановленного устройства, если `match_source` имеет значение `recovered_high`: `recovery_similarity`, `tls_ja4_corroborated`, `recovery_gate_reason`

Количество совпадений по IP и совпадений по устройствам ограничено пятью для каждого типа (не более 10 записей всего). Полную схему совпадений и модель уверенности см. на [странице отчёта](https://docs.didit.me/ru/core-technology/ip-analysis/report-ip-analysis.md#семантика-совпадений).

## Примеры

### VPN + несоответствие страны (настроено на проверку)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "PRIVATE_NETWORK_DETECTED",
      "additional_data": null,
      "log_type": "warning",
      "short_description": "Private network (VPN/Tor) detected",
      "long_description": "The system detected that the user tried to use a private network (VPN/TOR) to complete the verification process.",
      "node_id": "ip-1"
    },
    {
      "feature": "LOCATION",
      "risk": "COUNTRY_FROM_DOCUMENT_DOES_NOT_MATCH_COUNTRY_FROM_IP",
      "additional_data": { "document_country_code": "ESP", "ip_country_code": "NLD" },
      "log_type": "warning",
      "short_description": "Document country does not match IP country",
      "long_description": "The country from the document does not match the country from the IP address, suggesting a potential mismatch between the document and the user's location.",
      "node_id": "ip-1"
    }
  ]
}
```

### Обнаружение в списке блокировки (принудительное отклонение)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "IP_ADDRESS_IN_BLOCKLIST",
      "additional_data": { "ip_address": "45.61.20.5" },
      "log_type": "error",
      "short_description": "IP address in blocklist",
      "long_description": "The IP address used for this session was found in the application's IP blocklist, indicating a known suspicious or forbidden origin.",
      "node_id": "ip-1"
    }
  ]
}
```

### Восстановленное устройство с высокой уверенностью (настроено на проверку)

```json theme={null}
{
  "warnings": [
    {
      "feature": "LOCATION",
      "risk": "DEVICE_RECOVERED_HIGH_CONFIDENCE",
      "additional_data": {
        "duplicated_session_id": "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
        "duplicated_session_number": 5101,
        "api_service": null,
        "match_source": "recovered_high",
        "recovery_similarity": 0.9874,
        "recovery_match_device_uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
      },
      "log_type": "warning",
      "short_description": "Device matches a previously seen device with high confidence",
      "long_description": "A previously seen device matched this session with high confidence through v2 fuzzy fingerprint recovery after passing strict hard gates, indicating the same physical device under a fresh persistent_id.",
      "node_id": "ip-1"
    }
  ]
}
```

## Связанные разделы

* [Отчёт анализа устройства и IP](https://docs.didit.me/ru/core-technology/ip-analysis/report-ip-analysis.md) — полная структура ответа и семантика статусов
* [Обзор анализа устройства и IP](https://docs.didit.me/ru/core-technology/ip-analysis/overview.md) — что измеряет каждый блок
* [Модели данных — Анализ IP](https://docs.didit.me/ru/reference/data-models.md#анализ-ip) — каноническая схема
* [Webhooks](https://docs.didit.me/ru/integration/webhooks.md) — событие `status.updated` передаёт предупреждения анализа IP

### Типы предупреждений


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.