Антифрод-стек выдачи Яндекса [08/2026] v1.0

v1.0 — 08/2026
только сторона детекта

Базис reverse-engineering · антифрод

Антифрод выдачи Яндекса Справочник факторов детекта: что и как измеряется, чтобы отличить живого пользователя от автоматики

Разбор двух реальных скриптов Яндекса — серпового трекера watch_serp.js и антибот-фингерпринтера @yandex-lego/powaas. Ниже — каталог сигналов, которые оборона снимает на каждом слое, и вывод, который она из отклонений делает.

ИСТОЧНИКИ · 2 скрипта СТОРОНА · детект ФОРМАТ · табличный реестр
i

Документ описывает только сторону детекта

Легенда происхождения

[код]подтверждено прямо в коде watch_serp.js.
[общее]устоявшееся знание по антифроду/ПФ; из кода напрямую не выводится, приведено для полноты.
[powaas]подтверждено в антибот-фингерпринтере @yandex-lego/powaas (FingerprintJS-based, обфусцированный бандл).

Как устроена оборона сейчас

Современный антифрод Яндекса — не разовая проверка, а непрерывный процесс без чёткого начала и конца: правила накладываются друг на друга и меняются постоянно. Устроен он послойно и работает по принципу накопления доверия (траста) к сессии, а не по одному стоп-фактору.

На входе оценивается сеть — траст к IP и подсети. Дальше сверяется отпечаток устройства: у антифрода есть внутренняя база «доверенных» фингеров, с которой сравнивается текущий. Параллельно снимается поведение в выдаче и собирается фингерпринт через отдельный антибот-модуль (@yandex-lego/powaas). Итог — не бинарный «бот/не бот», а накапливаемый вес доверия к профилю, который может и обнуляться.

Ключевой сдвиг последнего времени — переход от прямых блокировок (ошибки 429) к экономическому давлению через proof-of-work: при низком трасте клиент заставляют выполнять всё более тяжёлые вычисления. Отсюда рост капчи и нагрузки на CPU. То есть защита теперь бьёт не столько по факту доступа, сколько по стоимости массовых сессий — это и есть смысл слоёв ниже.

Эшелон обороны

Антифрод — не одна стена, а решётка независимых слоёв: от происхождения трафика и отпечатка устройства до поведения, кликов и агрегатной статистики. Сигнал проходит их по порядку, вес подозрительности копится, и решение — капча, лимит или обесценивание клика — принимается по совокупности, а не по одному признаку. Ниже разобран каждый слой: что он проверяет и зачем.

01Сетевой / IP-слойдо JS 02Окружение и фингерпринт устройствакто/что 03Детект автоматизацииbot? 04Идентичность и репутация сессиидоверие 05Поведенческие сигналыестественность 06Клики и удовлетворённостьядро ПФ 07Запрос и структура сессиипаттерн 08Агрегатные и временные аномалииcross-session 09Серверный вердикт и инфраструктурарешение
01

Сетевой / IP-слой

источник: общее + powaas (WebRTC)

Самый ранний рубеж — на уровне соединения, ещё до исполнения JS. Здесь антифрод смотрит не на поведение, а на происхождение запроса: откуда он пришёл и можно ли доверять источнику. Оценивается тип адреса и репутация подсети, а также согласованность IP с таймзоной и языком. Отдельно — WebRTC/STUN: он вскрывает реальный адрес за NAT, поэтому попытка спрятаться за прокси видна как рассинхрон реального и заявленного IP.

Ваши данныеВаш реальный IP и примерная геолокация, ваш интернет-провайдер. WebRTC способен раскрыть настоящий адрес даже при включённом VPN.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Траст IP / подсетиТип адреса (датацентр vs резидентный/мобильный), ASN, история запросов с подсетиНизкий траст источника порог доверия резко растёт[общее]
Прокси / VPNПризнаки анонимизации соединенияСкрытие реального адреса рост подозрительности[общее]
Гео-согласованностьСовпадение IP-гео с языком, таймзоной, региономРассинхрон гео и окружения флаг[общее]
Частота с адресаПлотность запросов с одного IPНенормальный ритм лимитирование/капча[общее]
WebRTC / STUNРеальный IP за NAT через STUN (stun4.l.google.com)Реальный адрес ≠ IP соединения детект VPN/прокси[powaas]
02

Окружение и фингерпринт устройства

источник: watch_serp.js + powaas

Способ узнать устройство даже без кук. Скрипт снимает десятки признаков — экран, GPU, canvas, аудио, набор шрифтов, сенсоры, локаль — и сворачивает их в единый хеш. Антифрод сравнивает этот отпечаток со своей базой, и важна не только уникальность, но и внутренняя непротиворечивость: реальные устройства согласованы между собой, а эмуляция часто противоречит сама себе (например, GPU говорит одно, а платформа — другое).

Ваши данныеПочти уникальный «слепок» вашего устройства (экран, видеокарта, шрифты, звук). Позволяет узнавать вас между сайтами и в инкогнито — вообще без кук.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
hidv2Аппаратный отпечаток (асинхронный хеш), цепляется к хитуУзнавание без кук; несогласованность отпечатка флаг[код]
GPU / WebGL (gpu-get)Данные видеокарты и рендерера«Пустые»/софт-рендер значения подозрение на эмуляцию[код]
Экран и вьюпорт (sr)Разрешение, глубина цвета, devicePixelRatioНереалистичные комбинации флаг[код]
Платформа / языкиplatform, navigator.languagesНесогласованность с гео/таймзоной флаг[код]
Таймзона (z)Смещение часового поясаКонфликт с IP-гео и языком флаг[код]
Поддержка фичКуки, тач-флаг, возможности APIПрофиль «слишком чистый» подозрение[код]
Согласованность фингерпринтаСовпадение всех признаков между собойВнутренние противоречия сильный сигнал автоматизации[общее]
Canvas 2DРендер и toDataURL 2D-контекстаТиповой хеш эмулятора флаг[powaas]
WebGL расширенноgetParameter VENDOR/рендерер, getExtension, ошибки контекстаСофт-рендер/подставной GPU подозрение[powaas]
Аудио-фингерпринтOfflineAudioContext, getChannelDataАномалия рендера звука различающий признак[powaas]
Энумерация шрифтовmeasureText + инъекция скрытых элементовНетипичный набор шрифтов флаг[powaas]
Согласованность локалиIntl.DateTimeFormat.resolvedOptions, offsetКонфликт локали/таймзоны/языка флаг[powaas]
Расширенные сенсорыenumerateDevices, bluetooth, permissions, голоса TTS, ориентация«Пустой» набор подозрение на эмуляцию[powaas]
Fullscreen-префиксыfullscreenElement и вендорные webkit/mozРассинхрон движка с UA флаг[powaas]
Адблок / фильтр-листыСкрытие известных рекламных селекторовКакие фильтры активны доп. признак[powaas]
Архитектура сбораfactorCollectorshashBinaryВсе факторы сворачиваются в единый отпечаток-хеш[powaas]
03

Детект автоматизации

источник: watch_serp.js

Проверки уже внутри запущенного браузера: ищутся следы, которые оставляют фреймворки автоматизации (WebDriver, Selenium, headless). Ключевая деталь — вердикт не бинарный: скрипт выставляет уровень подозрительности, который дальше складывается с остальными слоями, а не сразу блокирует.

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

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Свойства WebDriverНаличие __webdriver_evaluate, __selenium_evaluate и родственныхПрисутствие признак фреймворка автоматизации[код]
navigator.webdriverСтандартный флаг автоматизацииtrue прямой признак управляемого браузера[код]
Набор признаковСверка со списком selenium/webdriver/driverСовпадение флаг[код]
Headless-режимДетект HeadlessChromeПризнаки headless подозрение[код]
Градация вердиктаИтог кодируется степенью (0/1/2/4)Не «да/нет», а уровень подозрительности[код]
Служебные краулерыДетект Mediapartners-Google и т.п. по UAОтделение легальных ботов от пользовательских сессий[код]
04

Идентичность и репутация сессии

источник: watch_serp.js

Насколько сессия узнаваема и «обжита»: есть ли история, устойчивое состояние в хранилищах и связи с внешним id-графом через синхронизацию кук с партнёрами. Свежий профиль без истории и связей вызывает меньше доверия, чем аккаунт с прошлым.

Ваши данныеВаши идентификаторы и связи с сервисами-партнёрами. Именно здесь поисковое поведение сшивается в общий профиль о вас.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Куки / yandexuidНаличие и возраст идентификаторов«Свежая» сессия без истории меньше доверия[код]
ХранилищаlocalStorage, indexedDB как устойчивое состояниеЧистое состояние на «старом» устройстве рассинхрон[код]
Cross-partner syncСверка id с партнёрами (match.html, image-check)Отсутствие связей анонимность/подозрение[код]
Репутация аккаунтаЗалогинен ли, история поведения аккаунта«Пустой» аккаунт повышает порог; доверенный — снижает[общее]
05

Поведенческие сигналы

источник: watch_serp.js

Поведение оценивается на естественность: значим не факт клика, а то, как человек к нему шёл — траектория курсора, паузы «прочтения», глубина и характер скролла. Скрипт способен записывать сессию целиком (session replay), маскируя чувствительные поля. Идеально ровные тайминги и прямые «телепортные» траектории выдают автоматику.

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

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Траектория курсораmousemove: путь, скорость, микропаузы до кликаПрямые/телепортные траектории неестественность[код]
Hover над сниппетамиНаведения без клика (desktop)Полное отсутствие hover при кликах флаг[код]
Тач-поведениеtouch*, координаты тапа, инерция скролла (mobile)Идеально ровные жесты/тайминги подозрение[код]
СкроллГлубина относительно pageHeight, скорость, ориентацияКлик без прокрутки к элементу флаг[код]
Тайминги между действиямиПаузы «прочтения», ритм взаимодействияСлишком стабильные/машинные интервалы неестественность[код]
Клавиатура / копированиеkeydown/up, copyАномальные паттерны ввода сигнал[код]
Session replayЗапись сессии чанками wv-part (пароли/карты маскируются)Полная картина сессии для оценки «живости»[код]
Видимость вкладкиvisibilitychange, focus/blurАктивность в невидимой вкладке флаг[код]
06

Клики и удовлетворённость

источник: watch_serp.js

Ядро поведенческих факторов. Клик логируется через редирект с привязкой к запросу и позиции. Но вес клика определяется тем, что происходит дальше: быстрый возврат в выдачу (pogosticking) обесценивает его, а завершение сессии на результате читается как удовлетворённость. Аномальный CTR относительно ожидаемого для позиции — отдельный сильный сигнал.

Ваши данныеЧто вы искали, по какому результату кликнули и насколько он вас устроил — то есть ваши интересы и намерения.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Клик + позицияЛогирование через /clck/jsredir (from, etext, state, uuid)Связка запрос→позиция→URL→момент сессии[код]
CTR по позицииКликабельность относительно ожидаемой для местаАномально высокий CTR на низкой позиции сильный флаг[общее]
Возврат к выдачеБыстрый возврат в SERP после клика (pogosticking)Результат не удовлетворил минус сайту[код]
Dwell timeВремя между кликом и возвратомКороткий dwell неудовлетворённость[общее]
Последний кликНа каком результате завершилась сессияМаркер «нашёл, что искал»[общее]
Распределение кликовРазброс кликов по выдаче в потоке сессийКонцентрация на одном URL неестественный паттерн[общее]
07

Запрос и структура сессии

источник: общее

Антифрод смотрит не только на отдельный клик, но и на форму всей сессии. Живой поиск имеет контекст: уточнения, разные формулировки, переходы. Массовые заходы по одному идеально точному ключу без вариаций и «плоские» сессии без предыстории — характерный машинный паттерн.

Ваши данныеТексты ваших запросов и логика поиска — прямое отражение того, что вам интересно прямо сейчас.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
ПереформулировкиУточняет ли пользователь запросЕстественная доработка vs шаблонный точный вход[общее]
Поисковая сессияПоследовательность запросов и переходов«Плоские» сессии без контекста подозрение[общее]
Точность запросаЗаход по идеально точному ключу без вариацийМассовый вход по одному ключу паттерн накрутки[общее]
Источник входаПрямой заход на выдачу vs органический путьАномальные источники сессий флаг[общее]
08

Агрегатные и временные аномалии

источник: общее

Даже безупречная отдельная сессия проявляется на массе — здесь работает статистика. Всплески объёма по запросу или URL, общий «почерк» у множества сессий, неестественная форма CTR-кривой и эффекты, которые не закрепляются во времени, видны только в агрегате и часто приводят к откату.

Ваши данныеВаше поведение в сравнении с массой и во времени. Отдельные записи обезличены, но общий паттерн всё равно различим.

ФакторЧто измеряетсяНа что указывает отклонениеПров.
Всплески объёмаРезкий рост кликов/сессий по запросу или URLНенормальная динамика флаг[общее]
СкоординированностьСхожесть поведения across многих сессийОбщий «почерк» у массы сессий сильный сигнал[общее]
Форма CTR-кривойСоответствие ожидаемому распределению по позициямИскусственно ровная/перевёрнутая кривая аномалия[общее]
Ретеншн-эффектДержится ли эффект во времениВсплеск без органического закрепления откат/пессимизация[общее]
09

Серверный вердикт и инфраструктура

источник: watch_serp.js + powaas

Где собирается итоговый вердикт и как гарантируется доставка сигнала. Отдельно стоит PoW (proof-of-work): вместо прямого бана подозрительная сессия получает вычислительную задачу, и чем выше подозрительность — тем она тяжелее. Это переносит нагрузку на клиент и бьёт по массовой автоматике не баном, а стоимостью.

Ваши данныеПередачу собранного на серверы Яндекса. Proof-of-work вдобавок расходует ресурсы вашего процессора.

КомпонентРольПров.
/clck/jsredirЛоггер кликов: запрос→позиция→URL, реферер зашифрован (etext)[код]
adstat.yandex.ru/trackAntifraud/stat-трекинг, привязка к сессии[код]
solid.ws (WebSocket)Real-time канал телеметрии[код]
SmartCaptchaБарьер при подозрении: вместо прямого бана — smart / слайд / текст-капча[общее]
Ретрай/надёжностьreqNum, retryReqs, wserrs — гарантия доставки даже при быстром уходе[код]
Proof-of-Work (powaas)Активный вычислительный челлендж; удорожает массовую автоматизацию[powaas]
Σ

Два скрипта — два уровня одной обороны

Вместе они закрывают больше, чем каждый по отдельности: один смотрит на поведение, другой — на подлинность.

watch_serp.js

зона: что делает пользователь

Трекер поведения на выдаче — клики, скролл, курсор, session replay, надёжная доставка сигнала.

@yandex-lego/powaas

зона: настоящий ли это пользователь

Антибот-фингерпринтер — факторы устройства (canvas/WebGL/audio/шрифты/сенсоры), реальный IP через WebRTC/STUN, proof-of-work.

  1. Сетевой детект не заканчивается на IP соединения. WebRTC/STUN вскрывает реальный адрес за NAT — VPN/прокси ловятся по рассинхрону, а не только по репутации подсети.
  2. Фингерпринт глубже, чем hidv2/gpu-get. Powaas добавляет аудио, canvas-2D, энумерацию шрифтов, сенсоры и согласованность локали — и сворачивает всё в единый хеш. Устройство опознаётся плотнее и без кук.
  3. Появляется активная защита, а не только пассивные измерения. Proof-of-work заставляет клиент считать: цена одной сессии растёт, что бьёт по массовости напрямую.

Провенанс. [код] — разбор watch_serp.js; [powaas] — антибот-фингерпринтер @yandex-lego/powaas (оба на момент анализа). Яндекс регулярно обновляет скрипты и серверную логику: отпечаток уже hidv2, PoW-модуль versioned.

[общее] — модель работы антифрода/ПФ, а не подтверждённые из кода детали. Оба файла жёстко обфусцированы: поверхности охарактеризованы по декодированным литералам и маркерам архитектуры, точная per-factor логика построчно не реконструировалась.

Документ описывает сторону детекта в аналитических целях.