惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
SegmentFault 最新的问题
A
About on SuperTechFans
NISL@THU
NISL@THU
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
小众软件
小众软件
博客园 - Franky
罗磊的独立博客
The Cloudflare Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
量子位
Hugging Face - Blog
Hugging Face - Blog
云风的 BLOG
云风的 BLOG
MongoDB | Blog
MongoDB | Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cyberwarzone
Cyberwarzone
C
CXSECURITY Database RSS Feed - CXSecurity.com
Project Zero
Project Zero
Security Latest
Security Latest
L
Lohrmann on Cybersecurity
AWS News Blog
AWS News Blog
The Hacker News
The Hacker News
I
Intezer
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Privacy International News Feed
月光博客
月光博客
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园_首页
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
The Last Watchdog
The Last Watchdog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как работает антибот в мобильном приложении Wildberries
slvABTOP (Wi · 2026-05-12 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение9 мин

Охват и читатели15

Кейс

Привет, Хабр! Меня зовут Денис Ульянов, я уже 12 лет в IT и последние полтора года руковожу командой Antibot в Wildberries.

До работы в WB я три года был на тёмной стороне и занимался продуктами по сбору данных из открытых источников. Нейтрально намекаю на парсеры :) Должен признать, этот опыт помогает мне отстреливать ботов на ресурсах WB.

Сегодня поделюсь, как моя команда сделала не только антибота, но и собственный парсер для атак на себя. Надеюсь, после публикации не произойдёт массовое нападение ботов!

Зачем Wildberries инвестирует в антибота

По нашим данным, до 60% трафика WB генерируют боты и парсеры. Это создаёт дополнительную паразитную нагрузку на инфраструктуру, и мы несём прямые финансовые потери. Когда же парсеры и боты автоматизируют бизнес-процессы и получают неконкурентное преимущество, мы несём репутационные потери.

Каких ботов-плохишей мы видим на радарах?

1. Рыночные парсеры. Массово парсят цены, остатки, карточки товаров, поисковую и каталожную выдачу, выдачу рекомендаций.

Зачем? Чтобы собрать максимум информации о WB как о конкуренте и узнать объём продаж, динамику роста ниш и категорий, размер скидки постоянного покупателя. В свою бытность на тёмной стороне я занимался именно этим типом парсинга, эта область мне хорошо знакома.

2. DDoS-активность. Боты нарушают работу ресурсов компаний, чтобы легитимные пользователи не смогли воспользоваться маркетплейсом.

3. Атаки на бизнес-логику. Боты хотят нам навредить переборами и массовыми попытками в чувствительных сценариях. Например, устроить перебор номеров телефонов в фиче аутентификации. Мы отправляем SMS с кодом, но вместо пользователя её получает бот. А компания вхолостую тратит деньги на отправку. Неприятно!

4. Автоматизация для получения преимущества. К примеру, селлеры используют автоматизацию, чтобы нечестным путём быстрее других забронировать слоты поставок.

Как атакуют мобильное API

Работа с парсерами на промышленной основе так или иначе приводит к взаимодействию с нашими ресурсами через бэкенд.

Слышу ваш немой вопрос: «Почему именно мобильное API?» Поделюсь двумя самыми весомыми причинами, и перейдём к атакам.

Во-первых, мобильные эндпоинты в REST API, как правило, хорошо структурированы: понятно, какие параметры нужно передавать и какой ответ возвращается. Формат JSON компактнее, легче читается и значительно удобнее для машинной обработки, чем HTML и парсинг через регулярные выражения. Мои соболезнования всем, кто этим занимался. Я понимаю, как это больно.

Во-вторых, у мобильного API есть «хвост» обновлений. Когда пласт пользователей остаётся на старых версиях приложения, мы должны сохранять обратную совместимость, чтобы не потерять эту аудиторию.

Цепочка атаки на мобильное API

Представим, что мы с вами хотим спарсить данные через мобильное API. Что будем делать?

Сначала перехватываем и анализируем трафик. Устанавливаем эмулятор Android или берём настоящий телефон, поднимаем рядом MITMproxy и заворачиваем трафик с устройства в прокси-сервер.

Далее разбираем протокол. Как взаимодействуют мобильное приложение и сервер? Какие запросы отправляются? С какими параметрами? Какие из параметров обязательные? Какая семантика у запросов?

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

И наконец — масштабируем. Добавляем параллельность запросов и бот‑инфраструктуру, чтобы наш парсер стабильно работал хотя бы несколько недель без ручного вмешательства, обходил механики защиты сайта и получал антибот-токен — ключ-подтверждение, что клиент является человеком.

Теперь мы знаем, как сделать парсер, который может получить и удерживать антибот-токен. Но что это значит для нашей защиты?

Клиент всегда прав лжёт. Мы только что убедились, что не можем доверять клиенту. Его можно эмулировать, взломать и запустить в неестественном окружении. Значит, критичные проверки должны быть на сервере.

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

Необходима серверная оценка риска и сегментация трафика. Мы должны разделять скучных (нормальных) клиентов и подозрительных, которые запущены в неизвестном окружении и, возможно, взломаны или скомпрометированы.

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

Как эволюционировал наш антибот

Архитектура антибота включает два больших компонента:

  1. Клиентская SDK-библиотека (в нашем случае Mobile Software Development Kit) для получения и продления антибот-токена.

  2. Сервер для валидации токена и оценки риска сессии.

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

  1. пропуск;

  2. усиленная проверка;

  3. блокировка;

  4. отзыв токена.

Мобильное приложение Wildberries отправляет запрос на защищаемый ресурс wildberries.ru и получает отказ в доступе из-за отсутствия антибот-токена. Тогда мобильное приложение запускает флоу получения антибот-токена через Antibot SDK. SDK возвращает токен в приложение, и запрос на защищаемый ресурс повторяется — на этот раз успешно. Мы проходим проверку и получаем доступ к wildberries.ru.

Делаем Web SDK внутри WebView за одну итерацию

Когда нашей команде поставили задачу сделать Mobile SDK для приложения WB, у нас в распоряжении уже был зрелый, обкатанный Web SDK для браузера. Поэтому мы срезали углы и для быстрого старта переиспользовали его в WebView, компоненте для просмотра веб-страниц в приложении.

Мы сделали первую версию за одну итерацию и без промедления отдали ее на интеграцию продуктовой команде. Через время команда вернулась с фидбеком. Неоспоримые плюсы — это быстрый выход в прод и сбор данных для следующей итерации.

Минус — на большой аудитории в продакшене возникали проблемы, связанные с WebView (неполноценный браузер со сложностями в диагностике).

Должен признаться, если бы я вернулся в прошлое и передо мной стояла та же задача, я бы снова выбрал WebView. Плюсы перевешивают минус!

Расскажу, что именно мы запускаем в WebView.

JS-челлендж: отпечаток устройства

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

Зачем нужен этап нормализации? Если не сегрегировать данные, получится шумный отпечаток, который будет мало отличаться от случайно сгенерированной строки. Это основная механика, но у нее есть и минусы. В том числе его можно подделать. Поэтому у нас есть и другие механики.

Proof of Work (PoW)

Те, кто знаком с блокчейнами, знают об этой механике. Суть PoW (доказательства выполнения работы) в том, что для получения токена клиент должен решить некую вычислительную задачу, которая подтверждает затрату ресурсов и повышает доверие к запросу. Мы просим клиента найти определённое количество хэшей, удовлетворяющих условиям.

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

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

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

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

Кроме того, PoW не всемогуща: её эффект ограничен против атакующего с мощной инфраструктурой, которая на несколько порядков выше потребительского парка устройств. Поэтому мы сегментируем пользователей и используем механику точечно.

Переходим к адаптивным политикам

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

Теперь:

  1. Модель решений строится по уровню доверия к сессии. До скоринга мы проводим прескоринг и определяем первичный уровень доверия к устройству.

  2. Меньше проверок для легитимных сессий. Если устройство не вызвало сомнений, упрощаем или отменяем часть проверок.

  3. Больше челленджей и дополнительных проверок для подозрительных сессий. Усложняем получение токена для устройства с сомнительной репутацией.

Нативные платформенные проверки

Мудрость гласит: если ОС даёт тебе инструменты защиты, используй их.

Если смотреть верхнеуровнево, то, понимая логику работы одного инструмента, можно понять все три. Расскажу на примере Play Integrity API.

Приложение запрашивает проверочный токен у Play Integrity API → платформа возвращает токен с подписью → сервер проверяет валидность и привязывает результат к запросу или сессии → выбирается путь: 1) доверять без проверок; 2) выдать дополнительные задачи.

Продлеваем токен за хорошее поведение

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

Вот что мы добавили, чтобы изменить ситуацию:

  1. Продление токена для легитимных сессий. После выдачи токена анализируем сессию клиента на предмет аномалий. Если всё «чисто», в следующий раз флоу упрощается или токен выдаётся сразу без проверки.

  2. Не продлеваем токен и включаем усиленную проверку для «серых» клиентов. При подозрении, что токен был скомпрометирован и передан парсеру, мы отказываем в пролонгации и просим получить токен заново.

Таким образом мы снижаем число повторных проверок и ускоряем основные сценарии в приложении.

Как мы внедрили ML в антибот-решение

Машинное обучение используется в двух этапах.

Во-первых, решение челленджей. Когда устройство приходит за токеном, информация о нём очень ограничена. Изначально мы определяли легитимность запроса посредством «if» и эвристики, а потом поняли — хватит это терпеть! Внедрили ML-модель, и теперь она на основе данных решает, доверять ли пользователю.

Во-вторых, оценка поведения после получения токена. Это более интересный и сложный этап. Модель анализирует сессию клиента и в любой момент может сделать вывод, что поведение аномально и требуется отозвать токен. Даже если токен был добыт через сервисы прохождения челленджей, он выявляется и перестаёт приниматься.

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

Как мы размечаем датасет

Чтобы ML хорошо работала, её нужно хорошо обучить. Мы использовали для разметки датасета два подхода.

  1. Ручная разметка (не пренебрегайте этим на старте!). Команда Data Science вручную анализировала и кластеризовала логи, искала аномалии. После мы оценивали, похоже ли это на поведение реального пользователя или есть ли признаки компрометации.

  2. Интеграция с продуктовыми командами, использование ретроспективных данных. Вспомним пример с перебором номеров телефонов. В момент запроса на авторизацию невозможно определить легитимность, но постфактум можно посмотреть: был ли сделан вход по данному номеру телефона, сколько было повторных проверок и т. д. Так мы размечаем ретроспективные данные и с их помощью прокачиваем ML-модель под конкретные кейсы. Логи собираются регулярно, и модель непрерывно переобучается на новые векторы атаки. Если (и когда) появится новый тип ботов, мы точно научимся с ним бороться.

    RedTeam-подход: атакуем сами себя

    Термин RedTeam пришёл в IT из военной среды. Красной командой называют инженеров, которые имитируют хакерскую атаку на свою инфраструктуру для проверки устойчивости. У меня был полезный опыт работы с парсерами, и я хотел, чтобы моя команда инженеров также умела ставить себя на место атакующих.

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

    Что планируем внедрять в будущем?

    В целом все защитные механизмы сводятся к одному — увеличению стоимости атаки для злоумышленника:

    1. SSL Pinning: усложнение перехвата трафика и реверса. Для парсинга приложения нужно направить трафик в прокси-сервер и подменить корневой сертификат. Закрепление публичных сертификатов наших доменов препятствует этому. Если сертификат подменён (например, при атаке типа Man-in-the-Middle, «человек посередине»), приложение распознаёт ненадёжную сеть и разрывает соединение.

    2. Интеграции с продуктами: больше контекста для точной защиты. Мы прокачали ML-модель благодаря ретроспективным данным от продуктовой команды и планируем расширять этот опыт, потому что защита не должна развиваться в вакууме.

    3. Защищённый клиентский рантайм: сложнее модификация приложения. Мы не хотим, чтобы у злоумышленников была возможность модифицировать наше приложение для обхода защиты и майнинга токенов. Будем внедрять механики, которые этому препятствуют.

    Что нужно запомнить

    Во-первых, антибот в мобайле — это многоуровневая система, но ключевое решение всё равно принимает сервер.

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

    В-третьих, ML-модель и отзыв токенов помогают выявлять автоматизацию в динамике. Отслеживайте весь жизненный цикл пользователя, а не только выдачу токена.

    Задавайте вопросы в комментариях! Специалисты по парсингу, постарайтесь не сильно выдавать свой тёмный интерес :)